Właśnie zacząłem przeglądać "Debugowanie aplikacji MS .Net 2.0" Johna Robbinsa, i dezorientowałem się jego ewangelizacją dla Debug.Assert (...).Debug.Assert vs. Specific Thrown Exceptions
Wskazuje on, że dobrze wdrożony twierdzi przechowywania stanu, nieco, o wystąpieniu błędu, np:
Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");
Teraz osobiście wydaje się szalony do mnie, że on tak kocha przekształcenie jego testu bez przeprowadzenia prawdziwy rozsądny "logiki biznesowej" komentarz, być może "i < = 3 nigdy nie może się zdarzyć z powodu procesu klonowania się przed flobittyjam".
Sądzę, że dostaję Asserts jako rodzaj niskiego poziomu "Chrońmy swoje założenia", coś w rodzaju ... zakładając, że czujesz, że jest to test, który musisz wykonać tylko w debugowaniu - np. chroniąc siebie przed kolegami i przyszłymi programistami, mając nadzieję, że oni faktycznie przetestują rzeczy.
Ale to, czego nie rozumiem, mówi, że oprócz zwykłej obsługi błędów powinieneś używać twierdzeń; teraz wyobrażam sobie coś takiego:
Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}
Co zyskałem dzięki debugowaniu. Czy powtórzenie testu warunku błędu? Myślę, że mam to, gdybyśmy mówili o debugowania tylko dwukrotne sprawdzenie bardzo ważne obliczenia ...
double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");
... ale ja nie rozumiem do badań parametrów, które są na pewno warto sprawdzanie (zarówno w buildach DEBUG, jak i Release) ... lub nie. czego mi brakuje?
Asercje mogą być wykorzystywane do kontroli parametrów * wewnętrznej * połączeń metody (zwanego kodem należących do tego samego elementu) metody, w przeciwieństwie do zewnętrznych połączeń metody (nazywanych przez inny składnik) . Na przykład mogę stwierdzić, że parametr metody prywatnej typu Double nie jest NaN. – RoadWarrior
@ Chris: Podajesz, że asercje nie mają być używane do sprawdzania parametrów. Czy istnieje ku temu powód? Mam tendencję do zgłaszania wyjątków do sprawdzania parametrów, szczególnie w konstruktorach, gdy wstrzykiwam zależne obiekty. Jednak mówiono mi o używaniu Asercji. Nie mam logicznego wytłumaczenia dla używania wyjątków, a nie asercji. Czy jesteś w stanie wyjaśnić? Pozdrawiam –
Nie martw się, dowiedziałem się, dlaczego. Według Jona Skeeta http://stackoverflow.com/questions/1276308/exception-vs-assertion: "Używaj asercji dla wewnętrznych sprawdzeń logicznych w twoim kodzie oraz normalnych wyjątków dla warunków błędu poza kontrolą twojego bezpośredniego kodu." –