czwartek, 22 sierpnia 2013

Asercje.

Przelatując przez przestrzeń zwaną "SCJP Sun Certified Programmer for Java 6" spotykam całkiem przyzwoitą liczbę tematów które opisują mechanizmy o których pojęcia nie miałem(w sumie to nic dziwnego, to tej pory nie przywiązywałem to "teorii" specjalnej uwagi, a to błąd, wielki). Dzisiaj pękł rozdział o m.in wyjątkach i ... asercjach.

Rozdział piąty to było właśnie moje pierwsze spotkanie z asercjami, i trochę na zasadzie notatki zamierzam je w tym poście opisać.
Asercje czym one są ? najprościej, jest to mechanizm umożliwiający nam sprawdzenie pewnego założenia, jego spełnienie nie powoduje nic, a niespełnienie obdarowuje nas AssertionError'em.
I właśnie o ten error chodzi :) bo pomimo tego że możemy go wyłapać, to nie robimy tego i dzięki temu mamy dobrze widoczny sygnał: "gościu coś poszło nie tak".
Przykład naprawdę prostego warunku z użyciem asercji wygląda mniej więcej tak: Autorzy książki wspomnianej wyżej dzielą rodzaje asercji na dwa typy, na proste i naprawdę proste(ciekawe nie ?). Przykłady drugiego("naprawdę prosty") to ten powyższy. Prosty daje nam jeszcze możliwość "dopisania" komentarza który pojawi się podczas wyrzucania AssertionError. Na przykład:
Asercji jako takich możemy używać także jako aktywnych komentarzy :) Wyglądają jakoś tak bardziej naturalnie od zwykłych //komentarzy. Na koniec w telegraficznym skrócie:
-Asercje dostępne są od wersji javy 1.4
-We wcześniejszych wersjach można używać słowa assert jako np: nazwy zmiennej, więc w przekładaniu historycznego kodu na bardziej "nowoczesny" mogą wystąpić problemy.
-Domyślnie asercje są "zdezaktywowane" - można je włączyć z poziomu konsoli: java -ea ...
-Bez problemu można je aktywować je dla danej klasy bądź katalogu.
-Używamy ich w metodach prywatnych. Przy ich pomocy nie sprawdzamy jednak argumentów podanych do metod publicznych bądź podanych przez "liczbę poleceń".

Więcej dobrych przykładów użycia można znaleźć tutaj:KLIK

5 komentarzy:

  1. Stosowanie assert poza testami jednostkowymi to tylko zaciemnia kod, ponieważ wszystkie warunki jakie Cię interesują wobec danej metody musisz wewnątrz niej wstawiać.

    OdpowiedzUsuń
  2. "Używamy ich w metodach prywatnych. Przy ich pomocy nie sprawdzamy jednak argumentów podanych do metod publicznych bądź podanych przez "liczbę poleceń"
    Testy dla metod prywatnych nie mają sensu, ponieważ o poprawności metod prywatnych świadczą testy metod publicznych.

    OdpowiedzUsuń
  3. http://programmers.stackexchange.com/questions/138951/asserting-in-public-methods
    Pierwszy post z góry, dzięki.

    OdpowiedzUsuń
  4. No dobrze, ale co tak naprawdę zyskasz stawiając assert wewnątrz funkcji prywatnej? Przecież assert w produkcyjnym użyciu traci na swym znaczeniu.

    OdpowiedzUsuń
  5. "Przecież assert w produkcyjnym użyciu traci na swym znaczeniu." - ale co one mają robić w kodzie produkcyjnym skoro służą tylko do testów ?

    OdpowiedzUsuń