Akhir-akhir ini, saya telah banyak bekerja di PHP dan khususnya dalam kerangka WordPress. Saya memperhatikan banyak kode dalam bentuk:
if ( 1 == $options['postlink'] )
Di mana saya diharapkan untuk melihat:
if ( $options['postlink'] == 1 )
Apakah ini sebuah konvensi yang ditemukan dalam bahasa / kerangka kerja tertentu? Adakah alasan mengapa pendekatan yang pertama lebih disukai daripada yang terakhir (dari perspektif pemrosesan, atau perspektif parsing atau bahkan perspektif manusia?)
Atau itu hanya masalah selera? Saya selalu berpikir lebih baik ketika melakukan tes, bahwa item variabel yang diuji terhadap beberapa konstanta ada di sebelah kiri. Tampaknya memetakan lebih baik dengan cara kita akan mengajukan pertanyaan dalam bahasa alami: "jika kue adalah cokelat" daripada "jika coklat adalah kue".
Jawaban:
Alasan utama untuk melakukan ini (disebut "Yoda conditional") adalah untuk mencegah kecelakaan di mana Anda secara tidak sengaja menggunakan operator penugasan (
=
) alih-alih operator pembanding yang sama (==
).Yaitu, jika Anda melakukan kesalahan dengan melakukan:
Pernyataan ini akan dievaluasi untuk
true
(atau, dalam kasus beberapa bahasa — seperti PHP — nilai kebenaran) dan Anda akan memiliki bug yang sulit ditemukan.Tetapi jika Anda melakukannya:
Anda akan menerima kesalahan fatal karena Anda tidak dapat menetapkan
$foo
bilangan bulat.Tetapi seperti yang Anda tunjukkan, membalik urutan biasanya membuat hal-hal menjadi kurang mudah dibaca. Jadi, banyak standar pengkodean (tetapi tidak semua, termasuk WordPress ) menyarankan atau mengharuskan
$foo == 1
terlepas dari manfaat bug berburu1 == $foo
.Secara umum, saran saya adalah mengikuti standar pengkodean apa pun yang ada, jika ada: untuk WordPress, itu berarti menggunakan persyaratan Yoda.
Ketika tidak ada, dan tidak mungkin untuk membangun melalui konsensus dengan rekan-rekan Anda, itu pilihan dealer.
sumber
:=
operator penugasan (dengan==
untuk uji kesetaraan) untuk menghindari masalah semacam ini.=
bukan==
. Perbedaannya sangat ditekankan di mana-mana sehingga saya tidak pernah membuat mereka bingung. Di sisi lain, saya telah membaca banyak potongan kode yang membingungkan atau sulit dipahami. Karena itu, saya akan menempatkan prioritas pada keterbacaan :). Apapun, jawaban yang bagus.-Wall -Werror
atau kompiler / juru bahasa Anda setara. Ada beberapa situasi di mana penugasan di dalam suatu kondisi benar, apalagi lebih mudah dibaca. Banyak bahasa bahkan tidak mengizinkannya.if($foo = 1)
dievaluasitrue
dalam beberapa bahasa, dalam PHP itu dievaluasi menjadi 1 sebagai gantinya;if($foo = 20)
dievaluasi menjadi 20;if($foo = 0)
mengevaluasi ke 0, yang tidak seperti yang lain salah. Ini dapat menambahkan seluruh lapisan kompleksitas nother ke bug.Ini adalah mekanisme pengkodean defensif yang dimaksudkan untuk mencegah penggunaan yang tidak sengaja dari operator penugasan.
Pertimbangkan penyalahgunaan / kesalahan operator penugasan sebagai pengganti operator kesetaraan
Persyaratan di atas akan selalu kembali benar, tapi itu mungkin tidak apa yang dipikirkan oleh programmer asli. Pertimbangkan, di tempat itu, ini
Di sini, PHP (dan sebagian besar bahasa lain) akan menolak untuk dijalankan, karena tidak mungkin untuk menetapkan apa pun ke nilai tetap
1
. Dengan mengkode semua pernyataan bersyarat dengan cara ini, Anda secara otomatis memastikan tidak ada penggunaan yang tidak disengaja dari operator penugasan dalam kondisi.sumber
Saya suka menggunakan konvensi itu di java untuk menghapus kemungkinan pengecualian null pointer. Jadi sesuatu seperti ini tidak akan menyebabkan masalah atau memerlukan kode tambahan:
sumber
Dalam praktiknya, banyak kompiler akan memberi Anda peringatan jika Anda menulis "if (x = 1)" alih-alih "if (x == 1)" karena kemungkinan besar kesalahan.
Dengan Dentang, Anda dapat menghindari peringatan dengan secara efektif memberi tahu kompiler "Saya bersungguh-sungguh, dan saya tahu apa yang saya lakukan", dan ini dilakukan dengan menulis "jika ((x = 1))". Perhatikan tanda kurung tambahan. Itu bekerja dalam situasi lain juga. if (false) statement; dapat memberi Anda peringatan bahwa pernyataan itu tidak pernah dieksekusi; if ((false)) statement; tidak memberi peringatan itu.
sumber
if ($array = getSomething()){ // ..so something with $array }