Profesor saya terus merujuk pada contoh Java ini ketika ia berbicara tentang kode "kuat":
if (var == true) {
...
} else if (var == false) {
...
} else {
...
}
Dia mengklaim bahwa "kode yang kuat" berarti bahwa program Anda memperhitungkan semua kemungkinan, dan bahwa tidak ada yang namanya kesalahan - semua situasi ditangani oleh kode dan menghasilkan keadaan yang valid, karenanya "lain".
Namun saya ragu. Jika variabel adalah boolean, apa gunanya memeriksa keadaan ketiga ketika keadaan ketiga secara logis tidak mungkin?
"Tidak memiliki kesalahan" tampaknya konyol juga; bahkan aplikasi Google menunjukkan kesalahan secara langsung kepada pengguna alih-alih menelannya diam-diam atau entah bagaimana menganggapnya sebagai keadaan yang valid. Dan itu bagus - saya suka tahu kapan ada masalah. Dan sepertinya klaim untuk mengatakan aplikasi tidak akan pernah memiliki kesalahan.
Jadi apa definisi sebenarnya dari "kode kuat"?
sumber
Jawaban:
Bagaimana dengan
Boolean?
yang memungkinkanNULL
negara yang tidak benar atau salah. Sekarang apa yang harus dilakukan oleh perangkat lunak? Beberapa perangkat lunak harus sangat tahan terhadap kecelakaan seperti alat pacu jantung. Pernah melihat seseorang menambahkan kolom ke database yang merupakanBoolean
dan menginisialisasi data saat ini untukNULL
awalnya? Saya tahu saya telah melihatnya.Berikut adalah beberapa tautan yang membahas apa artinya menjadi kuat dalam hal perangkat lunak:
Jika Anda berpikir ada satu yang secara universal menyetujui definisi "kuat" di sini, semoga sukses. Mungkin ada beberapa sinonim seperti bom-bukti atau idiot-proof. Programer Lakban akan menjadi contoh seseorang yang biasanya menulis kode yang kuat setidaknya dalam pemahaman saya tentang persyaratan.
sumber
Demi diskusi saya, Bool dapat memiliki 2 status, Benar atau Salah. Yang lainnya adalah ketidaksesuaian dengan spesifikasi pemrograman langugae. Jika rantai alat Anda tidak sesuai dengan spesifikasinya, Anda disembunyikan apa pun yang Anda lakukan. Jika seorang pengembang membuat jenis Bool yang memiliki lebih dari 2 negara, itu adalah hal terakhir yang akan dia lakukan pada basis kode saya.
Opsi A.
Opsi B
Saya menegaskan Opsi B lebih kuat .....
Setiap twit dapat memberitahu Anda untuk menangani kesalahan yang tidak terduga. Mereka biasanya mudah dideteksi setelah Anda memikirkannya. Contoh yang diberikan oleh profesor Anda bukanlah sesuatu yang bisa terjadi, jadi ini adalah contoh yang sangat buruk.
A tidak mungkin untuk diuji tanpa memanfaatkan uji yang berbelit-belit. Jika Anda tidak dapat membuatnya, bagaimana Anda akan mengujinya? Jika Anda belum menguji kode, bagaimana Anda tahu kode itu berfungsi? Jika Anda tidak tahu itu berfungsi, maka Anda tidak sedang menulis perangkat lunak yang tangguh. Saya pikir mereka masih menyebutnya Catch22 (Film Hebat, tonton kapan-kapan).
Opsi B mudah untuk diuji.
Masalah berikutnya, tanyakan pada Anda, profesor, pertanyaan ini, "Apa yang Anda ingin saya lakukan jika Boolean itu Benar atau Salah?" Itu harus mengarah pada diskusi yang sangat menarik .....
Sebagian besar kasus, dump inti tepat, paling buruk itu mengganggu pengguna atau menghabiskan banyak uang. Bagaimana jika, katakanlah, modulnya adalah sistem perhitungan masuk kembali real-time antar-jemput Antariksa? Jawaban apa pun, betapapun tidak akuratnya, tidak bisa lebih buruk daripada batal, yang akan membunuh pengguna. Jadi apa yang harus dilakukan, jika Anda tahu jawabannya mungkin salah, pilih 50/50, atau batalkan dan lakukan untuk kegagalan 100%. Jika saya seorang anggota kru, saya akan mengambil 50/50.
Opsi A membunuh saya. Opsi B memberi saya kesempatan untuk bertahan hidup.
Tapi tunggu - ini adalah simulasi masuknya kembali pesawat ulang-alik - lalu apa? Batalkan sehingga Anda tahu tentang itu. Kedengarannya seperti ide yang bagus? - BUKAN - karena Anda perlu menguji dengan kode yang Anda rencanakan untuk dikirim.
Opsi A lebih baik untuk simulasi, tetapi tidak dapat digunakan. Tidak berguna Opsi B adalah kode yang digunakan sehingga simulasi melakukan hal yang sama dengan sistem hidup.
Katakanlah ini adalah masalah yang valid. Solusi yang lebih baik adalah dengan mengisolasi penanganan kesalahan dari logika aplikasi.
Bacaan lebih lanjut - Mesin Therac-25 Xray, Ariane 5 Rocket failure, dan lain-lain (Tautan memiliki banyak tautan rusak tetapi cukup info yang Google akan bantu)
sumber
if (var != true || var != false) {
seharusnya merupakan&&
gantinya.Sebenarnya kode Anda tidak lebih kuat tetapi KURANG kuat. Final
else
hanyalah kode mati yang tidak dapat Anda uji.Dalam perangkat lunak penting seperti dalam wahana antariksa, kode mati dan kode yang lebih umum yang tidak diuji dilarang: Jika sinar kosmik menghasilkan satu peristiwa yang mengganggu yang pada gilirannya membuat kode mati Anda diaktifkan, semuanya mungkin terjadi. Jika SEU mengaktifkan sebagian kode yang kuat, perilaku (tak terduga) tetap terkendali.
sumber
Saya pikir profesor mungkin membingungkan "kesalahan" dan "bug". Kode yang kuat tentunya memiliki sedikit / tidak ada bug. Kode yang kuat mungkin, dan dalam lingkungan yang tidak bersahabat, harus, memiliki manajemen kesalahan yang baik (baik itu penanganan pengecualian atau tes status pengembalian yang ketat).
Saya setuju bahwa contoh kode profesor itu konyol, tetapi tidak sebodoh saya.
sumber
boolean x = something(); if (x) { x = True // make sure it's really true, ... }
Tidak ada definisi yang disepakati tentang Kode Kuat , karena untuk banyak hal dalam pemrograman itu lebih atau kurang subyektif ...
Contoh yang diberikan profesor Anda bergantung pada bahasanya:
Boolean
bisa berupaTrue
atauFalse
, tidak ada opsi ketigabool
bisatrue
,false
atau (sayangnya) datang dari beberapa pemain yang meragukan bahwa memasukkannya ke dalam kasus yang tidak diketahui ... ini harus tidak terjadi, tapi mungkin, sebagai akibat dari kesalahan sebelumnya.Namun, apa yang disarankan oleh dosen Anda mengaburkan kode dengan memperkenalkan logika asing untuk peristiwa yang tidak boleh terjadi di tengah program inti, jadi saya akan mengarahkan Anda, sebaliknya, ke arah Pemrograman Defensif .
Dalam hal universitas, Anda bahkan dapat menambahnya dengan mengadopsi strategi Desain Dengan Kontrak:
size
Adalah jumlah item dalamdata
daftar)a
kurang dari10
)Contoh:
sumber
Pendekatan profesor Anda benar-benar salah arah.
Suatu fungsi, atau hanya sedikit kode, harus memiliki spesifikasi yang mengatakan apa yang dilakukannya, yang harus mencakup setiap input yang mungkin. Dan kode harus ditulis sehingga perilakunya dijamin sesuai dengan spesifikasi. Pada contoh, saya akan menulis spek yang cukup sederhana seperti ini:
Kemudian Anda menulis fungsinya:
dan kode memenuhi spesifikasi. Jadi, profesor Anda berkata: Bagaimana jika var == 42? Lihatlah spec: Dikatakan fungsi harus melakukan "itu". Lihatlah kodenya: Fungsi melakukan "itu". Fungsi memenuhi spesifikasi.
Di mana kode profesor Anda membuat hal-hal yang sama sekali tidak aman adalah kenyataan bahwa dengan pendekatannya, ketika var tidak benar atau salah, ia akan mengeksekusi kode yang belum pernah dipanggil sebelumnya dan yang sama sekali belum diuji, dengan hasil yang sama sekali tidak dapat diprediksi.
sumber
Saya setuju dengan pernyataan @ gnasher729: Pendekatan profesor Anda benar-benar salah arah.
Robust berarti tahan terhadap kerusakan / kegagalan karena membuat beberapa asumsi dan dipisahkan: itu mandiri, mandiri, dan portabel. Ini juga mencakup kemampuan beradaptasi terhadap perubahan persyaratan. Singkatnya, kode Anda tahan lama .
Ini biasanya diterjemahkan ke dalam fungsi pendek yang mendapatkan data mereka dari parameter yang dilewatkan oleh pemanggil, dan penggunaan antarmuka publik untuk konsumen - metode abstrak, pembungkus, tipuan, antarmuka gaya COM, dll - daripada fungsi yang mengandung kode implementasi konkret.
sumber
Robust code hanyalah kode yang menangani kegagalan dengan baik. Tidak lebih, tidak kurang.
Dari kegagalan, ada banyak jenis: kode salah, kode tidak lengkap, nilai tak terduga, status tak terduga, pengecualian, sumber daya habis, .... Robust code menangani ini dengan baik.
sumber
Saya akan mempertimbangkan kode yang Anda berikan sebagai contoh pemrograman defensif (setidaknya saat saya menggunakan istilah ini). Bagian dari pemrograman defensif adalah membuat pilihan yang meminimalkan asumsi yang dibuat tentang perilaku seluruh sistem. Misalnya, mana yang lebih baik:
Atau:
(Jika Anda mengalami kesulitan melihat perbedaannya, periksa tes loop: penggunaan pertama
!=
, penggunaan kedua<
).Sekarang, dalam sebagian besar keadaan, kedua loop akan berperilaku dengan cara yang persis sama. Namun, yang pertama (membandingkan dengan
!=
) membuat asumsi yangi
akan bertambah hanya satu kali per iterasi. Jika melompati nilaisequence.length()
maka loop dapat terus melampaui batas urutan dan menyebabkan kesalahan.Karena itu Anda dapat membuat argumen bahwa implementasi kedua lebih kuat: itu tidak bergantung pada asumsi tentang apakah loop body berubah
i
(catatan: sebenarnya itu masih membuat asumsi yangi
tidak pernah negatif).Untuk memberikan motivasi mengapa Anda mungkin tidak ingin membuat asumsi itu, bayangkan bahwa loop memindai string, melakukan beberapa pemrosesan teks. Anda menulis loop dan semuanya baik-baik saja. Sekarang persyaratan Anda berubah dan Anda memutuskan untuk mendukung karakter pelolosan dalam string teks, sehingga Anda mengubah badan loop sedemikian sehingga jika mendeteksi karakter pelolosan (katakanlah, garis miring terbalik), itu kenaikan
i
untuk melewati karakter segera setelah melarikan diri. Sekarang loop pertama memiliki bug karena jika karakter terakhir dari teks adalah garis miring terbalik, tubuh loop akan bertambahi
dan loop akan terus berlanjut di luar akhir urutan.sumber
Saya pribadi menggambarkan kode sebagai 'kuat' yang memiliki atribut penting ini:
Sekarang, yang saya maksudkan adalah membuat sistem menjadi tidak stabil, atau menyebabkan pengecualian UNHANDLED . Anda tahu, terkadang untuk konsep yang sederhana, Anda dapat membuat definisi dan penjelasan yang kompleks. Tapi saya lebih suka definisi sederhana. Pengguna cukup pandai menemukan aplikasi yang kuat. Jika pengguna aplikasi Anda mengirimi Anda banyak permintaan tentang bug, tentang kehilangan status, tentang alur kerja yang tidak intuitif, dll., Maka ada yang salah dengan pemrograman Anda.
sumber