W zeszłym tygodniu mieliśmy gorącą dyskusję na temat obsługi wartości NULL w warstwie usług naszej aplikacji. Pytanie dotyczy kontekstu .NET, ale będzie tak samo w Javie i wielu innych technologiach.
Pytanie brzmiało: czy zawsze powinieneś sprawdzać wartości zerowe i sprawiać, by kod działał bez względu na wszystko, czy pozwolić, aby wyjątek pojawił się, gdy nieoczekiwanie otrzymano wartość zerową?
Z jednej strony sprawdzanie, czy null nie jest oczekiwany (tzn. Nie ma interfejsu użytkownika do obsługi), jest moim zdaniem równoznaczne z pisaniem bloku try z pustym zapisem. Po prostu ukrywasz błąd. Błąd może polegać na tym, że coś zmieniło się w kodzie, a wartość null jest teraz oczekiwaną wartością lub występuje inny błąd i niepoprawny identyfikator jest przekazywany do metody.
Z drugiej strony sprawdzanie wartości zerowych może być ogólnie dobrym nawykiem. Co więcej, jeśli pojawi się czek, aplikacja może kontynuować pracę, a tylko niewielka część funkcjonalności nie ma żadnego wpływu. Następnie klient może zgłosić mały błąd, taki jak „nie można usunąć komentarza” zamiast znacznie poważniejszego błędu, np. „Nie można otworzyć strony X”.
Jaką praktykę stosujesz i jakie są twoje argumenty za lub przeciw obu podejściom?
Aktualizacja:
Chcę dodać trochę szczegółów na temat naszej konkretnej sprawy. Pobieraliśmy niektóre obiekty z bazy danych i przetwarzaliśmy je (powiedzmy, stwórzmy kolekcję). Deweloper, który napisał kod, nie przewidział, że obiekt może mieć wartość NULL, więc nie uwzględnił żadnych kontroli, a gdy strona została załadowana, wystąpił błąd i cała strona się nie załadowała.
Oczywiście w tym przypadku powinna była nastąpić kontrola. Następnie wdaliśmy się w spór o to, czy każdy przetwarzany obiekt powinien zostać sprawdzony, nawet jeśli nie ma go brakować, i czy ewentualne przetwarzanie powinno zostać po cichu przerwane.
Hipotetyczną korzyścią byłoby kontynuowanie działania strony. Pomyśl o wynikach wyszukiwania na Stack Exchange w różnych grupach (użytkownicy, komentarze, pytania). Metoda może sprawdzić wartość NULL i przerwać przetwarzanie użytkowników (które z powodu błędu mają wartość NULL), ale zwraca sekcje „komentarze” i „pytania”. Strona będzie nadal działać, z wyjątkiem braku sekcji „Użytkownicy” (co jest błędem). Czy powinniśmy wcześnie ponieść porażkę i zepsuć całą stronę, czy kontynuować pracę i czekać, aż ktoś zauważy, że brakuje sekcji „Użytkownicy”?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");