Obiekty, aspekty, komponentyflash.wwsi.edu.pl/wwsivideo/2007/pdf/16.05_walter... · 2010-07-21 ·...
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