it-swarm-id.com

Bukankah "jika (0 == nilai) ..." lebih berbahaya daripada kebaikan?

Ini adalah salah satu hal yang paling saya benci ketika saya melihatnya di kode orang lain. Saya tahu apa artinya dan mengapa beberapa orang melakukannya dengan cara ini ("bagaimana jika saya tidak sengaja menempatkan '=' sebagai gantinya?"). Bagi saya itu sangat seperti ketika seorang anak menuruni tangga menghitung langkah dengan keras.

Bagaimanapun, inilah argumen saya yang menentangnya:

  • Itu mengganggu aliran alami membaca kode program. Kita, manusia, mengatakan "jika nilai adalah nol" dan bukan "jika nol adalah nilai".
  • Kompiler modern memperingatkan Anda ketika Anda memiliki tugas dalam kondisi Anda, atau sebenarnya jika kondisi Anda hanya terdiri dari tugas itu, yang, ya, tetap terlihat mencurigakan
  • Anda tidak boleh lupa untuk melipatgandakan '=' ketika Anda membandingkan nilai jika Anda seorang programmer. Anda mungkin lupa untuk menempatkan "!" saat menguji ketidaksetaraan.
50
mojuba

Ah, ya, "Yoda conditionals" ("Jika nilainya nol, jalankan kode ini Anda harus!"). Saya selalu menunjukkan siapa pun yang mengklaim mereka "lebih baik" pada alat-alat seperti serat (1). Masalah khusus ini telah dipecahkan sejak akhir 70-an. Kebanyakan bahasa modern bahkan tidak akan mengkompilasi ekspresi seperti if(x = 10), karena mereka menolak untuk memaksa hasil dari penugasan ke boolean.

Seperti yang orang lain katakan, itu jelas bukan masalah, tapi itu sedikit menimbulkan disonansi kognitif.

59
TMN

Itu menjengkelkan karena memberlakukan pajak mental yang kecil, tetapi nyata.

Orang membaca dari kiri ke kanan dalam hampir semua bahasa pemrograman (dan sebagian besar bahasa alami).

Jika saya melihat 123 == x, Cara saya menguraikannya secara mental adalah:

  • 123 - jadi apa? info tidak lengkap.
  • == - yah, 123 adalah 123, mengapa mengujinya ...
  • x - ok, jadi itu yang kami khawatirkan. Hanya sekarang saya memiliki konteksnya.
  • Kembali ke pertimbangan ulang 123 Dan mengapa x dibandingkan dengan itu.

Ketika saya melihat x == 123 Penguraian mental adalah:

  • x - Menyediakan konteks, saya tahu apa kondisinya. Saya dapat memilih untuk mengabaikan sisanya. Berdasarkan aliran sebelumnya saya punya ide bagus mengapa dan apa yang akan datang (dan terkejut jika itu berbeda).
  • == - Saya kira begitu.
  • 123 - Yup.

Gangguannya kecil (dalam contoh sederhana), tapi saya selal memperhatikannya.

Menempatkan nilai terlebih dahulu mungkin merupakan ide yang baik jika Anda ingin untuk menarik perhatiannya, mis. if (LAUNCH_NUKES == cmd). Biasanya ini bukan maksudnya.

56
dbkk

Berbahaya? Tidak. Ini bekerja dengan baik.

Praktek yang Buruk? Luar biasa, paling banter. Ini pemrograman defensif yang sederhana.

Layak kehilangan tidur? Tidak.

47
Wonko the Sane

Ini pada dasarnya adalah flaimbait.

Tidak, itu tidak lebih berbahaya daripada kebaikan. Sederhana.

Lebih banyak kata?

Argumen kompiler? Erm, ish, mungkin - jangan terlalu percaya pada penyusun untuk menyelamatkan Anda dari diri sendiri.

"Kamu tidak boleh lupa" - yah ya - tidak tentu saja kamu tidak boleh sementara aku lelah, aku sudah coding sepanjang hari aku harus menggunakan dua bahasa yang berbeda dan kadang-kadang, hanya kadang-kadang, sebagai manusia saya membuat kesalahan.

Inti dari perilaku semacam ini adalah sikapnya yang defensif, tidak ada di sana karena Anda berharap untuk membuat kesalahan lebih daripada Anda memiliki asuransi karena Anda berharap untuk crash ... tetapi jika Anda melakukan itu Bagus untuk ditanggung.

