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

Podobne dokumenty