Saya telah memikirkan masalah ini untuk sementara waktu dan saya ingin tahu pendapat dari pengembang lain.
Saya cenderung memiliki gaya pemrograman yang sangat defensif. Blok atau metode khas saya terlihat seperti ini:
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
Juga, selama perhitungan, saya memeriksa semua petunjuk sebelum mendereferensi mereka. Ide saya adalah, jika ada beberapa bug dan beberapa pointer NULL akan muncul di suatu tempat, program saya harus menangani ini dengan baik dan hanya menolak untuk melanjutkan perhitungan. Tentu saja dapat memberitahukan masalah dengan pesan kesalahan di log atau mekanisme lainnya.
Singkatnya, pendekatan saya adalah
if all input is OK --> compute result
else --> do not compute result, notify problem
Pengembang lain, di antaranya beberapa rekan saya, menggunakan strategi lain. Misalnya, mereka tidak memeriksa pointer. Mereka berasumsi bahwa sepotong kode harus diberikan input yang benar dan tidak boleh bertanggung jawab atas apa yang terjadi jika input salah. Selain itu, jika pengecualian pointer NULL merusak program, bug akan ditemukan lebih mudah selama pengujian dan memiliki lebih banyak peluang untuk diperbaiki.
Jawaban saya untuk ini biasanya: tetapi bagaimana jika bug tidak ditemukan selama pengujian dan muncul ketika produk sudah digunakan oleh pelanggan? Apa cara yang disukai bug untuk memanifestasikan dirinya? Haruskah program yang tidak melakukan tindakan tertentu, tetapi masih dapat terus bekerja, atau program yang macet dan perlu dimulai kembali?
Meringkas
Manakah dari dua pendekatan untuk menangani input yang salah yang akan Anda sarankan?
Inconsistent input --> no action + notification
atau
Inconsistent input --> undefined behaviour or crash
Edit
Terima kasih atas jawaban dan sarannya. Saya juga penggemar desain berdasarkan kontrak. Tetapi bahkan jika saya mempercayai orang yang telah menulis kode memanggil metode saya (mungkin itu sendiri), masih ada bug, yang mengarah ke input yang salah. Jadi pendekatan saya adalah jangan pernah menganggap metode dilewatkan input yang benar.
Juga, saya akan menggunakan mekanisme untuk menangkap masalah dan memberitahukannya. Pada sistem pengembangan, itu akan misalnya membuka dialog untuk memberi tahu pengguna. Dalam sistem produksi hanya akan menulis beberapa informasi ke log. Saya tidak berpikir bahwa pemeriksaan tambahan dapat menyebabkan masalah kinerja. Saya tidak yakin apakah asersi sudah cukup, jika dimatikan dalam sistem produksi: mungkin beberapa situasi akan terjadi dalam produksi yang tidak terjadi selama pengujian.
Bagaimanapun, saya benar-benar terkejut bahwa banyak orang mengikuti pendekatan yang berlawanan: mereka membiarkan aplikasi crash "on-purpose" karena mereka berpendapat bahwa ini akan membuatnya lebih mudah untuk menemukan bug selama pengujian.