Susah dibaca? Anda mengeluh bahwa seorang programmer yang baik seharusnya memiliki == hardware (yang membuat semua jenis asumsi yang buruk) tetapi programmer yang sama tidak dapat membaca 0 == nilai ??

Tidak ada salahnya, memiliki manfaat potensial, pertanyaan konyol, biarkan orang lain melakukannya jika mereka mau dan terus maju.

17
Murph

Saya tidak akan menyebutnya berbahaya, tapi itu menjengkelkan. Jadi tidak, saya tidak akan mengatakan itu.

11
whatsisname

Saya tidak pernah merasa bahwa keseluruhan 'bagaimana jika saya lupa a =?' pernah benar-benar memegang banyak berat badan. Ya, Anda mungkin membuat kesalahan ketik, tetapi kita semua membuat kesalahan ketik, tampaknya konyol untuk mengubah seluruh gaya pengkodean Anda karena Anda takut membuat kesalahan. Mengapa tidak membuat semua variabel Anda & fungsi semuanya huruf kecil tanpa tanda baca, karena Anda mungkin lupa untuk memanfaatkan sesuatu atau melupakan garis bawah suatu hari?

10
GSto

Beberapa orang menggunakannya untuk memperjelas apa yang dilakukan oleh kondisi. Contohnya:

Cara 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Cara 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Beberapa orang merasa bahwa contoh kedua lebih ringkas, atau argumen pembalik menggambarkan titik ujian (bersyarat) sebelum ujian itu sendiri.

Sebenarnya, saya juga tidak keberatan. Saya punya hewan peliharaan saya kesal tentang gaya dan yang terbesar adalah inkonsistensi. Jadi, lakukan dengan cara yang sama, secara konsisten dan saya tidak keberatan membaca kode Anda.

Mencampurnya sampai ke titik di mana sepertinya enam orang yang berbeda dengan gaya khas mereka mengerjakannya sekaligus, saya menjadi sedikit kesal.

9
Tim Post

Bagi saya, itu adalah pengondisian sederhana. Sebagai seseorang yang belajar (dalam 90-an) C dan C++, saya menjadi terbiasa dan masih menggunakannya, meskipun alasannya dikurangi.

Setelah Anda "dikondisikan" untuk melihat sisi kiri untuk "konstan", itu menjadi sifat kedua.

Saya juga hanya menggunakannya untuk kesetaraan (atau negated equivalence), bukan untuk lebih besar/kurang dari.

Saya setuju sepenuhnya dengan jawaban Wonko.

6
DevSolo

Satu kasus di mana saya merasa terbantu adalah di mana bagian variabel jika cukup panjang dan melihat nilai-nilai membuat kode lebih mudah dibaca. Bahasa namespace bertitik memiliki contoh terbaik ini.

Misalnya sesuatu yang saya kerjakan dengan sistem masuk tunggal memiliki situasi di mana Anda dapat memiliki dua sesi bersamaan jika jenis kesalahan tertentu terjadi dan dipulihkan dengan cara tertentu, jadi saya harus menambahkan pawang untuk itu yang ada di dalam jika itu tampak sesuatu seperti ini:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

Harus diakui dalam contoh ini ada cara lain untuk melakukan ini, tetapi ini akan menjadi kasus di mana versi nomor-pertama berpotensi lebih mudah dibaca.

5
Bill

Namun kesalahan terjadi. Dan kadang-kadang Anda ingin tugas di operator loop di mana Anda mungkin memeriksa kesetaraan, atau setidaknya itu adalah praktik standar untuk menggunakannya.

Saya terus dengan itu. Saran yang saya ikuti (mungkin dari Kode Lengkap) adalah untuk menjaga apa yang seharusnya menjadi nilai yang lebih rendah di sebelah kiri dalam perbandingan. Saya mendiskusikan ini dengan seorang rekan sebelumnya dan dia pikir itu agak gila tapi saya sudah terbiasa dengannya.

Jadi saya akan mengatakan:

if ( 0 <= value )

Tetapi saya juga akan mengatakan:

if ( value <= 100 )

Kesetaraan Saya akan cenderung untuk memeriksa dengan variabel di sebelah kiri, itu hanya lebih mudah dibaca.

3
glenatron