Apakah char carriage-return dianggap usang

26

Saya menulis pustaka sumber terbuka yang mem-parsing data terstruktur tetapi sengaja mengabaikan deteksi carriage-return karena saya tidak mengerti intinya. Ini menambah kompleksitas dan overhead tambahan untuk sedikit / tanpa manfaat.

Yang mengejutkan saya, seorang pengguna mengirimkan bug di mana parser tidak berfungsi dan saya menemukan penyebab masalah adalah bahwa data menggunakan ujung garis CR yang bertentangan dengan LF atau CRLF.

Bukankah OSX telah menggunakan akhiran gaya LF sejak beralih ke platform berbasis unix?

Saya tahu ada aplikasi seperti Notepad ++ di mana ujung garis dapat diubah untuk menggunakan CR secara eksplisit tapi saya tidak melihat mengapa ada orang yang mau.

Apakah aman untuk mengecualikan dukungan untuk persentase yang tidak signifikan secara statistik dari pengguna yang memutuskan (untuk alasan apa pun) ke jajaran akhir gaya Mac OS?

Memperbarui:

Untuk memperjelas, mendukung akhir jalur Windows (yaitu CRLF) tidak memerlukan pengakuan token CR. Untuk tujuan efisiensi, lexer cocok dengan basis per-char. Dengan mengabaikan char CR secara diam-diam, token CRLF menyederhanakan ke LF. Dengan demikian, token CRLF sendiri dapat dianggap sebagai anakronisme sendiri tetapi bukan itu yang menjadi pertanyaan.

OS terakhir yang memberikan dukungan seluruh sistem untuk akhir baris gaya CR adalah Mac OS 9 . Ironisnya, satu-satunya aplikasi yang masih menggunakannya sebagai default di OSX adalah Microsoft Excel.

Evan Plaice
sumber
21
"Ini menambah kompleksitas dan overhead tambahan": Saya pikir kompleksitas tambahan dan overhead sangat kecil.
Giorgio
11
@ EvanPlaice bukankah akan mengurangi sakit kepala dan lebih banyak waktu untuk malas untuk hanya memasukkan dukungan CR yang Anda tinggalkan?
Pieter B
11
"Dalam hal bisnis, biaya peluang terlalu tinggi. Dalam istilah yang sederhana, saya lebih suka mencari alasan untuk membenarkan kemalasan saya daripada membuang-buang waktu menambahkan dukungan tepi-kasus untuk platform mati.": Dalam istilah bisnis, akan membutuhkan waktu lebih sedikit untuk mengimplementasikan dukungan untuk CR daripada mengirim pertanyaan di sini untuk menyelidiki relevansi fitur ini.
Giorgio
4
Kelemahan budaya @EvanPlaice adalah alasan yang sangat bagus.
Pieter B
5
@ EvanPlaice: Menulis pertanyaan ini sudah menghabiskan lebih banyak waktu daripada sekadar menyisipkan dukungan untuk CRbaris baru ke basis kode Anda. (... dan jika Anda yakin ini bukan masalahnya, desain parser Anda harusnya sangat sibuk)
ZJR

Jawaban:

37

Ada praktik yang baik di mana Anda "liberal dalam apa yang Anda terima, dan konservatif dalam apa yang Anda kirim" .

Dengan kata lain, jika ada kesempatan (betapapun kecilnya itu) bahwa seseorang akan memberi Anda akhiran garis cr (dan mengharapkannya bekerja dengan benar), Anda harus mendukungnya.

TBH, saya tidak bisa melihat bagaimana menambahkan dukungan CR akan memakan waktu selama itu.

Saat Anda melihat crdalam lexer, intip karakter berikutnya dan jika itu adalah nl, telusuri baris baru dan keluarkan token baris baru, jika karakter berikutnya bukan nlhanya memancarkan token baris baru dan melanjutkan.

