Obiekty, aspekty, komponentyflash.wwsi.edu.pl/wwsivideo/2007/pdf/16.05_walter... · 2010-07-21 ·...

Post on 18-Jul-2020

0 views 0 download

Transcript of Obiekty, aspekty, komponentyflash.wwsi.edu.pl/wwsivideo/2007/pdf/16.05_walter... · 2010-07-21 ·...

Obiekty, aspekty, komponenty

Obiekty, aspekty, komponenty

Bartosz Walter

Wprowadzenie do przedmiotu (2)

Rozdział zagadnień

Zasada rozdziału zagadnień (Separation of Concerns)

• program powinien być zdekomponowany w taki

sposób, aby różne jego aspekty znajdowały się w

dobrze odseparowanych od siebie modułach

• każdy aspekt zajmuje się jednym zagadnieniem

• zagadnienie to szczególny cel programu, koncepcja

albo funkcja

D. Parnas "On the criteria to be used in decomposing systems..." (1972)

G. Polya "How to Solve It?" (1973)

E. Dijkstra "A Discipline of Programming" (1976)

Wprowadzenie do przedmiotu (3)

Plan wykładu

Obiektowość

Aspekty Komponenty

Wprowadzenie do przedmiotu (4)

Plan wykładu

Obiektowość

Aspekty Komponenty

Wprowadzenie do przedmiotu (5)

Obiektowość

Hermetyzacja

Polimorfizm

Dziedziczenie

Abstrakcja

Elastyczność

ModularyzacjaPowtórne użycie

Odpowiedzialność

Obiekt

Wprowadzenie do przedmiotu (6)

Definicja 1

Obiekt w reprezentuje element świata rzeczywistego;

jest strukturą posiadającą tożsamość, stan (pola) i zachowanie

(metody).

Definicja 2

Obiekt w pełni odpowiada za pewien fragment świata rzeczywistego.

Sposób realizacji tej odpowiedzialności zależy od samego obiektu .

Czym jest obiekt?

Wprowadzenie do przedmiotu (7)

Przykład

Wykładowca przeprowadza egzamin. W zależności od oceny

oraz rodzaju egzaminu, za który została wystawiona, student

zalicza przedmiot, podchodzi do poprawki lub prosi o

zaliczenie warunkowe.

Wykładowca powinien każdemu studentowi, w zależności od

jego indywidualnej sytuacji, przekazać wskazówki dotyczące

dalszego postępowania.

Obiektowość a podejście strukturalne

na podstawie przykładu A. Shallowaya i J. Trotta

Wprowadzenie do przedmiotu (8)

Rozwiązanie 1

1. Utwórz listę studentów i ich ocen

2. Dla każdego studenta z listy

a) określ jego ocenę

b) określ dalszy sposób postępowania studenta

c) przekaż informacje studentowi

Obiektowość a podejście strukturalne

Wprowadzenie do przedmiotu (9)

Rozwiązanie 2

Wykładowca

1. Opublikuj listę studentów i ich ocen

2. Opublikuj informację o sposobie dalszego

postępowania w zależności od oceny

Student

1. Znajdź swoją ocenę na liście udostępnionej przez

Wykładowcę

2. Określ sposób postępowania na podstawie oceny

3. Postąp zgodnie z instrukcją

Obiektowość a podejście strukturalne

Wprowadzenie do przedmiotu (10)

Pojawiają się nowe wymagania...

• Studenci powtarzający przedmiot nie mają prawa do

egzaminu warunkowego

• Studenci niepełnosprawni mogą poprosić o jeszcze jeden

termin egzaminu

• Studenci z wymiany zagranicznej nie muszą zdawać tego

egzaminu, mogą wybrać inny

• ...

Obiektowość a podejście strukturalne

Wprowadzenie do przedmiotu (11)

Wnioski

Podział odpowiedzialności pozwolił

• uprościć algorytm

• zmniejszyć powiązania między obiektami

• zwiększyć otwartość systemu na zmiany

Obiektowość a podejście strukturalne

Wprowadzenie do przedmiotu (12)

Opis klasy

Klasa Nauczyciel

Odpowiedzialność

• zarządzanie kolekcją

• udostępnianie ocen

uczniom

Współdziałanie

• Kolekcja: dodawanie i

usuwanie ocen

• Uczeń: udostępnianie

ocen

Wprowadzenie do przedmiotu (13)

