Apakah menempatkan penanda teks di dalam string adalah gaya yang buruk? Apakah ada alternatif?

10

Saya bekerja dengan string besar yang membutuhkan banyak manipulasi.

Misalnya, saya dapat membuat string seperti ini:

Bagian 1
Perahu

Bagian A
Pemrograman

Bagian 2
Mempartisi perahu untuk pemrograman.

Bagian AA
Bagian SQL Entri.

String akan terlalu besar untuk memeriksa secara manual setiap bagiannya. Sekarang saya perlu splitini stringmenjadi stringlistbagian demi bagian. Saya dapat memikirkan dua opsi:

Ekspresi Reguler:

QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));

Kelihatannya harus bekerja, tetapi kadang-kadang pengecualian lolos (IE: Section SQL Entrieskeliru mendapatkan split)

Kalau tidak, yang bisa saya lakukan adalah menempatkan marker ketika saya membuat string awal:

🚤💻 Bagian 1
Kapal

Bagian Program
Pemrograman

🚤💻Bagian 2
Mempartisi perahu untuk pemrograman.


Bagian 🚤💻 Bagian SQL Entri SQL.

Yang berarti pemisahan string akan menjadi mudah:

QStringList sl = s.split("🚤💻"));

Sesuatu mengatakan kepada saya bahwa tidak satu pun dari ini adalah gaya yang baik atau praktik pemrograman, tetapi saya sampai saat ini tidak membahasnya atau menemukan alternatif.

  • Jika Anda adalah manajer proyek saya, apakah Anda akan menerima salah satu dari metode ini?
  • Jika tidak, apa yang akan Anda sarankan untuk saya lakukan sebagai praktik terbaik?
Akiva
sumber
6
Jika program Anda tahu di mana harus menempatkan penanda ini, mengapa tidak membuat bagian sebagai string terpisah untuk memulai?
Jacob Raihle
Saya tidak berpikir pengguna penanda yang tidak diterjemahkan dengan baik ke pengkodean Anda saat ini adalah ide yang bagus.
Tulains Córdova
2
simbol yang sebenarnya digunakan sebagian besar tidak relevan, apa yang akan membuat perbedaan adalah tata bahasa dari hal yang Anda coba parse
jk.
4
@ Akiva apakah Anda yakin dengan kinerja yang baik? Anda sedang bekerja dengan jumlah data yang sama dalam hal apa pun, saya ragu akan ada perbedaan yang signifikan. Buat ribuan fungsi menjadi satu fungsi, aktifkan dalam satu lingkaran, dan lakukan beberapa pengukuran.
Jacob Raihle
2
@ Akiva Mengambil dan mengganti elemen dalam daftar paling tidak harus sebanding dengan memisahkan string besar.
Jacob Raihle

Jawaban:

17

Ini bukan praktik yang buruk untuk memiliki penyandian dokumen tertanam sebagai teks dalam sebuah string. Pikirkan penurunan harga, HTML, XML, JSON, YAML, LaTeX, dll.

Praktek yang buruk adalah menciptakan kembali roda. Daripada menulis prosesor teks Anda sendiri, pikirkan tentang menggunakan standar yang ada. Ada banyak perangkat lunak gratis yang banyak membantu Anda, dan banyak yang memiliki lisensi non-restriktif yang memungkinkan Anda menggunakan perangkat lunak tersebut dalam perangkat lunak milik Anda sendiri.

