Jedna część mojego programu pobiera dane z wielu tabel i kolumn w mojej bazie danych w celu przetworzenia. Niektóre kolumny mogą być null
, ale w bieżącym kontekście przetwarzania jest to błąd.
To „teoretycznie” nie powinno się zdarzyć, więc jeśli tak, wskazuje to na złe dane lub błąd w kodzie. Błędy mają różne poziomy ważności, w zależności od tego, które pole jest null
; tj. w przypadku niektórych pól przetwarzanie powinno zostać zatrzymane, a ktoś powiadomiony, w innych przypadkach przetwarzanie powinno być kontynuowane i po prostu powiadomić kogoś.
Czy istnieją jakieś dobre zasady architektury lub projektowania, które pozwolą obsłużyć rzadkie, ale możliwe null
wpisy?
Rozwiązania powinny być możliwe do wdrożenia w Javie, ale nie użyłem tagu, ponieważ uważam, że problem jest w pewnym stopniu zależny od języka.
Kilka myśli, które miałem:
Używanie NOT NULL
Najłatwiej byłoby użyć ograniczenia NOT NULL w bazie danych.
Ale co jeśli oryginalne wstawienie danych jest ważniejsze niż ten późniejszy etap przetwarzania? Więc jeśli wstawka wstawi null
do tabeli (albo z powodu błędów, albo może z jakiegoś ważnego powodu), nie chciałbym, żeby wstawka uległa awarii. Powiedzmy, że wiele innych części programu zależy od wstawionych danych, ale nie od tej konkretnej kolumny. Wolę więc zaryzykować błąd w bieżącym kroku przetwarzania zamiast kroku wstawiania. Dlatego nie chcę używać ograniczenia NOT NULL.
Naiwnie w zależności od NullPointerException
Mógłbym po prostu użyć danych tak, jakbym oczekiwał, że będą one zawsze tam istnieć (i tak powinno być naprawdę), i złapać powstałe NPE na odpowiednim poziomie (np. Tak, aby przetwarzanie bieżącego wpisu zostało zatrzymane, ale nie cały postęp przetwarzania ). Jest to zasada „szybko zawieść” i często ją preferuję. Jeśli to błąd, to dostaję zalogowany NPE.
Ale potem tracę zdolność rozróżniania różnych rodzajów brakujących danych. Np. W przypadku niektórych brakujących danych mógłbym je pominąć, ale w przypadku innych przetwarzanie powinno zostać zatrzymane, a administrator powiadomiony.
Sprawdzanie null
przed każdym dostępem i zgłaszanie niestandardowych wyjątków
Niestandardowe wyjątki pozwoliłyby mi zdecydować o właściwej akcji na podstawie wyjątku, więc wydaje się, że to właściwy sposób.
Ale co jeśli zapomnę gdzieś to sprawdzić? Następnie zaśmiecam mój kod zerowymi kontrolami, których nigdy lub rzadko się spodziewamy (a więc zdecydowanie nie są częścią logiki biznesowej).
Jeśli wybiorę tę drogę, jakie wzorce najlepiej pasują do tego podejścia?
Wszelkie uwagi i komentarze dotyczące moich podejść są mile widziane. Także lepsze rozwiązania dowolnego rodzaju (wzorce, zasady, lepsza architektura mojego kodu lub modeli itp.).
Edytować:
Jest jeszcze jedno ograniczenie, polegające na tym, że używam ORM do mapowania DB do obiektu trwałości, więc sprawdzanie wartości null na tym poziomie nie działałoby (ponieważ te same obiekty są używane w częściach, w których null nie wyrządza żadnej szkody) . Dodałem to, ponieważ w dotychczasowych odpowiedziach zarówno wspomniano tę opcję.