Debuguję z punktami przerwania i zdaję sobie sprawę z wywołania assert? Myślałem, że to tylko do testów jednostkowych. Co robi więcej niż punkt przerwania? Skoro mogę ustawić punkt przerwania, dlaczego powinienem używać funkcji Assert?
156
Odpowiedzi:
W kompilacji debugowania
Assert
przyjmuje warunek logiczny jako parametr i wyświetla okno dialogowe błędu, jeśli warunek jest fałszywy. Program przebiega bez przerwy, jeśli warunek jest spełniony.Jeśli kompilujesz w Release, wszystkie
Debug.Assert
są automatycznie pomijane.źródło
Debug.Assert
w trybie wydania?Od kodu kompletnego
źródło
Powinieneś go używać w sytuacjach, gdy nie chcesz, aby punkt przerwania był potrzebny w każdym małym wierszu kodu, aby sprawdzić zmienne, ale chcesz uzyskać informacje zwrotne, jeśli występują pewne sytuacje, na przykład:
źródło
System.Diagnostics
Assert daje również kolejną okazję do chichotania z umiejętności projektowania interfejsu użytkownika firmy Microsoft. Mam na myśli: okno dialogowe z trzema przyciskami Przerwij, Ponów, Ignoruj i wyjaśnienie, jak je interpretować na pasku tytułowym!
źródło
Assert umożliwia potwierdzenie warunku (post lub pre) w kodzie. Jest to sposób na udokumentowanie twoich zamiarów i poinformowanie debuggera za pomocą okna dialogowego, jeśli twój zamiar nie zostanie spełniony.
W przeciwieństwie do punktu przerwania, Assert idzie z twoim kodem i może służyć do dodawania dodatkowych szczegółów na temat twojego zamiaru.
źródło
Assert może pomóc w oddzielnym przekazywaniu komunikatów między testowaniem a wydaniem. Na przykład,
Debug.Assert(x > 2)
spowoduje przerwanie tylko w przypadku uruchamiania kompilacji „debugowania”, a nie kompilacji wydania. Jest pełen przykładem takiego zachowania tutaj
źródło
Przede wszystkim
Assert()
metoda jest dostępna dla klasTrace
iDebug
.Debug.Assert()
jest wykonywany tylko w trybie debugowania.Trace.Assert()
jest wykonywany w trybie debugowania i wydania.Oto przykład:
Uruchom ten kod w trybie debugowania, a następnie w trybie wydania.
Zauważysz, że w trybie debugowania
Debug.Assert
instrukcja kodu nie powiedzie się, pojawi się okno komunikatu pokazujące bieżący ślad stosu aplikacji. Nie dzieje się to w trybie wydania, ponieważTrace.Assert()
warunek jest prawdziwy(i == 4)
.WriteLine()
metoda po prostu zapewnia opcję rejestrowania informacji w danych wyjściowych programu Visual Studio.źródło
Twierdzenia są często widoczne w Design by Contract (DbC), które, jak rozumiem, zostały wprowadzone / zatwierdzone przez Meyer, Bertand. 1997. Konstrukcja oprogramowania zorientowanego obiektowo.
Ważną cechą jest to, że nie mogą one wywoływać skutków ubocznych, na przykład możesz obsłużyć wyjątek lub podjąć inne działanie za pomocą instrukcji if (programowanie obronne).
Asercje służą do sprawdzenia warunków przed / po kontrakcie, relacji klient / dostawca - klient musi upewnić się, że spełnione są warunki wstępne dostawcy np. wysyła 5 GBP, a dostawca musi zapewnić spełnienie warunków końcowych, np. dostarcza 12 róż. (Proste wyjaśnienie klienta / dostawcy - może przyjąć mniej i dostarczyć więcej, ale o twierdzeniach). C # wprowadza również Trace.Assert (), którego można użyć do wydania kodu.
Aby odpowiedzieć na pytanie, tak, nadal są przydatne, ale mogą zwiększyć złożoność + czytelność kodu i czas + trudne w utrzymaniu. Czy nadal powinniśmy ich używać? Tak, czy wszyscy ich użyjemy? Prawdopodobnie nie, lub nie w takim zakresie, w jakim opisuje to Meyer.
(Nawet kurs OU Java, na którym nauczyłem się tej techniki, pokazywał tylko proste przykłady, a reszta kodu nie wymuszała reguł asercji DbC w większości kodu, ale zakładano, że jest używany do zapewnienia poprawności programu!)
źródło
Sposób, w jaki o tym myślę, to Debug.Assert to sposób na ustalenie kontraktu określającego sposób wywołania metody, skupiający się na szczegółach dotyczących wartości parametru (zamiast tylko typu). Na przykład, jeśli nie masz wysyłać wartości null w drugim parametrze, dodajesz Assert wokół tego parametru, aby poinformować konsumenta, aby tego nie robił.
Zapobiega to używaniu twojego kodu w sposób bezczelny. Ale pozwala również na przejście do produkcji i nie przekazanie nieprzyjemnej wiadomości klientowi (zakładając, że zbudujesz wersję Release).
źródło