Dalam pernyataan kondisi (IF) semua orang menggunakan (position < size)
, tapi mengapa?
Hanya konvensi atau ada alasan bagus untuk itu?
Ditemukan di alam liar:
if (pos < array.length) {
// do some with array[pos];
}
Jarang ditemukan:
if (array.length > pos) {
// do some with array[pos];
}
if (MIN <= x && x <= MAX)
. (Dalam beberapa bahasa ini dapat ditulis sebagaiMIN <= x <= MAX
; dalam C, itu sah tetapi tidak berarti apa yang Anda pikirkan artinya).[min, max]
dan tidak[max, min]
. Oleh karena itu, wajar untuk memeriksa daripada elemenx
milik interval dengan menulismin <= x <= max
.Jawaban:
Pola yang lebih dalam adalah bahwa kita secara alami menggunakan "[hal yang bervariasi] [perbandingan] [hal yang tidak bervariasi]" sebagai urutan standar. Prinsip ini berlaku untuk contoh Anda karena posisi dapat bervariasi, sementara ukurannya tidak.
Satu-satunya pengecualian umum adalah ketika menguji kesetaraan beberapa programmer melatih diri mereka sendiri untuk menggunakan urutan yang berlawanan (dikenal sebagai kondisi Yoda ) untuk menghindari kesamaan
variable = constant
daripadavariable == constant
bug - Saya tidak tahan dengan ide ini karena saya menemukan urutan alami dijelaskan di atas jauh lebih mudah dibaca, terutama karena itulah cara kami mengekspresikan ide dalam bahasa Inggris, dan karena kebanyakan kompiler modern akan mendeteksi ini dan mengeluarkan peringatan.sumber
variable = constant
konstruksi.constant == variable
fenomena tersebut.if(DBNull == row["fieldName"]) methodCall()
dan bertanya-tanya apakah saya menjadi gila karena sebagian besar waktu saya melihatnya melakukan sebaliknya)(position < size)
sering menyatakan batas atas, sehingga efeknya menyatakan kembali bagianlowerbound <= position < upperbound
, dengan ukuran sebagai bagian atas. Dengan dua kendala eksplisit,position
hanya bisa berjalan di tengah.Satu-satunya pembenaran yang pernah saya lihat untuk itu adalah seperti garis angka atau hal-hal lain yang kami pelajari di sekolah. Sebagai contoh, kami menulis baris angka seperti ini:
Hal-hal kecil muncul di sebelah kiri hal-hal yang lebih besar. Hal yang sama berlaku untuk hal-hal lain seperti tanggal (pikirkan bagaimana kalender disusun).
Ini pada dasarnya bermuara pada bagaimana kita secara alami memikirkan urutan berbagai hal. Lebih mudah untuk membaca formulir pertama karena Anda tidak perlu melakukan banyak proses mental di dalamnya.
sumber
Sementara itu terutama masalah konvensi, menurut pendapat saya ini paling cocok dengan cara kita berpikir - itu menunjukkan item yang kita tempatkan penekanan.
Jika kita menerjemahkan ini ke bahasa Inggris, itu akan menjadi frasa "Jika posisinya kurang dari panjang array", di mana subjek kalimat adalah item sementara.
Untuk menyatakannya dengan cara lain, "jika panjang array lebih besar dari posisi" menempatkan panjang array (diasumsikan sebagai nilai tetap) dalam subjek dan posisi (transient) menjadi objek langsung.
sumber
Pendapat saya, dan ini hanya pendapat saya, adalah bahwa itu adalah konvensi untuk keterbacaan. Meskipun keduanya identik, mereka terasa berbeda di otak saya. Saya tidak ingin tahu apakah ukuran array lebih besar dari pos. Saya ingin tahu apakah pos lebih kecil dari ukuran array.
Ini seperti diskusi setengah kosong vs setengah penuh. Secara matematis identik, tetapi otak saya akan melihatnya secara berbeda tergantung pada konteksnya.
Secara pribadi, jika saya melihat
Saya akan mulai berpikir tentang apakah itu bug dan apa yang dimaksud oleh programmer. Apakah dia mencoba melakukan sesuatu selain memeriksa batas?
Mungkin saya tidak cerdas, tetapi jika saya harus melakukan analisis semacam itu pada setiap baris kode, otak saya sakit.
sumber
Untuk mengungkapkan apa yang telah dicoba beberapa orang, dengan cara yang berbeda ...
Ketika tatanan tidak membuat perbedaan pada perilaku program, perbedaannya jelas masalah apa yang paling mudah dibaca oleh manusia. Inilah alasan linguistik mengapa menempatkan "topik" di sebelah kiri masuk akal:
Dalam linguistik, topik kalimat adalah apa yang dibicarakan, dan komentar adalah apa yang dikatakan tentang topik tersebut. Dalam contoh ini, kita dapat berasumsi bahwa itu
position
adalah topik , dan "kurang dari panjang array" adalah komentar . Dalam bahasa Inggris, dan dalam banyak bahasa lain, topik biasanya diungkapkan sebelum komentar." Kecenderungan untuk menempatkan konstituen yang diartikan sebagai kalimat-pada awalnya (topik fronting) tersebar luas. "
Jadi aturan praktis yang baik adalah untuk memikirkan baris Anda kode sebagai kalimat (atau klausa, dalam hal ini), memutuskan apa kalimat tersebut sekitar , dan meletakkan yang pertama jika Anda bisa. Seringkali, apa kalimat "tentang" akan menjadi variabel daripada konstanta. Tetapi kadang-kadang komentar juga akan melibatkan variabel, jadi Anda tidak bisa pergi begitu saja.
sumber
Ini adalah kombinasi dari dua hal, keduanya berasal dari assembler yang mendasari bahwa bahasa awal dikompilasi (dan banyak yang saat ini juga).
Array adalah offset berbasis-nol dalam memori (yaitu potongan data pertama pada awal blok memori yang dialokasikan ... indeks-0). Oleh karena itu penggunaan 0..n-1 untuk bagian yang bervariasi.
Bercabang jika nilainya kurang dari nilai yang lain (atau mendaftar, dll) biasanya merupakan satu instruksi. Oleh karena itu penggunaan operator yang kurang dari (<) sederhana.
Jadi, polanya pindah dari assembler lama ke ANSI-C (yang lebih mirip assembler makro dalam beberapa hal) dan dari sana ke Jawa dan bahasa mirip-C lainnya.
sumber
Seperti banyak jawaban lain katakan, seringkali lebih mudah dibaca:
Hampir semua orang yang saya kenal menggunakan gaya ini secara eksklusif.
Ada satu pengecualian, untuk bahasa gaya-C yang digunakan
=
untuk penugasan dan==
untuk perbandingan. Jika Anda tidak sengaja mengetik:dari pada:
maka Anda tidak akan mendapatkan kesalahan karena ini adalah baris kode yang valid. (Beberapa kompiler dan IDE akan memperingatkan Anda tentang melakukan ini, tetapi masih sangat mudah untuk salah ketik seperti itu.)
Namun, jika Anda menulis:
compiler / interpreter akan error karena itu bukan konstruk yang valid (dalam kebanyakan bahasa, toh).
Pergantian ini sering disebut Kondisi Yoda .
UPDATE : Berikut adalah daftar tempat di mana Ketentuan Yoda berguna .
sumber
Secara pribadi, saya lebih suka ini:
... lebih banyak kode, tetapi juga sangat mudah dibaca.
sumber
pos
menjadi> array.length
. Dengan kata lain, meskipun itu membuat arti dari conditional sangat jelas, itu sebenarnya membuat sedikit lebih sulit untuk membaca IMO.Ini masalah preferensi atau konvensi. Jika Anda ingin konsisten, ada dua cara yang masuk akal untuk melakukannya:
Selalu letakkan "subjek" terlebih dahulu (anggap sebagai kalimat) - nilai ujiannya. Jadi misalnya Anda akan menulis
if (age>5)
Atau selalu menempatkan elemen yang lebih kecil terlebih dahulu (anggap sebagai nilai-nilai yang dipesan pada layar Anda dalam urutan alami). Jadi misalnya Anda akan menulis
if (a<b)
terlepas dari apakah kode ini sebagian besar tentang a atau sebagian besar tentang b.Kedua konvensi akan merekomendasikan cuplikan pertama yang Anda perlihatkan alih-alih yang kedua, jadi saya kira dalam kasus khusus ini Anda memiliki jawaban. Saya akan mengatakan itu bijaksana untuk menghindari menulis kode yang melanggar (1) dan (2) di sini, karena akan membuat lebih sulit untuk dibaca oleh kebanyakan orang.
sumber