Spójność obiektu

Spójność obiektu (ang. cohesion)

• opis współpracy elementów obiektu

• stopień powiązania metod i pól obiektu przy wypełnieniu

nałożonej na niego odpowiedzialności

WniosekPrawidłowo zaprojektowana klasa jest spójna

A a

b

c

d e

Wprowadzenie do przedmiotu (14)

Powiązania między obiektami

Powiązania między obiektami (ang. coupling)

• opis zależności pomiędzy obiektami

• stopień powiązania obiektów, które nie są spokrewnione

WniosekNiski stopień powiązań wspiera abstrakcję i hermetyzację w systemie

A

B1

B2

Wprowadzenie do przedmiotu (15)

• Telefon należy do Użytkownika

• Telefon może zmienić Użytkownika, Użytkownik

może zmienić Telefon

• Użytkownik zna swój Telefon, Telefon nie wie, kto

jest jego właścicielem

• Istnienie Użytkownika nie ma wpływu na istnienie

Telefonu i vice wersa

TelefonUżytkownik +posiada

Asocjacja

Wprowadzenie do przedmiotu (16)

• Katalog zawiera Książki

• Książka może należeć do wielu Katalogów

jednocześnie

• Istnienie Katalogu nie ma wpływu na istnienie Książki

i vice versa

KsiążkaKatalog Książka

Agregacja

Wprowadzenie do przedmiotu (17)

• Książka składa się z Rozdziałów, Rozdział jest

częścią Książki

• Rozdział może należeć tylko do jednej Książki

• Istnienie Książki decyduje o istnieniu jej Rozdziałów

RozdziałKsiążkaKsiążka

Kompozycja

Wprowadzenie do przedmiotu (18)

Interfejsy

komunikator.zadzwon()Komunikator

zadzwon()odbierz()

Telefon Tel. komórkowy Tel. satelit.

WnioskiInterfejs mówi CO robi klasa, a nie W JAKI SPOSÓB.

Interfejs opisuje ROLĘ obiektu.

zadzwon()odbierz()

zadzwon()odbierz()

zadzwon()odbierz()

«Interface»

Wprowadzenie do przedmiotu (19)

Wielokrotne interfejsy

Komunikator

zadzwon()odbierz()

«Interface»

Telefon Tel. komórkowy Tel. satelit.

zadzwon()odbierz()

zadzwon()odbierz()

zadzwon()odbierz()

Komunikator

Komunikator komunikator = new TelefonKomorkowy();

komunikator.zadzwon();

Czasomierz

czas()

Zegarek

czas()

«Interface»

Wprowadzenie do przedmiotu (20)

Wielokrotne interfejsy

Komunikator

zadzwon()odbierz()

«Interface»

Telefon Tel. komórkowy Tel. satelit.

zadzwon()odbierz()

zadzwon()odbierz()

zadzwon()odbierz()

Czasomierz

Czasomierz czasomierz = new Zegarek();

czasomierz.czas();

Czasomierz

czas()

Zegarek

czas()

«Interface»

Wprowadzenie do przedmiotu (21)

Wielokrotne interfejsy

Komunikator

zadzwon()odbierz()

«Interface»

Telefon Tel. komórkowy Tel. satelit.

zadzwon()odbierz()

zadzwon()odbierz()

zadzwon()odbierz()

Czasomierz

Komunikator komorka = new TelefonKomorkowy();

Czasomierz komorka = new TelefonKomorkowy();

Czasomierz

czas()

Zegarek

czas()

«Interface»

Komunikator

Wprowadzenie do przedmiotu (22)

• Odrzutowiec jest rodzajem

Samolotu

• Odrzutowiec może

zastąpić Samolot

• Odrzutowiec posiada

niejawną instancję

Samolotu

• związek między

Odrzutowcem i Samolotem

jest nierozerwalny

Dziedziczenie

Wprowadzenie do przedmiotu (23)

Telefon

zadzwon()

odbierz()

Telefon kom.

zadzwon()

odbierz()

czas()

Komunikator

zadzwon()

odbierz()

• Telefon i Telefon kom. są

Komunikatorami. Oba obiekty

mogą inicjować i odbierać rozmowy

• Telefon i Telefon kom. współdzielą

tylko typ

Zegarek

czas()

Zegar ścienny

czas()

• Zegar ścienny jest rodzajem

Zegarka. Posiada wszystkie jego

