Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Programowanie kontraktowe w Javie Sławomir Moriak
20 maja 2010
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Spis treści 1
2
3
4
5 6
Programowanie kontraktowe Geneza Założenia Kontrakty w języku Eiffel Kontrakty a tworzenie oprogramowania Definiowanie specyfikacji Weryfikacja poprawności aplikacji Kontrakty a testy jednostkowe Wykorzystanie założeń kontraktów Kontrakty a Java Asercje Narzędzia wspierające programowanie kontraktowe w Javie Podsumowanie Demonstracja narzędzi Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Cele prezentacji
1
Przedstawienie koncepcji programowania kontraktowego
2
Poznanie narzędzi do CDD w javie
3
Przykład wykorzystania kontraktów
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Geneza Założenia Kontrakty w języku Eiffel
Kontrakt Kontrakt – Umowa między dwiema stronami: kupującym i sprzedającym dotycząca dostarczenia przez sprzedającego określonego dobra kupującemu w zamian za zatwierdzoną rekompensatę. Zawartość kontraktu Opis sprawy Warunki akceptacji Zasady zachowania kontraktu Warunki zerwania kontraktu
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Geneza Założenia Kontrakty w języku Eiffel
Wzmianki
Pierwsze wzmianki o programowaniu kontraktowym już w 1986 roku Bertrand Meyer - twórca języka Eiffel i propagator Design by Contract Contract Driven Development, Design by Contract, Contract Programming
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Geneza Założenia Kontrakty w języku Eiffel
Kontrakt w programowaniu
Przedstawienie warunków specyfikacji oprogramowania w postaci formalnie zdefiniowanych założeń działania aplikacji. Określanie już na wstępie warunków w jakich dana część kodu może być używana a w jakich nie. Zapewnienie spełniania podanych warunków przez metody w całym okresie tworzenia aplikacji.
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Geneza Założenia Kontrakty w języku Eiffel
Kontrakty w kodzie
Co oznacza uzycie kontraktów przy pisaniu programu? Definiowanie formalnych znanych z OCLa warunków wejściowych , wyjściowych i inwariantów (niezmienników) dla metod programowych i klas je zawierających. Preconditions Postconditions Invariants
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Geneza Założenia Kontrakty w języku Eiffel
Kontrakty w języku Eiffel
Eiffel językiem z natywnie zdefiniowanymi kontraktami Położenie dużego nacisku na definiowanie kontraktów jako nieodłącznych części kodu Instrukcje ’check’, ’require’, ’ensure’ jako odpowiednio inwarianty, pre i postconditions Inwarianty także dla warunków pętli (loop invariants)
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Formalne zdefiniowanie założeń działania aplikacji Specyfikacja programowa ubrana w kontrakty What does it expect? What does it guarantee? What does it maintain? Problem? Wymaga wiedzy programisty o kontekście działania klasy
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Jeden kontrakt opisuje wszystkie możliwe przypadki wykorzystania danej klasy. Może to być uznawane za pewną słabość praktyki, gdyż w przeciwieństwie do TDD nie pozwala na zagłębianie się w konkretne przypadki implementacji. Kontrakt jest jasno zdefiniowany i widoczny zarówno dla klienta jak i twórcy Aplikacje weryfikuje się tylko pod względem załozeń kontraktu
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Klient Nie musi sprawdzać wyjścia Kontrakt gwarantuje poprawność rezultatu Dba o zapewnienie poprawności danych wejściowych Dostawca Nie musi sprawdzać danych wejsciowych Kontrakt gwarantuje ich poprawność Zapewnia poprawny rezultat operacji
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Wykorzystanie założeń kontraktów
Kontrakt a test jednostkowy
Kontrakt opisuje generalny przypadek testowy dla obejmowanej klasy Definiuje wartości wejściowe parametrów metod Służy jako wyrocznia opisująca warunki poprawności rezultatów metod
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Wykorzystanie założeń kontraktów
Wspomaganie praktyki testów jednostkowych
Kontrakty jako pomocniczy element testowania jednostkowego Pomaga zdefiniować sensowne wartości wejściowe Określa kontekst wykorzystania klasy Ogranicza odpowiedzialność programisty - nie wychodzimy poza kontrakt Mozna na jego podstawie wyspecyfikować szczegółowe przypadki testowe
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
Asercje jako pseudokontrakty
Jak działają Pozwalają testować założenia programu w samym kodzie Składają się z keywordu assert i wyrażenia logicznego definiującego warunek działania programu Mogą wywoływać metody Niespełnienie warunku wyrzuca AssertionError Wstępnie mogą być wykorzystane do imitacji pre- postconditions i inwariantów
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
Asercje - Przykład
Asercje bezpośrednio w kodzie // assert that the absolute value is >= 0 assert ( number >= 0 && number = 0") == $old($this.balance)-amount $this.balance") amount);
} Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
contract4j contract4j - wady i zalety Proste i intuicyjne użycie Nie wymaga dużego nakładu pracy programisty Brak potrzeby uczenia się nowych technik pisania kodu Programista nie ma większej kontroli nad procesem sprawdzania kontraktów Konieczność podpinania pod projekt biblioteki aspektów W suchym Stringu ciężej można doszukać się błędów w opisie warunków
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
iContract
Podobne do contract4j Warunki zapisywane w dokumentacji klas i metod
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
iContract - Przykład /** * @inv !isEmpty() implies top() != null // no null objects */ public interface Stack { /** * @pre o != null * @post !isEmpty() * @post top() == o */ void push(Object o); /** * @pre !isEmpty() * @post @return == top()@pre */ Object pop(); ... Sławomir Moriak Programowanie kontraktowe w Javie }
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Asercje Narzędzia wspierające programowanie kontraktowe w Javie
iContract
iContract - wady i zalety Proste w użyciu Pomaga w stworzeniu i utrzymaniu pełnej dokumentacji metod Wsparcie dla kwantyfikatorów logicznych Możliwość zdefiniowania licznych odseparowanych warunków dla tej samej metody lub pola Ciężko doszukać się w komentarzu błędów
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Podsumowanie
Programowanie kontraktowe nie jest nowym podejsciem do tworzenia oprogramowania Pomaga w zapewnieniu spójności działania apliakcji z oczekiwaniami Ułatwia pracę i zmniejsza odpowiedzialność programisty Nie zastępuje testów jednostkowych ale je dopełnia
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Źródła
Power of Design By Contract, http://www.eiffel.com/developers/designb yc ontract.htmlRetoKrame iContract: design by contract in java, http://www.javaworld.com/javaworld/jw-02-2001/jw-0216cooltools.html C4J - CDD Java tool, http://c4j.sourceforge.net/ contract4j: Design by cotnract for Java, http://www.contract4j.org/contract4j
Sławomir Moriak
Programowanie kontraktowe w Javie
Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi
Demonstracja narzędzi
Przedstawienie uzycia bilbioteki contract4j jako narzedzia wspomagajacego wprowadzanie CDD w projekcie. Potrzebujemy: Eclipse IDE Aspect Development Tool for Eclipse www.eclipse.org/aspectj/ contract4j.jar www.contract4j.org/contract4j