Można i prawdopodobnie należy zaprojektować z myślą o sprawach z null
. Na przykład w domenie z problemem, kiedy ma sens, aby metody klas powróciły: null
? Kiedy ma sens wywoływanie funkcji z argumentami null
?
Ogólnie rzecz biorąc, może być korzystne usunięcie odniesień z kodu null
z kodu, gdy tylko jest to możliwe. Innymi słowy, możesz zaprogramować na niezmiennym, że "nie będzie tutaj wartości zerowej ... ani tam". Ma to wiele zalet. Nie będziesz musiał zamazywać kodu przez zawijanie metod w deref_or_throw
. Możesz osiągnąć więcej semantycznego znaczenia z kodu, ponieważ, jak często są rzeczy w rzeczywistym świecie? Twój kod może być bardziej czytelny, jeśli użyjesz wyjątków, aby wskazać błędy zamiast wartości null
. I na koniec redukujesz potrzebę sprawdzania błędów, a także zmniejszasz ryzyko błędów czasu wykonywania (dreaded zerowy wskaźnik dereferencji).
Jeśli system nie został zaprojektowany z myślą null
przypadkach, powiedziałbym, że najlepiej zostawić to w spokoju i nie zwariować zawijania wszystko z deref_or_throw
. Być może podejmij podejście Agile. Podczas kodowania przejrzyj umowy, które twoje obiekty klasy oferują jako usługi. Jak często można rozsądnie oczekiwać, że umowy te zwrócą null
? Jaka jest wartość semantyczna null
w tych przypadkach?
Prawdopodobnie można zidentyfikować klasy w systemie, które mogą być rozsądnie oczekiwane, aby zwrócić null
. Dla tych klas, null
może być prawidłową logiką biznesową, a nie drobnymi sprawami wskazującymi na błędy implementacji. W przypadku klas, które mogą zostać zwrócone null
, dodatkowa kontrola może być warta bezpieczeństwa. W tym sensie sprawdzenie, czy dane są bardziej logiczne, niż szczegóły dotyczące implementacji niskiego poziomu. Jednak na całej planszy systematyczne zawijanie całego wskaźnika oceny w deref_or_throw
może być lekarstwem, które jest jego własną trucizną.
Czy istnieje jakiś kod, który faktycznie zajmuje się sprawą 'nullptr'? Na przykład. coś w stylu 'if (! obj) {std :: cout <<" Null, ale nadal w porządku, kontynuując coś znaczącego \ n "; } else {std :: cout << "Non-Null, robiąc coś innego \ n"; } '. Czy też przypadek 'nullptr' jest zawsze" wyjściem, ponieważ jest to błędne "-ścieżka? – stefan
Ten kod istnieje, ale jest rzadki. W większości przypadków po prostu nie możemy kontynuować. Nic nie możemy zrobić. Cała procedura jest bez znaczenia. Więc może istnienie tego obiektu to _warunek_? I muszę to sprawdzić, a następnie ręcznie usunąć zaznaczenie wskaźnika bez martwienia się? – Mikhail
Dokładnie to właśnie trzeba wyjaśnić dla siebie, imho. Jeśli jest to warunek konieczny, być może "assert" jest lepszym rozwiązaniem. W przeciwnym razie jest to rzecz wyjątkowa (0,01% jest dość wyjątkowa), więc odpowiedni jest "wyjątek". Afaik, nie ma czegoś takiego w bibliotece. – stefan