cechy i działa tak samo

• Zegar ścienny dziedziczy zarówno

typ, jak i implementację

«Interface»

Dziedziczenie vs. użycie interfejsu

Wprowadzenie do przedmiotu (24)

Zegarek

czas()

Zegar ścienny

czas()

Zegar cyfr.

czas()

wyswietl()

Czasomierz

czas()

Zegar ścienny

czas()

Zegarek ręczny

czas()

wyswietl()

«Interface»

«Interface»

Wnioski

Dziedziczenie klas przekazuje podklasie typ i implementację

Dziedziczenie interfejsów dotyczy tylko typu

Dziedziczenie klas vs. dziedziczenie interfejsów

Wprowadzenie do przedmiotu (25)

Definicja 1

Hermetyzacja oznacza ukrywanie danych przed niepożądanym

dostępem

Definicja 2

Hermetyzacja oznacza ukrywanie każdej decyzji projektowej, która

może ulec zmianie: interfejsu, implementacji, zachowania metody,

danych

WniosekNależy identyfikować zmienność w systemie i hermetyzować ją

Hermetyzacja

Wprowadzenie do przedmiotu (26)

Przykład

Ocena może zmienić swoją wartość

Konstruktor tworzy ułomny obiekt

Ocena ocena = new Ocena();

ocena.ustawWartosc(Ocena.BDB);

Hermetyzacja danych (1)

Wprowadzenie do przedmiotu (27)

Przykład

Wykładowca wystawia oceny

Kto jeszcze może wystawić oceny?

Kolekcja oceny = nauczyciel.oceny();

oceny.dodaj(new Ocena(Ocena.BDB));

Hermetyzacja danych (2)

Wprowadzenie do przedmiotu (28)

Zadanie

Oceń jakość tego projektu

Wprowadzenie do przedmiotu (29)

Rozwiązanie

Wprowadzenie do przedmiotu (30)

Plan wykładu

Obiektowość

Aspekty Komponenty

Wprowadzenie do przedmiotu (31)

Rozdział zagadnień

Zasada rozdziału zagadnień (Separation of Concerns)

• program powinien być zdekomponowany w taki

sposób, aby różne jego aspekty znajdowały się w

dobrze odseparowanych od siebie częściach systemu

• każdy aspekt zajmuje się jednym zagadnieniem

• zagadnienie to szczególny cel programu, koncepcja

albo funkcja

D. Parnas "On the criteria to be used in decomposing systems..." (1972)

G. Polya "How to Solve It?" (1973)

E. Dijkstra "A Discipline of Programming" (1976)

Wprowadzenie do przedmiotu (32)

Nisza aspektowa

W programowaniu obiektowym

• system jest zbiorem współdziałających, samodzielnych i odpowiedzialnych jednostek – obiektów

• klasy ukrywają implementację, prezentując jedynie interfejsy

• polimorfizm jest podstawowym mechanizmem łączenia podobnych koncepcji

...ale jak prawidłowo zaimplementować cechy, które

przecinają wiele niespokrewnionych ze sobą obiektów?

Wprowadzenie do przedmiotu (33)

Podział wymagań

Wymagania systemowe(techniczne)

Wymagania podstawowe(biznesowe)

Wprowadzenie do przedmiotu (34)

Modularyzacja kodu

funkcje podstawowe

aspekt 1

aspekt 2

program obiektowy program aspektowy

Wprowadzenie do przedmiotu (35)

OOP a AOP

Programowanie obiektowe

• grupowanie podobnych koncepcji za pomocą hermetyzacji i dziedziczenia

• podstawowa jednostka modularyzacji: klasa

Programowanie aspektowe

• grupowanie podobnych koncepcji w niezwiązanych ze sobą klasach, niezależnie od dziedziczenia

• dodatkowy mechanizm modularyzacji: aspekt

Wprowadzenie do przedmiotu (36)

Język AspectJ

AspectJ

• G. Kiczales (2001), Xerox Palo Alto Research Center

• aspektowe rozszerzenie Javy

• aspekt jako specyficzna klasa

• możliwość zmiany zachowania i struktury kodu

• łączenie aspektów i klas na poziomie bajtkodu

• własny kompilator ajc

AspectJ

Java

Wprowadzenie do przedmiotu (37)

Aspekt (w języku AspectJ)

• specjalizowana klasa, która może przecinać inne klasy

• podlega dziedziczeniu

