Ini adalah hal yang saya lakukan banyak akhir-akhir ini.
Contoh:
setCircle(circle, i, { current }) {
if (i == current) {
circle.src = 'images/25CE.svg'
circle.alt = 'Now picking'
} else if (i < current) {
circle.src = 'images/25C9.svg'
circle.alt = 'Pick failed'
} else if (i > current) {
circle.src = 'images/25CB.svg'
circle.alt = 'Pick chance'
}
}
Seringkali jika / jika tangga secara signifikan lebih rumit daripada ini ...
Lihat klausa terakhir? Itu berlebihan. Tangga pada akhirnya seharusnya menangkap semua kondisi yang memungkinkan. Jadi bisa ditulis ulang seperti itu:
setCircle(circle, i, { current }) {
if (i == current) {
circle.src = 'images/25CE.svg'
circle.alt = 'Now picking'
} else if (i < current) {
circle.src = 'images/25C9.svg'
circle.alt = 'Pick failed'
} else {
circle.src = 'images/25CB.svg'
circle.alt = 'Pick chance'
}
}
Ini adalah bagaimana saya biasa menulis kode, tapi saya tidak suka gaya ini. Keluhan saya adalah kondisi di mana bagian terakhir dari kode akan dieksekusi tidak jelas dari kode. Saya kemudian mulai menulis kondisi ini secara eksplisit untuk membuatnya lebih jelas.
Namun:
- Secara eksplisit menulis kondisi akhir yang lengkap adalah ide saya sendiri, dan saya memiliki pengalaman buruk dengan ide-ide saya sendiri - biasanya orang-orang meneriaki saya tentang betapa mengerikannya apa yang saya lakukan - dan (kadang-kadang banyak) kemudian saya mengetahui bahwa itu memang suboptimal;
- Satu petunjuk mengapa ini mungkin ide yang buruk: Tidak berlaku untuk Javascript, tetapi dalam bahasa lain, kompiler cenderung mengeluarkan peringatan atau bahkan kesalahan tentang kontrol yang mencapai akhir fungsi. Memberitahu melakukan sesuatu seperti itu mungkin tidak terlalu populer atau saya salah melakukannya.
- Keluhan kompiler membuat saya kadang-kadang menulis kondisi terakhir dalam komentar, tapi saya kira melakukan itu mengerikan karena komentar, tidak seperti kode, tidak berpengaruh pada semantik program yang sebenarnya:
} else { // i > current
circle.src = 'images/25CB.svg'
circle.alt = 'Pick chance'
}
Apakah saya melewatkan sesuatu? Atau apakah boleh melakukan apa yang saya uraikan atau itu ide yang buruk?
Jawaban:
Kedua pendekatan itu valid. Tapi mari kita lihat lebih dekat pro dan kontra.
Untuk-
if
rantai dengan kondisi sepele seperti di sini, itu tidak masalah:else
, jelas bagi pembaca untuk mengetahui dalam kondisi apa yang dipicu lainnya;else if
, jelas bagi pembaca bahwa tidak ada tambahanelse
yang diperlukan karena Anda membahas semuanya.Namun, ada banyak
if
rantai yang bergantung pada kondisi yang lebih kompleks, menggabungkan keadaan beberapa variabel, mungkin dengan ekspresi logis yang kompleks. Dalam hal ini kurang jelas. Dan inilah konsekuensi dari masing-masing gaya:else
: Anda yakin bahwa salah satu cabang diambil. Jika kebetulan Anda lupa satu kasus, maka akan melewati cabang terakhir itu, jadi selama debugging, jika cabang terakhir dipilih dan Anda mengharapkan sesuatu yang lain, Anda akan segera mencari tahu.else if
: Anda perlu menurunkan kondisi redundan ke kode, dan ini menciptakan sumber kesalahan potensial dengan reisk tidak mencakup semua kasus. Selain itu, jika Anda melewatkan sebuah kasus, tidak ada yang akan dilakukan dan mungkin akan lebih sulit untuk mengetahui bahwa ada sesuatu yang hilang (misalnya jika beberapa variabel yang Anda harapkan akan diset, simpan nilainya dari iterasi sebelumnya).Jadi kondisi redundan terakhir adalah sumber risiko. Inilah sebabnya saya lebih memilih untuk pergi ke final
else
.Sunting: coding keandalan tinggi
Jika Anda mengembangkan dengan keandalan tinggi dalam pikiran, Anda mungkin tertarik pada varian lain: menyelesaikan final eksplisit berlebihan Anda
else if
dengan finalelse
untuk menangkap situasi yang tidak terduga.Ini adalah kode defensif. Ini direkomendasikan oleh beberapa spesifikasi keamanan seperti SEI CERT atau MISRA . Beberapa alat analisis statis bahkan menerapkan ini sebagai aturan yang diperiksa secara sistematis (ini bisa menjelaskan peringatan kompiler Anda).
sumber
assert
di finalelse if
. Panduan gaya Anda mungkin berbeda-beda apakah itu Ide Bagus. (Kondisi suatuassert
seharusnya tidak boleh salah, kecuali jika programmer mengacaukannya. Jadi ini setidaknya menggunakan fitur untuk tujuan yang dimaksudkan. Tetapi begitu banyak orang menyalahgunakannya sehingga banyak toko telah melarangnya secara langsung.)Sesuatu yang hilang dari jawaban sejauh ini adalah masalah kegagalan macam apa yang kurang berbahaya.
Jika logika Anda bagus, itu tidak masalah apa yang Anda lakukan, kasus penting adalah apa yang terjadi jika Anda memiliki bug.
Anda menghilangkan syarat akhir: Opsi akhir dijalankan bahkan jika itu bukan hal yang benar untuk dilakukan.
Anda cukup menambahkan syarat akhir: Ini tidak mengeksekusi opsi apa pun, tergantung pada situasi ini mungkin berarti sesuatu gagal untuk ditampilkan (bahaya rendah), atau itu mungkin berarti pengecualian referensi nol di beberapa titik kemudian (yang bisa menjadi debugging rasa sakit.)
Anda menambahkan syarat akhir dan pengecualian: Itu melempar.
Anda harus memutuskan opsi mana yang terbaik. Dalam kode pengembangan saya menganggap ini sebagai no-brainer - ambil kasus ketiga. Namun, saya mungkin akan mengatur circle.src ke gambar kesalahan dan circle.alt ke pesan kesalahan sebelum melempar - jika seseorang memutuskan untuk mematikan pernyataan nanti ini membuatnya gagal tanpa bahaya.
Hal lain yang perlu dipertimbangkan - apa saja opsi pemulihan Anda? Terkadang Anda tidak memiliki jalur pemulihan. Apa yang saya pikirkan adalah contoh utama dari ini adalah peluncuran pertama roket Ariane V. Terjadi kesalahan yang tidak tertangkap / 0 (sebenarnya divisi meluap) yang mengakibatkan penghancuran booster. Pada kenyataannya, kode yang mogok tidak berfungsi apa pun pada saat itu, kode itu telah diperdebatkan seketika penguat strap-on menyala. Begitu mereka menerangi orbit atau boom, Anda melakukan yang terbaik yang Anda bisa, kesalahan tidak bisa diizinkan. (Jika roket tersesat karena ini, petugas keamanan jangkauan memutar kuncinya.)
sumber
Yang saya rekomendasikan adalah menggunakan
assert
pernyataan di final Anda yang lain, dalam salah satu dari kedua gaya ini:Atau pernyataan kode mati:
Alat cakupan kode sering dapat dikonfigurasi untuk mengabaikan kode seperti "menegaskan Salah" dari laporan cakupan.
Dengan menempatkan kondisi dalam pernyataan, Anda secara efektif mendokumentasikan kondisi cabang secara eksplisit, tetapi tidak seperti komentar, kondisi pernyataan dapat benar-benar diperiksa dan akan gagal jika Anda membiarkan pernyataan diaktifkan selama pengembangan atau pada produksi (saya biasanya merekomendasikan menjaga pernyataan diaktifkan dalam produksi jika mereka tidak terlalu mempengaruhi kinerja).
sumber
Saya mendefinisikan makro "menegaskan" yang mengevaluasi suatu kondisi, dan dalam membangun debug jatuh ke debugger.
Jadi, jika saya 100 persen yakin bahwa satu dari tiga syarat itu pasti benar, saya menulis
Itu membuatnya cukup jelas bahwa satu syarat akan benar, dan tidak ada cabang tambahan untuk penegasan diperlukan.
sumber
Saya sarankan menghindari yang lain sama sekali . Gunakan
if
untuk menyatakan apa yang seharusnya ditangani oleh blok kode, dan akhiri blok dengan keluar dari fungsinya.Ini menghasilkan kode yang sangat jelas:
Final
if
tentu saja berlebihan ... hari ini. Ini bisa menjadi pemikiran yang sangat penting jika / ketika beberapa pengembang masa depan mengatur ulang blok. Jadi sangat membantu untuk membiarkannya di sana.sumber