Wiele z moich doświadczeń dotyczy systemów ze stosunkowo ograniczonym dostępem, w których niepożądane nadpisywanie kodu jest niepożądane. Tak więc moim własnym instynktem jest użycie twierdzeń typu debug-only lub całkowite ich pominięcie. Można mieć nadzieję, że wszelkie potencjalne nieprawidłowe dane pojawią się podczas testowania wywołującego, który podaje złe wartości, więc pod warunkiem, że testujesz w trybie debugowania, a także w trybie zwolnienia, zobaczysz diagnostykę. W przeciwnym razie debugujesz awarię, kiedy to się wydarzy.
Jeśli rozmiar kodu i wydajność nie mają znaczenia (a prawie we wszystkich kodach proste sprawdzenie wartości zerowej lub zakresu nie wpływa na wydajność), to im więcej twierdzi, że zostawisz kod w trybie zwolnienia, tym większa szansa mieć możliwość diagnozowania usterek bez potrzeby ponownego tworzenia błędu w trybie testowym. To może być duża oszczędność czasu. W szczególności, jeśli Twój produkt jest biblioteką, znaczna część raportów "błędów" jest spowodowana błędami klientów, więc żadna ilość testów przed wydaniem nie może ich powstrzymać w środowisku naturalnym. Im szybciej udowodnisz klientowi, że jego kod jest błędny, tym szybciej mogą go naprawić i możesz wrócić do znajdowania własnych błędów.
Mimo to w języku C/C++ stwierdzam, że szczególny przypadek sprawdzania wskaźników zerowych jest jedynie pomniejszą pomocą. Jeśli ktoś poda ci wskaźnik, wtedy warunek pełnej ważności nie jest "nie może być zerowy". Musi wskazywać na pamięć, którą można odczytać (być może również można zapisać) przez bieżący proces do pewnego rozmiaru i zawiera poprawny typ obiektu, prawdopodobnie w pewnym podzbiorze wszystkich możliwych stanów. Nie musi zostać zwolniony, aby nie zostać usuniętym przez przepełnienie bufora w innym miejscu, prawdopodobnie nie być jednocześnie modyfikowanym przez inny wątek, itp. Nie będziesz testował tego wszystkiego przy wprowadzaniu metody, więc nadal możesz pominąć nieprawidłowe parametry. Wszystko, co prowadzi ciebie lub innych programistów do myślenia "ten wskaźnik nie jest pusty, więc musi być ważny", ponieważ przetestowałeś tylko jedną małą część warunku ważności, jest mylący.
Jeśli w ogóle przejeżdżasz przez wskaźnik, oznacza to, że jesteś już na terytorium, na którym musisz zaufać rozmówcy, aby nie dawał ci śmieci. Odrzucenie jednej konkretnej instancji śmieci nadal pozostawia Tobie zaufanie, że osoba dzwoniąca nie da ci żadnego z niezliczonych śmieci, które mogą wykreować, które są trudniejsze do wykrycia.Jeśli zauważysz, że wskaźniki zerowe są typowym śmieciem od twoich konkretnych rozmówców, to na wszelki wypadek testuj je, ponieważ oszczędza czas diagnozowania błędów w innym miejscu systemu. To zależy od oceny, czy znalezienie błędów w kodzie wywołującym z objawem "przekazuje mi wskaźnik zerowy" jest warte wzdrygnięcia twojego własnego kodu (być może w rozmiarze binarnym, a na pewno w źródle): jeśli takie błędy są rzadkie, to ty " Prawdopodobnie tracisz czas i sprawdzasz, czy nieruchomość jest dla nich sprawdzana.
Oczywiście w niektórych językach nie można przejść do wskaźnika, a osoba wywołująca ma ograniczone możliwości uszkodzenia pamięci, więc jest mniej miejsca na śmieci. Ale na przykład w Javie przekazywanie niewłaściwego obiektu jest nadal częstszym błędem programowania niż błędnym zerem. Wartości null są zwykle dość łatwe do zdiagnozowania, jeśli zostawisz je w środowisku wykonawczym do wykrycia i spojrzysz na stos. Tak więc wartość sprawdzania zerowego jest nawet ograniczona. W C++ i C# można używać pass-by-reference, gdzie wartości null byłyby zabronione.
To samo dotyczy innych konkretnych nieprawidłowych danych wejściowych, na które można przetestować i dowolnego języka. Pełne testowanie przed i po kondycji (jeśli to możliwe) jest oczywiście inną kwestią, ponieważ jeśli możesz przetestować całą umowę na połączenie, to jesteś na dużo silniejszym gruncie. A jeśli możesz użyć tkactwa lub czegokolwiek, by uzyskać umowy bez dodawania kodu źródłowego samej funkcji, to nawet lepiej.