Na stronie comp.lang.c ++. Moderowana jest dyskusja na temat tego, czy asercje, które w C ++ istnieją domyślnie tylko w kompilacjach do debugowania, powinny być utrzymywane w kodzie produkcyjnym, czy nie.
Oczywiście każdy projekt jest wyjątkowy, więc moje pytanie nie dotyczy tego, czy należy zachować asercje, ale w jakich przypadkach jest to zalecane / nie jest to dobry pomysł.
Przez twierdzenie mam na myśli:
- Sprawdzenie w czasie wykonywania, które testuje warunek, który, jeśli jest fałszywy, ujawnia błąd w oprogramowaniu.
- Mechanizm zatrzymywania programu (może po naprawdę minimalnym czyszczeniu).
Niekoniecznie mówię o C lub C ++.
Osobiście uważam, że jeśli jesteś programistą, ale nie jesteś właścicielem danych (co ma miejsce w przypadku większości komercyjnych aplikacji komputerowych), powinieneś je włączyć, ponieważ błędne stwierdzenie pokazuje błąd i nie powinieneś iść z błędem, z ryzykiem uszkodzenia danych użytkownika. Zmusza to do zdecydowanego przetestowania przed wysyłką i sprawia, że błędy są bardziej widoczne, a tym samym łatwiejsze do wykrycia i naprawienia.
Jaka jest Twoja opinia / doświadczenie?
Twoje zdrowie,
Carl
Zobacz powiązane pytanie tutaj
Odpowiedzi i aktualizacje
Hej Graham,
Stwierdzenie jest błędem, czystym i prostym i dlatego powinno być traktowane jak jedno. Ponieważ błąd powinien być obsługiwany w trybie wydania, tak naprawdę nie potrzebujesz asercji.
Dlatego wolę słowo „błąd”, gdy mówię o asercjach. To sprawia, że wszystko jest znacznie jaśniejsze. Dla mnie słowo „błąd” jest zbyt niejasne. Brakujący plik jest błędem, a nie błędem i program powinien sobie z tym poradzić. Próba wyłuskania pustego wskaźnika jest błędem, a program powinien przyznać, że coś pachnie jak zepsuty ser.
Dlatego należy przetestować wskaźnik z asercją, ale obecność pliku z normalnym kodem obsługi błędów.
Nieco nie na temat, ale ważny punkt w dyskusji.
Jako ostrzeżenie, jeśli twoje asercje włamują się do debugera, gdy zawodzą, dlaczego nie. Ale jest wiele powodów, dla których plik nie może istnieć, a które są całkowicie poza kontrolą twojego kodu: prawa do odczytu / zapisu, pełny dysk, odłączone urządzenie USB itp. Ponieważ nie masz nad nim kontroli, uważam, że nie jest właściwym sposobem radzenia sobie z tym.
Carl
Tomasz,
Tak, mam Code Complete i muszę powiedzieć, że zdecydowanie nie zgadzam się z tą konkretną radą.
Powiedzmy, że niestandardowy alokator pamięci spieprzy i zeruje fragment pamięci, który jest nadal używany przez inny obiekt. Zdarza mi się wyzerować wskaźnik, który regularnie odwołuje się do tego obiektu, a jednym z niezmienników jest to, że ten wskaźnik nigdy nie jest zerowy i masz kilka twierdzeń, aby upewnić się, że tak pozostanie. Co zrobisz, jeśli wskaźnik nagle stanie się pusty. Po prostu jeśli () go otaczasz, mając nadzieję, że to zadziała?
Pamiętaj, że mówimy tutaj o kodzie produktu, więc nie ma potrzeby włamywania się do debuggera i sprawdzania stanu lokalnego. To jest prawdziwy błąd na komputerze użytkownika.
Carl