Salah satu bagian dari program saya mengambil data dari banyak tabel dan kolom dalam database saya untuk diproses. Beberapa kolom mungkin null
, tetapi dalam konteks pemrosesan saat ini yang merupakan kesalahan.
Ini seharusnya "secara teoritis" tidak terjadi, jadi jika itu mengarah ke data yang buruk atau bug dalam kode. Kesalahan memiliki keparahan berbeda, tergantung bidang mana yang null
; yaitu untuk beberapa bidang pemrosesan harus dihentikan dan seseorang memberi tahu, untuk yang lain pemrosesan harus diizinkan untuk melanjutkan dan hanya memberi tahu seseorang.
Apakah ada prinsip arsitektur atau desain yang baik untuk menangani null
entri yang jarang tetapi mungkin ?
Solusi harus dimungkinkan untuk diterapkan dengan Java tetapi saya tidak menggunakan tag karena saya pikir masalahnya agak agnostik bahasa.
Beberapa pemikiran yang saya miliki:
Menggunakan NOT NULL
Paling mudah adalah dengan menggunakan batasan NOT NULL dalam database.
Tetapi bagaimana jika memasukkan data asli lebih penting daripada langkah pemrosesan nanti? Jadi kalau-kalau insert akan dimasukkan null
ke dalam tabel (baik karena bug atau mungkin bahkan beberapa alasan yang valid), saya tidak ingin insert gagal. Katakanlah banyak bagian program bergantung pada data yang dimasukkan, tetapi tidak pada kolom khusus ini. Jadi saya lebih suka mengambil risiko kesalahan pada langkah pemrosesan saat ini daripada langkah memasukkan. Itu sebabnya saya tidak ingin menggunakan batasan NOT NULL.
Secara naif tergantung pada NullPointerException
Saya hanya bisa menggunakan data seolah-olah saya berharap untuk selalu ada di sana (dan itu harus benar-benar terjadi), dan menangkap NPE yang dihasilkan pada tingkat yang sesuai (misalnya sehingga pemrosesan entri saat ini berhenti tetapi tidak seluruh proses pemrosesan berlangsung ). Ini adalah prinsip "gagal puasa" dan saya sering lebih suka. Jika itu bug, setidaknya saya mendapatkan NPE yang dicatat.
Tetapi kemudian saya kehilangan kemampuan untuk membedakan berbagai jenis data yang hilang. Misalnya untuk beberapa data yang hilang saya bisa meninggalkannya, tetapi untuk yang lain pemrosesan harus dihentikan dan admin diberitahu.
Memeriksa null
sebelum setiap akses dan melemparkan pengecualian khusus
Pengecualian khusus akan membuat saya memutuskan tindakan yang benar berdasarkan pengecualian, jadi ini sepertinya cara yang harus dilakukan.
Tetapi bagaimana jika saya lupa memeriksanya di suatu tempat? Juga saya kemudian mengacaukan kode saya dengan cek nol yang tidak pernah atau jarang diharapkan (dan tentunya bukan bagian dari aliran logika bisnis).
Jika saya memilih jalan seperti ini, pola apa yang paling cocok untuk pendekatan ini?
Setiap pemikiran dan komentar tentang pendekatan saya disambut. Juga solusi apa pun yang lebih baik (pola, prinsip, arsitektur kode atau model saya yang lebih baik, dll.).
Edit:
Ada kendala lain, dalam hal itu saya menggunakan ORM untuk melakukan pemetaan dari DB ke objek kegigihan, sehingga melakukan pemeriksaan nol pada tingkat itu tidak akan berfungsi (karena objek yang sama digunakan di bagian di mana nol tidak membahayakan) . Saya menambahkan ini karena jawaban yang diberikan sejauh ini sama-sama menyebutkan opsi ini.