• jednostka modularyzacji (obok klasy)

• posiada typowe elementy klasy

• łączy punkty cięcia i porady

Aspekt.aj Aspekt.class

kompilacja

Aspekt

Wprowadzenie do przedmiotu (38)

Zasada działania AspectJ

aspekt

obiekt

weaver

aspekt

aspekt

obiektobiekt

pliki *.java

pliki *.aj

pliki *.class

Wprowadzenie do przedmiotu (39)

public class HelloWorld {

public static void hej(String tekst) {

System.out.println(tekst);

}

public static void hejKolego(String tekst, String imie) {

System.out.println(imie + ", " + tekst);

}

public static int hejLudzie(String tekst, String[] imiona) {

for (int i = 0; i < imiona.length; i++)

System.out.println(imiona[i] + ", " + tekst);

return imiona.length;

}

}

na podstawie przykładu R. Laddada (2002)

Prosty aspekt w AspectJ

Wprowadzenie do przedmiotu (40)

public aspect Maniery {

pointcut wywolanieHej () :

call(public static void HelloWorld.hej*(..));

before() : wywolanieHej() {

System.out.println("Dzień dobry!");

}

after() : wywolanieHej() {

System.out.println("Dziękuję!");

}

}

na podstawie przykładu R. Laddada (2002)

Prosty aspekt w AspectJ

Wprowadzenie do przedmiotu (41)

Punkty złączeń

Punkty złączenia (ang. joinpoints) są dowolnymi, identyfikowalnymi miejscami w programie.

Przykłady:

• wywołanie metody i konstruktora

• wykonanie metody i konstruktora

• dostęp do pola

• obsługa wyjątku

• statyczna inicjacja klasy

Wprowadzenie do przedmiotu (42)

Punkty cięcia

Punkt cięcia (ang. pointcut) jest zdefiniowaną kolekcją

punktów złączenia.

pointcut wywolanieHej () :

call(public static void HelloWorld.hej*(..));

nazwa punktu cięcia

definicja punktu złączenia

Wprowadzenie do przedmiotu (43)

Porada

Porada (ang. advice) jest fragmentem kodu programu

wykonywanym przed, po lub zamiast osiągnięcia przez

program punktu cięcia.

before() : call (public * Klasa.metoda(..)) {

// kod porady, który będzie wykonany przed

// wywołaniem metody metoda w klasie Klasa

}

punkt cięcia z określeniem momentu obsługi

brak kontekstu

Wprowadzenie do przedmiotu (44)

Rodzaje porad

Rodzaje porad w AspectJ

• before()

wykonywana tuż przed punktem cięcia

• after() {returning | throwing}

wykonywana tuż po punkcie cięcia (poprawnym lub

zgłaszającym wyjątek)

• around(context)

otaczająca punkt cięcia i decydująca o jego

wykonaniu lub nie

Wprowadzenie do przedmiotu (45)

Przykład: aspekt logujący wywołania metod

public aspect Logger {

pointcut wywolanieMetody() :

call(* * (..)) && ! within(Logger);

before() : wywolanieMetody() {

System.out.println("Przed wywołaniem metody "

+ thisJoinPoint.getSignature());

}

after() returning : wywolanieMetody() {

System.out.println("Po wywołaniu metody "

+ thisJoinPoint.getSignature());

}

after() throwing : wywolanieMetody() {

System.out.println("Metoda " +

thisJoinPoint.getSignature() + " zgłosiła wyjątek");

}

}

Wprowadzenie do przedmiotu (46)

Przykład: do czego służy ten aspekt?

Jaki jest efekt użycia tego aspektu?

aspect A {

before(): call(* *(..)) {

System.out.println("przed");

}

after(): call(* *(..)) {

System.out.println("po");

}

}

http://eclipse.org/aspectj

Wprowadzenie do przedmiotu (47)

Przykład: wersja 2

Jaki jest efekt użycia tego aspektu?

aspect A {

before(): call(* *(..)) {

System.out.println("przed");

}

after() returning: call(* *(..)) {

System.out.println("po");

}

}

http://eclipse.org/aspectj

Wprowadzenie do przedmiotu (48)

Przykład: wersja 3

Ta wersja nie posiada tej wady...

aspect A {

before(): call(* *(..)) && !within(A) {

System.out.println("przed");

}

after() returning: call(* *(..)) && !within(A) {

System.out.println("po");

}

}

