Одна часть моей программы извлекает данные из многих таблиц и столбцов в моей базе данных для обработки. Некоторые из столбцов могут быть null
, но в текущем контексте обработки это ошибка.
Этого не должно "теоретически" происходить, поэтому, если это так, это указывает на неверные данные или ошибку в коде. Ошибки имеют различную серьезность, в зависимости от того, какое поле null
; то есть для некоторых полей обработка должна быть остановлена, и кто-то должен уведомить об этом, а для других обработка должна быть разрешена для продолжения и просто уведомить кого-то.
Есть ли хорошая архитектура или принципы дизайна для обработки редких, но возможных null
записей?
Решения должны быть реализованы с помощью Java, но я не использовал этот тег, потому что я думаю, что проблема несколько не зависит от языка.
Некоторые мысли, которые у меня были:
Использование NOT NULL
Проще всего было бы использовать ограничение NOT NULL в базе данных.
Но что, если первоначальная вставка данных важнее, чем этот последующий этап обработки? Таким образом, в случае, если вставка вставит null
в таблицу (из-за ошибок или, может быть, даже по какой-то уважительной причине), я бы не хотел, чтобы вставка не удалась. Допустим, что многие другие части программы зависят от вставленных данных, но не от этого конкретного столбца. Поэтому я бы предпочел рискнуть ошибкой на текущем шаге обработки вместо шага вставки. Вот почему я не хочу использовать ограничение NOT NULL.
Наивно в зависимости от NullPointerException
Я мог бы просто использовать данные, как если бы я ожидал, что они будут всегда (и это действительно должно иметь место), и перехватить результирующие NPE на соответствующем уровне (например, так, чтобы обработка текущей записи остановилась, но не весь ход обработки) ). Это принцип «быстро провал», и я часто его предпочитаю. Если это ошибка, по крайней мере, я получаю зарегистрированный NPE.
Но затем я теряю способность различать различные виды пропущенных данных. Например, для некоторых отсутствующих данных я мог бы их опустить, но для других обработка должна быть остановлена и администратор уведомлен.
Проверка null
перед каждым доступом и выдача пользовательских исключений
Пользовательские исключения позволили бы мне выбрать правильное действие на основе исключения, так что это похоже на путь.
Но что, если я забуду где-нибудь это проверить? Кроме того, я затем загромождаю свой код пустыми проверками, которые никогда или редко ожидаются (и, следовательно, определенно не являются частью потока бизнес-логики).
Если я решу пойти по этому пути, какие шаблоны лучше всего подходят для этого подхода?
Любые мысли и комментарии по поводу моих подходов приветствуются. Также лучшие решения любого типа (шаблоны, принципы, лучшая архитектура моего кода или моделей и т. Д.).
Редактировать:
Есть еще одно ограничение: я использую ORM для преобразования из БД в объект персистентности, поэтому проверка на ноль на этом уровне не будет работать (так как одни и те же объекты используются в тех частях, где ноль не приносит никакого вреда) , Я добавил это, потому что ответы, предоставленные до сих пор, оба упомянули эту опцию.