Czy projektowanie na podstawie umowy (DbC) może być sposobem na programowanie defensywne?
Czy w niektórych przypadkach jeden sposób programowania jest lepszy od drugiego?
Czy projektowanie na podstawie umowy (DbC) może być sposobem na programowanie defensywne?
Czy w niektórych przypadkach jeden sposób programowania jest lepszy od drugiego?
Odpowiedzi:
Projektowanie na podstawie umowy i programowanie obronne są w pewnym sensie przeciwieństwami: w DbC definiujesz umowy między współpracownikami i programujesz przy założeniu, że współpracownicy honorują ich umowy. W programowaniu obronnym programujesz, zakładając, że współpracownicy naruszają ich umowy.
Rzeczywista funkcja pierwiastka kwadratowego napisana w stylu DbC stwierdziłaby w swojej umowie, że nie wolno przekazać liczby ujemnej, a następnie po prostu założyć, że nigdy nie napotka liczby ujemnej. Rzeczywista funkcja pierwiastka kwadratowego napisana obronnie zakłada, że jest ona przekazywana przez liczbę ujemną i podejmuje odpowiednie środki ostrożności.
Uwaga: oczywiście jest możliwe, że w DbC ktoś inny sprawdzi umowę. Na przykład w Eiffelu system kontraktu sprawdzałby liczbę ujemną w czasie wykonywania i generowałby odpowiedni wyjątek. W Spec #, sprawdzający twierdzenie sprawdzałby liczby ujemne w czasie kompilacji i nie udałby się kompilacji, jeśli nie może udowodnić, że procedura nigdy nie przejdzie liczby ujemnej. Różnica polega na tym, że programista nie sprawdza tego.
Czy projektowanie na podstawie umowy (DbC) może być sposobem na programowanie defensywne?
Tak.
„Programowanie defensywne” jest często pretekstem do marnowania czasu. Często marnuje czas na sprawdzanie rzeczy, które spowodują zwykłe wyjątki. Zamiast wyjątków zapisywane są dodatkowe instrukcje IF zamiast klauzul dotyczących obsługi wyjątków.
Zdefiniuj kontrakt i skończ z nim.
Gdy ktoś naruszy umowę, program - w normalnym toku wydarzeń - złamie i podniesie normalne wyjątki, z którymi normalnie można sobie poradzić.
„Defensywne programowanie” i „Zapobieganie błędom” mogą być wyświetlane w celu dodawania błędów (ponieważ same kontrole zapobiegania błędom są błędne), a nie zapobiegania błędom.
Obsługa wyjątków może wyciszyć, zarejestrować i obsłużyć wyjątek znacznie lepiej niż „Programowanie defensywne”.