David Hammen
sumber
Dalam kasus saya, saya menciptakan roda, jika apa yang saya coba lakukan adalah membangun penerjemah unik untuk bahasa markdown. Sebagai contoh, salah satu proyek saya menafsirkan Lateks sebagai SSML yang dapat dibaca oleh telinga manusia: meta.wikimedia.org/wiki/Grants:IdeaLab/… . << Ada periode di akhir URL itu, jika tidak maka tidak akan berfungsi
Akiva
2
@ Akiva Saya harus bekerja dengan format teks khusus yang dikembangkan oleh tempat kerja saya yang benar-benar menemukan kembali roda. Saya harus memelihara 4 parser dalam 3 bahasa (Javascript, Java dan Objective-C) untuk itu, dan itu adalah mimpi buruk . Lakukan hal yang benar sekarang dan hapus nonsense format teks kustom ini . Saya tidak bisa cukup menekankan betapa besarnya mimpi buruk pemeliharaan ini akan menjadi beberapa tahun ke depan. Gunakan format terstruktur yang ada, XML, JSON, dll.
Chris Cirefice
@ ChrisCirefice Bisakah Anda memberi saya contoh bagaimana ini adalah mimpi buruk?
Akiva
1
@ Akiva Saya pikir fakta bahwa Anda harus mempertahankan satu parser (dalam kasus saya beberapa dan dalam berbagai bahasa) mengerikan. Format standar ada karena suatu alasan - mereka dapat mewakili data yang Anda inginkan - dan dengan sedikit usaha di pihak Anda, karena parser tersebut telah dibangun, disempurnakan, dan dipelihara. Format teks khusus juga merupakan pengetahuan yang sangat terspesialisasi, artinya biasanya hanya satu atau dua pengembang yang cukup akrab dengan format tersebut untuk berhasil memeliharanya. Itu harus berbicara banyak. Kebanyakan orang terbiasa dengan CML, JSON - sedikit yang tahu format khusus.
Chris Cirefice
1
@ Akiva Memang! Format penurunan harga (apa yang SE dan banyak situs lain gunakan untuk pemformatan teks) agak standar , seperti SQL. Tetapi ada banyak 'rasa' berbeda dengan ekstensi khusus (mis. Seperti SE). Ada perpustakaan standar yang mem-parsing 'inti', maka Anda memperluas perpustakaan jika Anda menginginkan fitur tambahan. Tetapi, membangun dan memelihara formatter Anda sendiri akan menggelikan - beberapa sudah ada (penurunan harga, kode BB, dll.), Jadi mengapa menciptakan kembali roda dan mempertahankan semua kode itu? Mungkin juga hanya menggunakan perpustakaan yang ada :)
Chris Cirefice
8

Menggunakan beberapa pemisah umum harus bekerja dengan baik ketika memisahkan string arbitrer yang lebih besar, tetapi saya akan merekomendasikan untuk tidak menggunakan simbol arbitrer. Seseorang yang membaca string itu sebagai plaintext bisa bingung, belum lagi masalah dengan UTF dan apakah simbol muncul di dalam bagian atau tidak.

Bagian terpenting dari ini adalah bahwa setiap bagian tetap utuh, sementara setiap "header bagian" perlu diidentifikasi dengan tepat.

Mengapa tidak menggunakan pemisah umum tetapi tetap dibaca? Sesuatu seperti:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

Masalahnya adalah memutuskan apa yang harus menjadi pemisah , karena harus ada sesuatu yang dijamin tidak muncul bagian apa pun. Anda selanjutnya dapat mengidentifikasi itu sebagai pemisah dengan mengharuskannya pada awal baris dan satu - satunya teks pada baris itu .

Tanpa pengetahuan lebih lanjut tentang teks apa yang diharapkan di setiap bagian, sulit untuk membuat rekomendasi tentang pemisah umum apa yang terbaik dalam kasus ini.

Erdrik Ironrose
sumber
Saya suka penekanan jawaban Anda pada keterbacaan. String dihasilkan melalui data yang dibuat oleh pengguna, misalnya, bahasa Markup yang digunakan dalam SE untuk menulis pertanyaan dan jawaban. Dengan demikian Anda dapat dengan mudah membayangkan jenis masalah manipulasi string apa yang bisa terjadi.
Akiva
5

Jawaban yang diterima tampaknya telah melewatkan apa yang Anda tulis dalam komentar:

Alasannya adalah bahwa banyak manipulasi yang saya lakukan memerlukan string penuh

dan memberikan ini sebagai contoh:

s.replace ("boat", "programming");

Jika itu yang Anda inginkan, itu IMHO ide yang sangat buruk untuk menggunakan beberapa "penurunan harga" atau pemisah teks untuk seluruh string Anda, ini selalu berisiko untuk mengganggu manipulasi dan tidak akan mengarah pada kode yang kuat. Terutama ketika Anda mencoba untuk mulai menggunakan ekspresi reguler pada string gabungan seperti itu, Anda mungkin akan mengalami masalah yang sama dengan yang diamati orang ketika mencoba mem-parsing HTLM atau XML dengan ekspresi reguler .

