Programowanie kontraktowe w Javie

Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi Prog...
Author: Maja Rogowska
28 downloads 2 Views 333KB Size
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

Definiowanie specyfikacji Weryfikacja poprawności aplikacji

Definiowanie specyfikacji

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

Definiowanie specyfikacji Weryfikacja poprawności aplikacji

Definiowanie specyfikacji - Zasady

Wazną zasadą łaczacą kontrakty z programowaniem obiektowym jest zasada dziedziczenia kontraktów. Klasa dziedzicząca kontrakt może: 1

Zachować lub “zacieśnić” warunki wejściowe metody

2

Zachować lub “poszerzyć” warunki wyjściowe metody

3

Zachować lub “zacieśnić” niezmienniki klasy

”require no more, promise no less”

Sławomir Moriak

Programowanie kontraktowe w Javie

Programowanie kontraktowe Kontrakty a tworzenie oprogramowania Kontrakty a testy jednostkowe Kontrakty a Java Podsumowanie Demonstracja narzędzi

Definiowanie specyfikacji Weryfikacja poprawności aplikacji

Weryfikacja poprawności aplikacji

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

Definiowanie specyfikacji Weryfikacja poprawności aplikacji

Zadania i benefity kienta i dostawcy

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

Sławomir Moriak

Programowanie kontraktowe w Javie