1 Metody obiektowe Bartosz Walter Szkolenie InMoST 21 lutego 2006
2 Różne aspekty obiektowości Hermetyzacja Polimorfizm Dziedziczenie Abstrakcja Elastyczność Modularyzacja Powtórne użycie Odpowiedzialność Łatwość modyfikacji
3 Obiekt Definicja 1 (tradycyjna) Obiekt reprezentuje jednostkę lub stan obecny w świecie rzeczywistym: samochód, człowieka, wypożyczenie książki; Obiekt przechowuje dane i definiuje sposób operowania na tych danych. Definicja 2 (obiektowa) Obiekt jest jednostką odpowiedzialną za pewien obszar modelu. Posiada wszelkie środki do podjęcia tej odpowiedzialności.
4 Przykład: Wykładowca na konferencji Problem (Shalloway&Trott 2004) Wykładowca prowadzi wykład na konferencji. Po jego zakończeniu słuchacze zamierzają wysłuchać kolejnych prezentacji, jednak nie wiedzą gdzie one się odbywają. Każdy słuchacz może uczestniczyć w innym wykładzie. Zadaniem wykładowcy jest przekazanie informacji każdemu ze słuchaczy, gdzie odbywa się interesujący go wykład. Słuchacze dzielą się na różne grupy, które chcą przed udaniem się na kolejny wykład załatwić inne sprawy.
5 Przykłąd: Wykładowca na konferencji (cd.) Rozwiązanie 1 (strukturalne) 1.Utwórz listę uczestników wykładu 2.Dla każdego uczestnika z listy: a)znajdź kolejny wykład, w którym chce on uczestniczyć b)znajdź jego lokalizację c)przekaż uczestnikowi wskazówki, jak tam się dostać Potrzebne procedury 1.Utworzenie listy uczestników 2.Pobranie planu każdego uczestnika 3.Znalezienie drogi do kolejnego miejsca 4.Główna procedura koordynująca pozostałe
6 Przykład: Wykładowca na konferencji (cd.) Rozwiązanie 2 (obiektowe) Udostępnij dla wszystkich słuchaczy plan budynku Pozwól uczestnikom samodzielnie znaleźć kolejny wykład Algorytm wykładowcy 1.Utwórz listę uczestników 2.Dla każdego uczestnika a)Poproś go o samodzielne znalezienie drogi Algorytm uczestnika 1.Znajdź lokalizację kolejnego wykładu 2.Znajdź drogę do tej lokalizacji 3.Idź
7 Przykład: Wykładowca na konferencji (cd.)
8
9 Odpowiedzialność Wilhelm......................... (1288-1349)
10 Odpowiedzialność Ockham Wilhelm Ockham (1288-1349) Non sunt multiplicanda entia sine necessitate Bytów nie należy mnożyć ponad potrzebę
11 Błędy w przypisaniu odpowiedzialności Za duża obiekty pełnią jednocześnie wiele ról, posiadają zbyt wiele obszarów, za które są odpowiedzialne występują konflikty w stosowaniu dziedziczenia wysoki poziom powiązań pomiędzy obiektami utrudnione testowanie Za mała dużo małych obiektów o nieokreślonej odpowiedzialności zbytnia abstrakcja rozmyta odpowiedzialność
12 Abstrakcja Abstrakcja Zdolność programu do ignorowania niektórych aspektów informacji którymi manipuluje, i skupienia się na najważniejszych. Każdy obiekt w systemie jest modelem abstrakcyjnego elementu, który może wykonywać pewne czynności, zmieniać swój stan i informować o tym, a jednocześnie także komunikować się z innymi obiektami w systemie bez ujawniania w jaki sposób te cechy zostały zaimplementowane.
13 Polimorfizm Polimorfizm poly (gr. wiele ) morph (gr. postać ) – jednoczesne istnienie wielu postaci tej samej metody i możliwość wyboru jednej z tych postaci możliwość traktowania konkretnego obiektu jako ogólnej, abstrakcyjnej jednostki posiadającej pewną odpowiedzialność (interfejs), ale nie ujawniającej swojej implementacji Polimorfizm w Javie Klasy abstrakcyjne i ich klasy potomne (polimorfizm "pionowy") Interfejsy i ich implementacje (polimorfizm "poziomy") Typy generyczne w Java 5 SE (polimorfizm parametryczny)
14 Interfejsy mojTelefon. call () Interfejs: widoczna część klasy, która definiuje jej odpowiedzialność Zasada 1 Stosowanie interfejsów poprawia abstrakcję i hermetyzację.
15 Wielokrotne interfejsy Phone Phone mojTelefon = new WirePhone(); mojTelefon.call();
16 Wielokrotne interfejsy Phone Phone mojTelefon = new MobilePhone(); mojTelefon.call();
17 Wielokrotne interfejsy Clock Clock mojZegar = new Watch() ; mojZegar.call();
18 Wielokrotne interfejsy Clock Clock mojZegar = new MobilePhone(); mojZegar.call();
19 Dziedziczenie a interfejsy WirePhone i MobilePhone są typu Phone. Oba telefony mogą zadzwonić i odebrać rozmowę, ale... ...zachowują się zupełnie inaczej. WallClock jest rodzajem Watch. Zachowuje się i wygląda niemal identycznie jak Watch. WallClock dziedziczy typ i implementację.
20 Dziedziczenie klas a implementowanie interfejsów Dziedziczenie klas: przekazuje typ i implementację Implementacja interfejów: przekazuje tylko typ
21 Dziedziczenie a kompozycja Zasada 2 Jeżeli to możliwe, należy preferować kompozycję nad dziedziczenie. DziedziczenieKompozycja nie można zmodyfikować relacji zapobiega wyjątkom NullPointerException przekazuje podklasom zarówno typ (interfejs) jak i implementację ujawnia szczegóły implementacji nadklasy podklasom można swobodnie modyfikować relację nie ma pewności, czy związany relacją obiekt istnieje każdy obiekt zna tylko typ (interfejs) drugiego obiektu
22 Hermetyzacja Definicja 2 (szersza) Hermetyzacja dotyczy ukrywania wszelkich decyzji projektowych, które mogą ulec zmianie: typu klasy, jej implementacji, zachowania i danych Zasada 3 Należy identyfikować zakres zmienności i hermetyzować go w postaci klasy, metody polimorficznej etc. Definicja 1 (popularna) Hermetyzacja dotyczy ukrywania dostępu z zewnątrz do danych
23 Hermetyzacja typu Przykład Collection zarządza Attendees, ignorując podział na klasy Student i Professional W ten sposób klasa Attendee chroni swoje typy pochodne przed dostępem z zewnątrz.
24 Hermetyzacja obiektu Przykład tylko Collection odwołuje się do Attendees; Lecturer nic nie wie o ich istnieniu i sposobie odwoływania się do nich
25 Hermetyzacja danych Przykład Attendees nie powinni zmieniać swoich nazwisk Tworzenie nieważnych obiektów powinno być zabronione. Attendee uczestnik = new Attendee(); // nowy "pusty" uczestnik uczestnik.setName(”Smith”); // a teraz zmieniamy jego nazwisko
26 Hermetyzacja danych Attendee uczestnik = new Attendee(”Smith”); // ten uczestnik to Smith Przykład Attendees nie powinni zmieniać swoich nazwisk Tworzenie nieważnych obiektów powinno być wprost zabronione.
27 Hermetyzacja kolekcji Gdzie tkwi błąd? Collection uczestnicy = wykladowca.getAttendees(); uczetnicy.add(new Attendee(”George Bush”)); // możliwa modyfikacja uczestnicy.remove(new Attendee(”Tony Blair”)); // możliwa modyfikacja
28 Hermetyzacja kolekcji Collection uczestnicy = wykladowca.getAttendees(); uczestnicy.add(new Attendee(”George Bush”)); // wyjątek, nie można // modyfikować wykladowca.add(new Attendee(”George Bush”)); // OK
29 Spójność obiektu Spójność Spójność obiektu lub klasy określa stopień powiązań pomiędzy elementami (metodami, polami) tej klasy. Spójna klasa to taka, której metody są blisko ze sobą związane, a zatem odpowiedzialność klasy jest jasno określona. Brak spójności oznacza, że klasa wykonuje różne, niezwiązane ze sobą zadania, a zatem prawdopodobnie powinna być podzielona. Zasada 4 Dobrze zaprojektowana klasa jest spójna, ponieważ hermetyzuje potencjalne zmiany w obszarze, za który odpowiada.
30 Powiązania Powiązanie Powiązanie między dwoma klasami/obiektami opisuje zależność pomiędzy nimi. Klasa A jest powiązana z klasą B, jeżeli A musi posiadać pewną wiedzę o B: jako jej pole składowe, jako implementacja interfejsu, jako podklasa, jako parametr, typ metody albo wyjątek. Zasada 5 Należy utrzymywać luźne powiązania pomiędzy obiektami, tak aby wiedziały o sobie jak najmniej. Nadmierne powiązania między obiektami ograniczają możliwość ich modyfikacji.
31 Karta CRC ( Class-Responsibility-Collaboration ) Klasa: Nazwa klasy Odpowiedzialność: Za jaki obszar klasa odpowiada? Współpraca: Z jakimi innymi klasami współpracuje?
32 Karta CRC: przykład Klasa: Wykładowca Odpowiedzialność: Udostępnienie planu budynku Pozwolenie uczestnikom wykładu na znalezienie kolejnego wykładu Wspólpraca: Uczestnicy: umożliwienie im odczytu planu budynku i znalezienie drogi na kolejny wykład
33 Przykład: bank Bank zarządza rachunkami klientów. Do rachunku jest przypisane imię, nazwisko oraz numer rachunku. Istnieją następujące typy rachunków: Konto student: oprocentowanie stałe 3 %, okres kapitalizacji 1 miesiąc, opłata 3 PLN/miesiąc Konto standard: oprocentowanie do 1000 PLN 2 %, powyżej 4%, okres kapitalizacji 1 miesiąc, opłata 7 PLN/miesiąc Konto super: oprocentowanie do 1000 PLN 1.5%, do 5000 PLN 4%, powyżej 5%, okres kapitalizacji 1 dzień, opłata 12 PLN/miesiąc Z typem rachunku związane jest oprocentowanie, które określa stopę procentową i regułę kapitalizacji (wysokość oprocentowania, które może się zmieniać w zależności od wysokości salda na rachunku, oraz okres kapitalizacji). Klient może zmieniać typ rachunku bez potrzeby tworzenia nowego rachunku. Wiąże się to z opłatą wynikającą z danego typu rachunku.
34 Przykład: bank Każda operacja wykonywana na rachunku (założenie rachunku, zamknięcie rachunku, wpłata, przelew, wypłata, kapitalizacja odsetek) jest odnotowywana w historii rachunku. Operacje z punktu widzenia rachunku różnią się kodem operacji uwidocznionym na wyciągu oraz opisem.
35 Przykład: bank Zarządzanie bankiem wymaga wykonywania różnorodnych raportów na podstawie atrybutów (wysokości sald, oprocentowania, naliczanych odsetek) rachunków, kredytów i lokat prowadzonych w banku. Należy zaprojektować system, który pozwoli, dla wszystkich rachunków, lokat, kredytów prowadzonych w banku, realizować w jednolity sposób raportowanie. Należy przy tym uwzględnić następujące wymagania: łatwa realizacja nowych raportów zabezpieczenie niektórych instancji produktów (u niektórych klientów banku) przed ujawnieniem w raporcie wielowątkowość (wiele raportów może być realizowanych naraz)
36 Q&A