Saya pikir semua jawaban yang menjelaskan bahwa Anda seharusnya tidak memiliki bendera yang mengontrol apakah pengecualian dilemparkan atau tidak baik. Nasihat mereka akan menjadi saran saya untuk siapa saja yang merasa perlu untuk mengajukan pertanyaan itu.
Namun, saya ingin menunjukkan bahwa ada pengecualian yang berarti untuk aturan ini. Setelah Anda cukup maju untuk mulai mengembangkan API yang akan digunakan oleh ratusan orang lainnya, ada beberapa kasus di mana Anda mungkin ingin memberikan tanda seperti itu. Saat Anda menulis API, Anda tidak hanya menulis ke pembuat puritan. Anda menulis kepada pelanggan nyata yang memiliki keinginan nyata. Bagian dari pekerjaan Anda adalah membuatnya senang dengan API Anda. Itu menjadi masalah sosial, bukan masalah pemrograman, dan terkadang masalah sosial menentukan solusi yang kurang ideal sebagai solusi pemrograman sendiri.
Anda mungkin menemukan bahwa Anda memiliki dua pengguna berbeda dari API Anda, satu di antaranya menginginkan pengecualian dan satu lagi tidak. Contoh kehidupan nyata di mana ini bisa terjadi adalah dengan perpustakaan yang digunakan baik dalam pengembangan dan pada sistem tertanam. Dalam lingkungan pengembangan, pengguna mungkin ingin memiliki pengecualian di mana-mana. Pengecualian sangat populer untuk menangani situasi yang tidak terduga. Namun, mereka dilarang dalam banyak situasi tertanam karena mereka terlalu sulit untuk menganalisis kendala waktu nyata di sekitar. Ketika Anda benar-benar peduli bukan hanya waktu rata - rata yang diperlukan untuk menjalankan fungsi Anda, tetapi waktu yang diperlukan untuk kesenangan satu orang, gagasan melepaskan tumpukan di sembarang tempat sangat tidak diinginkan.
Contoh kehidupan nyata bagi saya: perpustakaan matematika. Jika perpustakaan matematika Anda memiliki Vector
kelas yang mendukung mendapatkan vektor satuan dalam arah yang sama, Anda harus dapat membagi dengan besarnya. Jika besarnya 0, Anda memiliki situasi bagi dengan nol. Dalam pengembangan Anda ingin menangkap ini . Anda benar-benar tidak ingin pembagian mengejutkan dengan 0 berkeliaran. Melempar pengecualian adalah solusi yang sangat populer untuk ini. Ini hampir tidak pernah terjadi (itu benar-benar perilaku yang luar biasa), tetapi ketika itu terjadi, Anda ingin mengetahuinya.
Pada platform tertanam, Anda tidak ingin pengecualian itu. Akan lebih masuk akal untuk melakukan pemeriksaan if (this->mag() == 0) return Vector(0, 0, 0);
. Sebenarnya, saya melihat ini dalam kode nyata.
Sekarang pikirkan dari perspektif bisnis. Anda dapat mencoba mengajarkan dua cara berbeda menggunakan API:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
Ini memuaskan pendapat sebagian besar jawaban di sini, tetapi dari perspektif perusahaan ini tidak diinginkan. Pengembang yang disematkan harus mempelajarinya gaya pengkodean, dan pengembang pengembangan harus mempelajari yang lain. Ini bisa agak sial, dan memaksa orang ke satu cara berpikir. Berpotensi lebih buruk: bagaimana Anda membuktikan bahwa versi yang disematkan tidak menyertakan pengecualian melemparkan kode? Versi melempar dapat dengan mudah berbaur, bersembunyi di suatu tempat dalam kode Anda sampai Papan Tinjauan Kegagalan yang mahal menemukannya.
Sebaliknya, jika Anda memiliki bendera yang mengaktifkan atau menonaktifkan penanganan pengecualian, kedua grup dapat mempelajari gaya pengkodean yang sama persis. Bahkan, dalam banyak kasus, Anda bahkan dapat menggunakan kode satu grup dalam proyek grup lain. Dalam kasus menggunakan kode ini unit()
, jika Anda benar-benar peduli tentang apa yang terjadi dalam kasus dibagi dengan 0, Anda harus menulis tes sendiri. Jadi, jika Anda memindahkannya ke sistem tertanam, di mana Anda mendapatkan hasil yang buruk, perilaku itu "waras." Sekarang, dari perspektif bisnis, saya melatih coders saya sekali, dan mereka menggunakan API yang sama dan gaya yang sama di semua bagian bisnis saya.
Dalam sebagian besar kasus, Anda ingin mengikuti saran orang lain: gunakan idiom like tryGetUnit()
atau mirip untuk fungsi yang tidak melempar pengecualian, dan sebaliknya mengembalikan nilai sentinel seperti null. Jika menurut Anda pengguna mungkin ingin menggunakan kode penanganan perkecualian dan kode penanganan nonkecualian berdampingan dalam satu program, tetap dengan tryGetUnit()
notasi. Namun, ada kasus sudut di mana realitas bisnis dapat membuatnya lebih baik menggunakan bendera. Jika Anda menemukan diri Anda dalam sudut itu, jangan takut untuk melemparkan "aturan" di pinggir jalan. Untuk itulah aturannya!