Bisakah Designing by Contract (DbC) menjadi cara memprogram secara defensif?
Apakah satu cara pemrograman lebih baik dalam beberapa kasus daripada yang lain?
Bisakah Designing by Contract (DbC) menjadi cara memprogram secara defensif?
Apakah satu cara pemrograman lebih baik dalam beberapa kasus daripada yang lain?
Jawaban:
Desain oleh Kontrak dan pemrograman defensif dalam beberapa hal bertentangan satu sama lain: di DbC, Anda mendefinisikan kontrak antara kolaborator dan Anda memprogram dengan asumsi bahwa kolaborator menghormati kontrak mereka. Dalam pemrograman defensif, Anda memprogram dengan asumsi bahwa kolaborator Anda melanggar kontrak mereka.
Rutin akar kuadrat nyata yang ditulis dalam gaya DbC akan menyatakan dalam kontraknya bahwa Anda tidak diizinkan untuk melewati angka negatif dan kemudian hanya berasumsi bahwa itu tidak pernah dapat menemukan angka negatif. Rutin root kuadrat nyata ditulis defensif akan menganggap bahwa itu melewati angka negatif dan mengambil tindakan pencegahan yang tepat.
Catatan: tentu saja mungkin bahwa di DbC orang lain akan memeriksa kontrak. Di Eiffel, misalnya, sistem kontrak akan memeriksa angka negatif pada saat runtime dan melemparkan pengecualian yang sesuai. Dalam Spec #, pembalas teorema akan memeriksa angka negatif pada waktu kompilasi dan gagal membangun, jika tidak dapat membuktikan bahwa rutin tidak akan pernah melewati angka negatif. Perbedaannya adalah bahwa programmer tidak melakukan pemeriksaan ini.
Bisakah Designing by Contract (DbC) menjadi cara memprogram secara defensif?
Iya nih.
"Pemrograman Defensif" seringkali menjadi alasan untuk membuang waktu. Sering buang waktu memeriksa hal-hal yang akan menyebabkan pengecualian biasa. Alih-alih pengecualian, pernyataan IF tambahan ditulis alih-alih klausa penanganan pengecualian.
Definisikan kontrak dan selesaikan dengan itu.
Ketika seseorang melanggar kontrak, program akan - dalam peristiwa normal - istirahat dan meningkatkan pengecualian normal yang biasanya dapat ditangani.
"Pemrograman defensif" dan "Pencegahan kesalahan" dapat ditampilkan untuk menambah kesalahan (karena pemeriksaan pencegahan kesalahan itu sendiri salah) daripada mencegah kesalahan.
Penanganan pengecualian dapat membungkam, mencatat dan menangani pengecualian jauh lebih baik daripada "Pemrograman Defensif".