Programowanie kontraktowe w Javie
Transkrypt
Programowanie kontraktowe w Javie
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 <= 10 ) : "bad number: " + number; Asercje w testach jednostkowych Assert.assertEquals(5, new Calc().add(2, 3)); 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 - Problemy Wymagają pisania asercji w każdej metodzie Ograniczona możliwość kontroli Mogą zostać wyłączone (domyślnie wyłączone) Mimo wszystko stanowią dobry punkt wyjścia do implementacji kontraktów w Javie. 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 Narzędzia CDD w Javie Ułatwiają wprowadzenie w życie programowania kontraktowego w języku Java. Przykładowe narzędzia C4J contract4j iContract Każde z nich reprezentuje inne rozwiązanie definiowania kontraktów w kodzie programów języka Java. 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 C4J Kontrakty jako klasy generyczne parametryzowane typem zakontraktowanej klasy Warunki pre, post i inwarianty jako metody z asercjami Enkapsulacja warunków kontraktu w tych metodach Dzięki parametryzacji klasy można odwoływać się do metod i pól zakontraktowanej klasy Wszystko pisane w standardowym kodzie Javy 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 C4J - Przykład @ContractReference(contractClassName = "DummyContract") public class Dummy { protected List m_stuff = new LinkedList(); public int addItem(Object item) { m_stuff.add(item); return m_stuff.size(); } } 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 C4J - Przykład public class DummyContract extends ContractBase<Dummy> { public DummyContract(Dummy target){ super(target); } public void classInvariant(){ assert m_target.m_stuff != null; } public void pre_addItem(Object item) { super.setPreconditionValue("list-size", m_target.m_stuff.size()); } public void post_addItem(Object item) { assert m_target.m_stuff.contains(item); int preSize = super.getPreconditionValue("list-size"); assert preSize == m_target.m_stuff.size() - 1; assert m_target.m_stuff.size() == super.getReturnValue(); } } 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 C4J C4J - Wady i zalety: Odseparowanie kodu klasy od kontraktów Kontrakty pisane w kodzie Javy – łatwa możliwość zmiany i odnajdywania błędów Możliwość wykorzystania mechanizmów Javy (np. dziedziczenia) na klasach kontraktów Dostępny plugin do eclipse Konieczność pisania dodatkowych linijek kodu 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 Rozwiazanie odmienne od poprzedniego Biblioteka zawierająca warunki Pre, Post i Invarianty jako adnotacje klas i metod W adnotacji w Stringu pisze się warunki logiczne uzywając składni javy i paru słow kluczowych ($old, $result etc.) Wykorzystuje zdobycze programowania aspectowego (AspectJ) Aspekty przy akzdym wywołaniu metody lub odwolaniu się do pola sprawdzają warunki je opisujące 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 - Przykład @Contract interface BankAccount { @Post("$return >= 0"); float getBalance(); @Pre("amount >= 0") @Post("$this.balance == $old($this.balance)+amount && $return == $this.balance") float deposit(float amount); @Pre("amount >= 0 && @Post("$this.balance && $return == float withdraw(float ... $this.balance { amount >= 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