Одна частина моєї програми отримує дані з багатьох таблиць і стовпців моєї бази даних для обробки. Деякі стовпці можуть бути null
, але в поточному контексті обробки це помилка.
Це "теоретично" не повинно відбуватися, тому, якщо це буде, це вказує на погані дані або помилку в коді. Помилки мають різну суворість, залежно від того, яке поле null
; тобто для деяких полів обробку слід зупинити, а когось повідомити, для інших обробку слід дозволити продовжувати та просто повідомляти когось.
Чи є якась хороша архітектура чи принципи дизайну для обробки рідкісних, але можливих null
записів?
Рішення повинні бути можливі для реалізації з Java, але я не використовував тег, тому що я думаю, що проблема є дещо мовною-агностичною.
Деякі думки, які я мав сам:
Використання NOT NULL
Найпростіше було б використовувати обмеження NOT NULL в базі даних.
Але що робити, якщо оригінальна вставка даних важливіша, ніж цей наступний етап обробки? Тож у випадку, якщо вставка вставила б null
у таблицю (або через помилки чи, можливо, навіть з поважної причини), я б не хотів, щоб вставка провалилась. Скажімо, що набагато більше частин програми залежить від вставлених даних, але не від цього конкретного стовпця. Тому я скоріше ризикую помилкою на поточному етапі обробки замість кроку вставки. Тому я не хочу використовувати обмеження NOT NULL.
Наївно залежно від NullPointerException
Я міг би просто використовувати дані так, як ніби очікую, що вони завжди будуть там (і це дійсно має бути так), і вловлювати отримані NPE на відповідному рівні (наприклад, щоб обробка поточного запису припинялася, але не весь прогрес обробки ). Це принцип "невдало швидко", і я часто віддаю перевагу цьому. Якщо це помилка, принаймні я отримую зареєстрований NPE.
Але тоді я втрачаю здатність розмежовувати різні види відсутніх даних. Наприклад, для деяких відсутніх даних я можу їх залишити, але для інших обробку слід зупинити і повідомити адміністратора.
Перевірка null
перед кожним доступом та викидання спеціальних винятків
Спеціальні винятки дозволяють мені вирішити правильну дію на основі винятку, тому це, здається, є шляхом.
Але що робити, якщо я забуду його десь перевірити? Крім того, я забиваю свій код нульовими перевірками, яких ніколи і не рідко очікують (а це, безумовно, не є частиною потоку ділової логіки).
Якщо я вирішу йти цим шляхом, які схеми найкраще підходять для підходу?
Будь-які думки та коментарі щодо моїх підходів вітаються. Також кращі рішення будь-якого типу (шаблони, принципи, краща архітектура мого коду чи моделі тощо).
Редагувати:
Є ще одне обмеження, в тому, що я використовую ORM, щоб зробити відображення від БД до об'єкта стійкості, тому робити нульові перевірки на цьому рівні не буде працювати (оскільки ті ж об’єкти використовуються в частинах, де нуль не робить ніякої шкоди) . Я додав це, тому що надані відповіді обидва згадали цей варіант.