ratchet freak
sumber
23
@ZJR: hukum postel berbahaya: berhati-hatilah saat menggunakan prinsip ketahanan, karena sering menjadi bumerang. Kekacauan pengelompokan html yang masih kita alami dapat dikaitkan dengan pola pikir itu. Ketika suatu program menerima input yang salah bentuk, perilakunya sebagai akibatnya segera menjadi diharapkan dan bergantung pada perilaku, dan setiap perubahan kemudian yang memperlakukan input yang salah bentuk secara berbeda, atau tidak sama sekali, sementara secara teknis benar, sering dianggap cacat.
whatsisname
4
@whatsisname: Saya tidak setuju. Saya pikir perangkat lunak berkualitas produksi harus kuat. Namun demikian, perkakas pengembangan harus sangat tidak mengandalkan ketahanan dan hanya menghasilkan keluaran yang valid. Kekacauan dalam html disebabkan oleh hampir dua dekade tooling yang buruk, bukan oleh kelonggaran browser.
back2dos
2
@ back2dos: _ _ jadi? tooling yang buruk disebabkan oleh kelonggaran browser.
amara
4
tooling yang buruk adalah hasil dari perang browser
ratchet freak
2
@ Dibbeke: Menangani input yang salah hanya memetakan ruang input yang lebih besar ke ruang state yang ada dan karenanya tidak berpengaruh padanya - asalkan perangkat lunak Anda memiliki pemisahan keprihatinan yang layak.
back2dos
21

Tidak. CR tidak usang (didefinisikan sebagai "tidak lagi diproduksi atau digunakan"). Anda sendiri telah memberikan bukti tentang itu. Ini mungkin tidak biasa , tetapi tidak usang .

Adapun "apakah aman untuk mengecualikan dukungan" untuk CR? Seperti yang Anda katakan, ini bukan masalah kehilangan penjualan, dan Anda tidak dapat mendukung setiap kombinasi karakter aneh dan format file di dunia, dan hanya Anda yang tahu perangkat lunak dan basis pengguna Anda. Jadi saya akan mengatakan bahwa akan lebih aman untuk mengecualikannya jika Anda yakin bahwa beban dukungan untuk tidak menambahkannya (seperti yang dijelaskan mouviciel) tidak melebihi beban waktu menambahkannya. Tetapi tanpa mengetahui lebih banyak tentang produk dan basis pengguna saya tidak yakin bagaimana menjadi lebih spesifik.

HappyCat
sumber
13
+1 - IMO, OP berusaha untuk memberi label CR sebagai "usang" sehingga ia memiliki alasan untuk tidak mendukungnya.
Stephen C
1
@StephenC Saya tidak berusaha menyembunyikan fakta itu. Ini tidak seperti saya benar - benar membutuhkan alasan, saya penulis dan dengan demikian memiliki keputusan akhir. Intinya, itu menimbulkan pertanyaan yang menarik.
Evan Plaice
18

Tentang kemalasan: Anda harus menyeimbangkan:

  • upaya mengubah kode sehingga CR ditangani dengan aman (dan kemudian lupakan).

  • upaya dalam menjelaskan kepada pengguna mengapa file yang mereka senangi selama beberapa dekade tiba-tiba membuat aplikasi Anda mogok, dalam menemukan solusi yang dapat mereka gunakan tanpa mengorbankan penjualan Anda dan dalam meminta argumen dan menjawab komentar di sini.

Terserah Anda untuk memutuskan jalan mana yang paling malas.

