Saya memiliki beberapa metode yang melakukan beberapa perubahan data dalam database (menyisipkan, memperbarui, dan menghapus). The ORM Saya menggunakan kembali baris-dipengaruhi nilai-nilai int bagi mereka jenis metode. Apa yang harus saya kembalikan untuk "metode saya", untuk menunjukkan keberhasilan / kegagalan operasi?
Pertimbangkan kode yang mengembalikan int
:
A.1
public int myLowerLevelMethod(int id) {
...
int affectedRows = myOrm.deleteById(id)
...
return affectedRows;
}
Kemudian penggunaan:
A.2
public void myOtherMethod() {
...
int affectedRows = myLowerLevelMethod(id)
if(affectedRows > 0) {
// Success
} else {
// Fail
}
}
Bandingkan dengan menggunakan boolean:
B.1
public boolean myLowerLevelMethod(int id) {
...
int affectedRows = myOrm.deleteById(id)
...
return affectedRows > 0;
}
Kemudian penggunaan:
B.2
public void myOtherMethod() {
...
boolean isSuccess = myLowerLevelMethod(id)
if(isSuccess) {
// Success
} else {
// Fail
}
}
Yang mana (A atau B) yang lebih baik? Atau pro / kontra masing-masing?
design
error-handling
methods
Hoang Tran
sumber
sumber
Jawaban:
Pilihan lain adalah mengembalikan objek hasil daripada tipe dasar. Sebagai contoh:
Dengan ini, jika karena alasan tertentu Anda perlu mengembalikan jumlah baris yang terpengaruh, Anda bisa menambahkan metode di OperationResult:
Desain ini memungkinkan sistem Anda tumbuh dan mencakup fungsionalitas baru (mengetahui tentang baris yang terpengaruh) tanpa mengubah kode yang ada.
sumber
Mengembalikan jumlah baris yang terpengaruh lebih baik karena memberikan informasi tambahan tentang bagaimana operasi berjalan.
Tidak ada programmer yang akan menyalahkan Anda karena ia harus menulis ini untuk memeriksa apakah ada perubahan selama operasi:
tetapi mereka akan menyalahkan Anda ketika mereka harus tahu jumlah baris yang terpengaruh dan mereka menyadari tidak ada metode untuk mendapatkan nomor itu.
BTW: jika dengan "kegagalan" yang Anda maksud adalah kesalahan kueri sintaksis (dalam hal ini jumlah baris yang terpengaruh jelas 0) maka melempar pengecualian akan lebih tepat.
sumber
update t set category = 'default' where category IS NULL
meratakan 0 baris yang terpengaruh akan menjadi sukses, karena sekarang tidak ada item tanpa kategori, bahkan jika tidak ada baris yang terpengaruh!Saya tidak akan merekomendasikan mereka. Alih-alih, jangan kembalikan apa pun (batal) pada kesuksesan dan berikan pengecualian pada kegagalan.
Ini untuk alasan yang persis sama saya memilih untuk mendeklarasikan memebers tertentu dari kelas privat. Ini juga membuat fungsi lebih mudah digunakan. Konteks yang lebih operasional tidak selalu berarti lebih baik, tetapi tentu saja berarti lebih kompleks. Semakin sedikit yang Anda janjikan, semakin abstrak Anda, semakin mudah bagi klien untuk memahami dan semakin banyak kebebasan yang Anda miliki dalam memilih bagaimana menerapkannya.
Pertanyaannya adalah bagaimana menunjukkan keberhasilan / kesalahan. Dalam hal ini cukup untuk menandai kegagalan dengan melemparkan pengecualian dan tidak mengembalikan apa pun pada kesuksesan. Mengapa saya harus menyediakan lebih dari kebutuhan pengguna?
Kegagalan / situasi luar biasa dapat terjadi dan Anda harus menghadapinya. Apakah Anda menggunakan mencoba / menangkap untuk melakukannya atau memeriksa kode kembali, adalah masalah gaya / preferensi pribadi. Gagasan di balik try / catch adalah: pisahkan aliran normal dari aliran luar biasa dan biarkan pengecualian muncul hingga ke lapisan di mana mereka dapat ditangani dengan paling tepat. Jadi, seperti yang sudah ditunjukkan banyak orang, itu tergantung pada apakah kegagalan itu benar-benar luar biasa atau tidak.
sumber
"Apakah ini lebih baik dari itu?" bukan pertanyaan yang berguna ketika dua alternatif tidak melakukan hal yang sama.
Jika Anda perlu mengetahui jumlah baris yang terpengaruh, maka Anda harus menggunakan versi A. Jika Anda tidak harus, maka Anda dapat menggunakan versi B - tetapi setiap keuntungan yang Anda peroleh dalam hal upaya penulisan kode yang lebih sedikit sudah hilang sejak Anda kesulitan memposting kedua versi ke forum online!
Maksud saya adalah: solusi mana yang lebih baik sepenuhnya tergantung pada apa kebutuhan Anda secara spesifik untuk aplikasi ini, dan Anda tahu keadaan itu jauh lebih baik daripada kita. Tidak ada pilihan industri yang luas, aman digunakan, praktik terbaik, tidak akan dipecat yang lebih baik secara umum ; Anda harus memikirkannya sendiri. Dan untuk keputusan yang mudah direvisi seperti ini, Anda tidak perlu menghabiskan banyak waktu untuk berpikir.
sumber
Dua prinsip terpenting dalam desain perangkat lunak yang dapat dipelihara adalah KISS dan YAGNI .
Hampir tidak pernah merupakan ide yang baik untuk memasukkan logika yang tidak Anda butuhkan segera saat ini . Di antara banyak orang lain, Jeff Atwood (salah satu pendiri StackExchange) menulis tentang ini , dan dalam pengalaman saya dia dan pendukung lain dari konsep-konsep ini sepenuhnya benar.
Kerumitan apa pun yang Anda tambahkan ke program dikenakan biaya, dibayar dalam jangka waktu lama. Program menjadi lebih sulit dibaca, lebih kompleks untuk diubah, dan lebih mudah bagi bug untuk masuk. Jangan terpancing untuk menambahkan hal-hal "berjaga-jaga". Itu rasa aman yang salah.
Anda jarang mendapatkan kode yang benar saat pertama kali. Perubahan tidak bisa dihindari; menambahkan logika spekulatif untuk mempersiapkan diri menghadapi kemungkinan tak terduga di masa depan tidak akan benar-benar melindungi Anda dari keharusan memperbaiki kode Anda ketika masa depan ternyata berbeda dari yang Anda harapkan. Pemeliharaan pada logika yang tidak perlu / bergantung lebih merupakan masalah rawatan daripada refactoring kemudian untuk menambahkan fungsionalitas yang hilang.
Jadi, karena tampaknya semua kebutuhan program Anda untuk saat ini adalah untuk mengetahui apakah operasi berhasil atau gagal, solusi B yang Anda usulkan (kembalikan boolean tunggal) adalah pendekatan yang benar. Anda selalu dapat refactor nanti jika persyaratan berubah. Solusi ini adalah yang paling sederhana dan memiliki kompleksitas terendah (KISS) dan melakukan apa yang Anda butuhkan dan tidak lebih dari itu (YAGNI).
sumber
Seluruh baris atau status kesalahan
Pertimbangkan untuk mengembalikan seluruh baris, setidaknya sebagai opsi run-time. Dalam sisipan DB Anda mungkin perlu memeriksa data yang dimasukkan - karena sering berbeda dari apa yang Anda kirim ke DB; contoh umum termasuk ID baris yang dibuat secara otomatis (bahwa aplikasi kemungkinan akan segera membutuhkannya), nilai default yang ditentukan oleh DB, dan hasil pemicu jika Anda menggunakannya.
Di sisi lain, jika Anda tidak perlu data yang dikembalikan, maka Anda juga tidak perlu jumlah baris yang terkena dampak, karena itu tidak membantu untuk hasil 0. Jika ada kesalahan, maka Anda perlu kembali jenis dari kesalahan terjadi, dengan cara yang konsisten dengan prinsip-prinsip penanganan kesalahan proyek Anda (pengecualian, kode kesalahan numerik, apa pun); tetapi ada kueri yang valid yang akan memengaruhi 0 baris dengan benar (mis. "hapus semua pesanan kedaluwarsa" jika sebenarnya tidak ada).
sumber