Saya tahu itu mahal tapi (IMO) saya percaya ini adalah praktik yang sangat bagus. Saya sedang berbicara tentang aturan seperti katakan, Anda tidak dapat menyimpan Faktur jika Anda bukan orang penjualan ... jadi dalam hal itu melemparkan pengecualian yang mengatakan 'Anda tidak berwenang' atau semacamnya ...
Pendekatan lain akan memiliki objek dengan status atau sesuatu seperti itu
Apakah ada pendekatan lain? bagaimana perasaanmu tentang itu?
JamesPoulsonException
sebagai subkelasRuntimeException
dan kemudian memberikan pengecualian asli sebagaicause
. Kemudian Anda bisa mengatakanif (exception instanceof JamesPoulsonException)...
membedakan. GunakangetCause()
metode untuk mencapai pengecualian asli.Dalam contoh yang Anda berikan kepada kami, saya pikir mengajukan pengecualian adalah ide yang buruk. Jika Anda tahu bahwa pengguna tidak diotorisasi sebelum mereka mulai bekerja dan Anda masih mengizinkan mereka untuk melakukan beberapa fungsi dan kemudian memukul mereka dengan pesan SETELAH mereka telah menyelesaikan tugas, itu hanya desain yang buruk.
Menggunakan pengecualian untuk menegakkan aturan bisnis bukanlah desain yang baik.
sumber
Saya tidak melihat nilai apa yang dimiliki oleh Pengecualian dalam menciptakan logika bisnis yang baik. Ada banyak pendekatan untuk menangani logika bisnis yang tidak melibatkan penggunaan sistem yang dimaksudkan untuk mengatasi kondisi yang tidak terduga dalam pengoperasian sistem.
Hal ini diharapkan bahwa dalam logika bisnis, kondisi akan tidak dipenuhi; itulah alasan untuk memilikinya di tempat pertama, dan Anda tidak ingin membonceng mekanisme yang sama yang menangani kegagalan I / O yang tak terduga, dari kesalahan memori dan referensi nol. Itu adalah kegagalan sistem, tetapi mendeteksi kondisi bisnis yang tidak terpenuhi adalah keberhasilan operasi sistem.
Selain itu, ini adalah sistem yang matang untuk konsekuensi yang tidak diinginkan. Karena suatu pengecualian harus ditangkap pada titik tertentu, Anda berisiko mengambil pengecualian aturan bisnis baru yang tertangkap di suatu tempat yang tidak dimaksudkan atau Anda berkesempatan memiliki kode yang mencari aturan bisnis yang menangkap pengecualian yang sebenarnya tidak dimaksudkan untuk itu. Ya, kondisi ini dapat diperhitungkan dengan praktik pengkodean yang baik, tetapi dalam sistem non-sepele di mana lebih dari satu pengembang bekerja, kesalahan akan terjadi, dan Anda hanya harus berharap bahwa itu tidak akan menjadi kesalahan mahal.
sumber
mengungkapkan aturan bisnis adalah satu hal, menerapkannya adalah hal lain
pikirkan tentang pengalaman pengguna; jika pengguna bukan tenaga penjualan, mengapa memberi mereka tombol yang mengatakan 'buat faktur' sama sekali ?
sumber
Itu sepenuhnya tergantung pada apa yang sedang dilakukan.
Pertama, apa perilaku aktual yang Anda inginkan? Jika seseorang memasukkan informasi mereka sendiri, maka penolakan dan kotak dialog yang mengatakan, pada dasarnya, "Anda tidak bisa melakukan itu" mungkin benar. Jika ini adalah orang entri data, bekerja dari tumpukan formulir, kotak dialog mungkin juga bagus, dan orang entri data dapat meletakkan formulir yang tidak valid di tumpukan khusus. Jika Anda melakukan pemrosesan batch, Anda tidak ingin menghentikan semuanya, tetapi beri tanda dan pindah ke yang berikutnya.
Setelah Anda memiliki perilaku, Anda perlu memutuskan bagaimana Anda akan menerapkannya. Memiliki pemeriksa aturan bisnis yang melempar pengecualian mungkin merupakan ide yang bagus. Mengembalikan kode pengembalian dan meneruskannya adalah hal lain yang bisa salah, dan Anda tentu tidak ingin entri yang salah semakin jauh.
Jangan khawatir tentang biaya kinerja. Dalam hal seseorang memasukkan data, itu sepele dibandingkan dengan waktu lain yang terlibat. Biasanya, manusia akan mengambil waktu paling banyak dalam sistem itu. Dalam kasus pekerjaan batch, jika pengecualian adalah masalah kinerja, Anda memasukkan terlalu banyak catatan buruk, dan dalam kenyataannya menangani dan memasukkan kembali semua itu akan menjadi lebih banyak masalah daripada pengecualian.
sumber
Memiliki API pengecualian yang kuat dan dirancang dengan baik yang konsisten sangat tepat. Menggunakan ini untuk menegakkan aturan bisnis juga bisa sesuai. Bahkan dalam pengalaman saya, semakin rumit aturan bisnis, semakin besar kemungkinannya akan ditangani dengan cara ini. Seringkali sama mudahnya jika tidak lebih mudah untuk menulis suatu sistem di mana pengecualian diharapkan daripada menulis logika percabangan yang otoritatif.
Ini untuk mengatakan bahwa aturan sederhana yang dapat dijelaskan dalam satu kalimat pada umumnya harus dilaksanakan dengan cara preventif atau otoritatif tergantung pada mana itu. Namun, jika Anda memiliki aturan yang multi-dimensi dan memerlukan lebih dari tiga atau empat faktor (terutama jika pemilihan faktor-faktor ini didasarkan pada satu atau lebih dari faktor-faktor lain) maka pengkodean pengecualian mungkin lebih dapat dipertahankan. Seringkali dalam kasus ini jalur logika akan memiliki banyak pengecualian prekursor yang perlu dilempar, (memeriksa mengapa tindakan tidak dapat dilakukan) kemudian (atau sebaliknya) ada kejatuhan ke keamanan (untuk memeriksa bahwa tindakan itu diotorisasi ), kadang-kadang akan ada beberapa logika akumulasi otoritatif yang perlu diperiksa (ketersediaan keturunan / leluhur, prekursor menyatakan bahwa objek harus dimasukkan ke dalam, dll.
Salah satu manfaat yang diperoleh dari jenis lemparan pengecualian ini adalah Anda dapat memisahkan dan menggunakan kembali pengecualian prekursor di berbagai area proyek Anda. (Ini adalah inti dari Pemrograman Berorientasi Aspek.) Dengan melakukan ini Anda merangkum satu aspek tertentu dari aturan bisnis umum Anda dalam komponen mandiri dan dapat dikelola. Secara umum komponen ini akan sesuai 1-1 dengan pesan kesalahan yang dilemparkan. (Meskipun kadang-kadang Anda akan memiliki satu komponen yang melempar beberapa pengecualian berbeda, Anda seharusnya hampir tidak pernah memiliki pengecualian yang sama dilemparkan dari beberapa komponen.)
Menurut pendapat saya, lebih sulit untuk merancang sistem yang berbasis pengecualian dan waktu pengembangan awal lebih lama karena Anda harus membangun proses pengecualian di semua level N. Namun sistem ini pada akhirnya menjadi jauh lebih stabil. Meskipun tidak pernah mungkin untuk merancang sistem yang 'tidak akan gagal', manfaat dari desain berbasis pengecualian adalah bahwa Anda selalu mengantisipasi kegagalan. Bagi kebanyakan orang, prosesnya bisa kontra-intuitif. Ini seperti menanyakan arah dan meminta seseorang memberi tahu Anda semua jalan yang seharusnya tidak Anda nyalakan.
sumber