Saya bekerja dengan string besar yang membutuhkan banyak manipulasi.
Misalnya, saya dapat membuat string seperti ini:
Bagian 1
PerahuBagian A
PemrogramanBagian 2
Mempartisi perahu untuk pemrograman.Bagian AA
Bagian SQL Entri.
String akan terlalu besar untuk memeriksa secara manual setiap bagiannya. Sekarang saya perlu split
ini string
menjadi stringlist
bagian 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 Entries
keliru mendapatkan split)
Kalau tidak, yang bisa saya lakukan adalah menempatkan marker ketika saya membuat string awal:
🚤💻 Bagian 1
KapalBagian 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?
Jawaban:
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.
sumber
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:
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.
sumber
Jawaban yang diterima tampaknya telah melewatkan apa yang Anda tulis dalam komentar:
dan memberikan ini sebagai contoh:
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 generikfind
danreplace
, ataumap
operasi fungsional generik . Anda juga dapat menambahkan sesuatu sepertiJoinToString
operasi 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
for
loop 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).sumber
<
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.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.
sumber
Pertanyaan: Dari apa Anda "menghasilkan" string ini?
Apakah itu lebih mudah untuk dimanipulasi?
sumber
LaTeX
toSSML
interpreter, 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.