Terutama karena Anda menulis mungkin ada "ribuan fungsi [manipulasi]], risiko itu mungkin menjadi masalah nyata. Bahkan jika Anda menggunakan beberapa penurunan harga seperti XML untuk menyimpan daftar string secara internal, Anda perlu memastikan bahwa manipulasi hanya akan memproses konten, bukan penurunan harga, sehingga itu berarti membagi string menjadi beberapa bagian sebelum Anda melakukan pemrosesan, dan bergabung setelah itu lagi - sehingga yang akan memiliki risiko tinggi memberikan kinerja yang buruk.

Alternatif desain yang lebih baik di sini adalah menyediakan tipe data abstrak (gunakan kelas jika Anda suka), sebut saja MyStringList, dan sediakan sejumlah kecil operasi dasar yang memungkinkan Anda untuk menerapkan "ribuan fungsi" dalam hal operasi itu. Misalnya, mungkin ada operasi generik finddan replace, atau mapoperasi fungsional generik . Anda juga dapat menambahkan sesuatu seperti JoinToStringoperasi jika Anda benar-benar membutuhkan seluruh daftar dalam satu string untuk tujuan tertentu.

Dengan menggunakan operasi ini, ketakutan Anda bahwa kode menjadi lebih rumit karena "semuanya harus dilakukan dalam for for" menjadi tidak ada gunanya, karena satu-satunya forloop yang Anda dapatkan dienkapsulasi di dalam operasi datatype. Dan saya tidak akan khawatir tentang kinerja sampai Anda memiliki dampak kinerja yang nyata dan terukur (yang saya ragu Anda dapatkan jika Anda menerapkan operasi dasar dengan benar).

Doc Brown
sumber
Jengkel karena saya benar-benar membuat sesuatu seperti itu. Ini memungkinkan saya untuk mengatur tanda kurung kustom, <dan >, dan itu akan mengambil setiap contoh dari string di mana saya dapat dengan mudah menghapus instance yang tidak saya inginkan, dan memanipulasi dengan rapi seperti yang saya inginkan. Ini bagus karena ekspresi reguler sendiri tidak menangani substring seperti ini: <boat <programming>>nah di mana ada beberapa lapisan tanda kurung.
Akiva
1

Format yang dijelaskan sangat mirip dengan file INI:

https://en.wikipedia.org/wiki/INI_file

Dalam hal ini bagian tersebut diapit oleh tanda kurung siku [] sehingga apa yang Anda jelaskan masuk akal dengan menandai bagian tersebut dengan beberapa cara untuk menambahkan makna tambahan pada teks tersebut.

Jon Raynor
sumber
0

Misalnya, saya dapat membuat string seperti ini:

Pertanyaan: Dari apa Anda "menghasilkan" string ini?

Apakah itu lebih mudah untuk dimanipulasi?

Phill W.
sumber
String dihasilkan dari Datascraping konten pengguna dari situs web.
Akiva
1
Ini bukan cara yang dapat diandalkan untuk mengambil data dari situs web, hanya karena mereka berubah dan hal-hal bergerak atau hilang sama sekali. Anda akan jauh lebih baik mengambil data dari semacam API yang diterbitkan (dan karenanya dapat diandalkan). Selain itu, penggunaan banyak situs web komersial secara khusus melarang hal semacam ini.
Phill W.
Kadang-kadang saya tidak bisa memilih data apa yang berharga bagi saya, sehingga selalu ada kebutuhan untuk melakukan pemeriksaan integritas untuk apa yang Anda lihat, atau sekadar kompromi dan berharap yang terbaik. Sebagai contoh: Saya menulis a LaTeXto SSMLinterpreter, dan salah satu masalah adalah Anda dapat menghasilkan gambar yang identik dengan kode yang sangat berbeda, dan karenanya tidak mungkin menjadi konsisten jika pengguna memilih cara-cara yang buruk atau esoterik untuk menghasilkan formula-formulanya. Semua itu berarti pada akhirnya adalah bahwa orang yang tidak menggunakan praktik yang baik tidak akan memiliki interpretasi yang baik terhadap skrip mereka.
Akiva