mouviciel
sumber
Poin yang bagus, dukungan pasti datang dengan biaya waktu. Untuk kasus khusus ini 'penjualan' bukan merupakan masalah (yaitu open source) tetapi perlu mempertimbangkan gambaran yang lebih besar. Demikian juga, saya juga bisa melempar pengecualian dalam kode ketika CR ditemukan menunjukkan karakter yang tidak valid / tidak didukung.
Evan Plaice
7
@ Evan: Tentu saja itu open source. Jika tidak, bos Anda akan memberi tahu Anda, "Saya tidak peduli bahwa 'tidak ada' yang menggunakan CR lagi! Pelanggan mengeluh. TETAPI!" : P Ini adalah hal besar tentang OSS yang membuatku kesal: kurangnya perhatian pada kasus nyata yang dikeluhkan pengguna. Apakah Anda pikir itu usang atau tidak, seseorang masih menggunakannya.
cao
1
karena ini open source, Anda dapat menulis surat terbuka untuk semua pengguna yang akan Anda terima tambalan untuk memperbaikinya.
rwong
1
@ EvanPlaice: Bahwa "perhatian adalah ... mata uang" itu berfungsi dua arah. Jika Anda ingin orang lain menggunakan aplikasi Anda, itu harus berfungsi, dan itu harus menyelesaikan masalah mereka. Aplikasi yang rusak tidak kebal terhadap kritik hanya karena gratis. Saya tidak mengatakan Anda harus melakukan semua yang diminta pengguna; Anda harus menolak permintaan keterlaluan. Tetapi jika Anda tidak menyelesaikan masalah pengguna nyata, Anda akhirnya kehilangan pengguna.
cao
1
@ EvanPlaice: Dan omong-omong, ketika saya maksud "mengeluh", maksud saya "mengajukan laporan bug yang menguraikan apa yang rusak dan bagaimana", bukan "mengeluh secara acak tentang seberapa buruk perangkat lunaknya".
cao
8

Apakah aman untuk mengecualikan dukungan untuk persentase yang tidak signifikan secara statistik dari pengguna yang memutuskan (untuk alasan apa pun) ke jajaran akhir gaya Mac OS?

Mungkin tidak terlalu banyak pengguna yang akan mendeteksinya, tetapi ada seekor gajah di ruangan itu: Windows line endings ( CRLF). Jika Anda mendukung itu (saya biasanya melakukannya, meskipun saya hanya menggunakan Windows untuk game), itu harus sepele untuk mendukung bagian ketiga dari segitiga Bermuda bersejarah ini.

Jika Anda tidak mendukung sesuatu seperti ini, Anda setidaknya harus menyebutkannya dalam dokumentasi (gaya "Ini bukan bug") dan cara mengubah file agar berfungsi dengan alat Anda dengan cara yang sesederhana mungkin ( dos2unixmisalnya).

l0b0
sumber
2
+1 untuk menyebutkan Windows menggunakan CRLF- ini adalah garis default yang berakhir pada OS itu. Dan tidak ada cara untuk menjamin sumber file .csv, sehingga dengan mudah bisa dibuat pada sistem Windows.
1
Menyebutkan CRLF di Windows tidak relevan karena jika Anda menangkap LF sebagai titik istirahat maka Anda akan secara otomatis mendapatkan CRLF sebagai bonus. OP mengetahui hal ini seperti yang Anda lihat dalam teks postingnya.
davidethell
@davidethell Yap, begitulah caranya. Saat ini, karakter CR diabaikan secara diam-diam. Meskipun gajah.
Evan Plaice
6

Ada banyak perangkat serial yang mengandalkan CRsebagai akhir dari aliran data sebelum ETXdikirim. Itu adalah konvensi yang tidak akan pernah hilang.

Brian
sumber
3

Saya akan memperlakukan permintaan tersebut sebagai permintaan fitur apa pun di mana Anda perlu mempertimbangkan biaya dibandingkan manfaatnya.

Jika tepatnya satu orang telah meminta dukungan CR, mungkin itu tidak perlu. Lihat bab buku di bawah ini dari 37 sinyal di mana mereka mengatakan Anda seharusnya hanya khawatir tentang permintaan fitur yang sangat populer.

http://gettingreal.37signals.com/ch05_Forget_Feature_Requests.php

Aaron Kurtzhals
sumber
1
Akhirnya, titik balik yang bagus. Jika saya dapat memilih dua jawaban, saya akan memilih yang ini juga.
Evan Plaice
1

MS OS dari MSDOS dan seterusnya menggunakan kombinasi CR + LF sebagai pemisah garis (saya pikir sebagian besar karena printer matriks yang membutuhkannya).

Jadi ya, itu mengecewakan, tetapi Anda masih membutuhkan dukungan untuk hal terkutuk itu.

linkerro
sumber