http://eclipse.org/aspectj

Wprowadzenie do przedmiotu (49)

Plan wykładu

Obiektowość

Aspekty Komponenty

Wprowadzenie do przedmiotu (50)

Obiekty a komponenty

Programowanie

obiektowe

Programowanie

komponentowe

• łączenie obiektów w kodzie

programu

• późne wiązanie wywołań

• opcjonalna hermetyzacja

• użycie polimorfizmu

• użycie dziedziczenia klas

• łączenie przez konfigurację

• późne wiązanie wywołań i

ładowanie kodu na żądanie

• obowiązkowa hermetyzacja

• dziedziczenie interfejsów

• powtórne użycie na

poziomie binariów

Czego jeszcze brak obiektom?

Wprowadzenie do przedmiotu (51)

Komponent

Komponent jest

• podstawową jednostką oprogramowania

• z kontraktowo (deklaratywnie) opisanymi interfejsami, i

• podanymi wprost zależnościami.

Clemens Szyperski

"Oprogramowanie komponentowe. Obiekty to za mało" (1998)

Komponent może zostać skonfigurowany i wdrożony

niezależnie od programisty, który go stworzył.

Wprowadzenie do przedmiotu (52)

Własności komponentu

Podstawowe własności komponentu

• Komponenty nigdy nie sprawują kontroli nad sobą

– zasada hollywoodzka: proszę do nas nie dzwonić,

to my oddzwonimy...

• Kontener jest specjalnym elementem zarządzającym

wszystkimi komponentami

– steruje procesem tworzenia komponentami

– rozwiązuje zależności pomiędzy komponentami

– zarządza cyklem życia komponentów

Wprowadzenie do przedmiotu (53)

Przykład

Sprawny Samochód musi zawierać Silnik.

zawiera

Wprowadzenie do przedmiotu (54)

Tradycyjne rozwiązywanie zależności

komponent C

(Przyczepa)

komponent A

(Samochód)

komponent B

(Silnik)Klient

1. utwórz komponent A

3. utwórz komponent B

2. A zależy od B

4. zmontuj A i B

5. zwróć zmontowane

komponenty A i B

Wprowadzenie do przedmiotu (55)

Odwrócone rozwiązywanie zależności

Kon

tene

r za

rząd

zają

cy k

ompo

nent

ami

komponent C

(Przyczepa)

komponent A

(Samochód)

komponent B

(Silnik)Klient

1. utwórz komponent A

2. znajdź A

4. znajdź B

3. A zależy od B

5. zwróć komponent A

zmontowany z B

Wprowadzenie do przedmiotu (56)

Wybrane sposoby rozwiązywania zależności

Interface

injection

Komponenty implementują dedykowany interfejs,

poprzez który otrzymują obiekt służący do

wyszukiwania zależności

Setter

injection

Zależności są przekazywane przez właściwości

obiektu (metody setXXX() zgodne z konwencją

JavaBeans)

Wprowadzenie do przedmiotu (57)

Wyszukiwanie zależności poprzez interfejs

public interface Serviceable {

public void service(ServiceManager manager);

}

public class Samochod implements Serviceable {

private ServiceManager manager = null;

private Silnik silnik = null;

public void service(ServiceManager manager) {

this.manager = manager;

}

public void zbuduj() {

this.silnik = (Silnik) manager.lookup("Silnik");

}

}

Apache Avalon

Wprowadzenie do przedmiotu (58)

Wstrzykiwanie zależności przez właściwości

public class Samochod {

private Silnik silnik = null;

public Samochod() {

}

public void setSilnik(Silnik silnik) {

this.silnik = silnik;

}

}

KontenerSamochód -> Silnik -> Silnik1_6

Wprowadzenie do przedmiotu (59)

Odwrócenie sterowania

Odwrócenie sterowania

• pasywne API komponentu

• komunikacja przez interfejsy

• automatyczne spełnianie zależności

• przeniesienie odpowiedzialności za rozwiązanie zależności na kontener

Wprowadzenie do przedmiotu (60)

Podsumowanie

• Obiektowość jest podejściem do problemu modularyzacji programu

• Istotą obiektowości jest pojęcie odpowiedzialności

• Aspekty stanowią rozszerzenie obiektowości o nowy rodzaj jednostki

• Komponenty, w odróżnieniu od obiektów, są zewnętrznie konfigurowalne