Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
3.
zastosowanie obiektów
Rysunek 8.3.
Obiekt klasy Zwierze
zawiera obiekt klasy
SposobRuchu
Rozwiązanie to może na pierwszy rzut oka wyglądać nadmiarowo.
To nie jest żadna
Jednak w praktyce oznacza ono jedynie tyle, że obiekt klasy
przesada
zawiera odpowiedni obiekt określający sposób jego poruszania się.
Jest więc analogiczne do rozwiązania, w którym zmienną wykorzystu-
jemy do przechowania informacji o liczbie nóg zwierzęcia (z tą różnicą, że w tym przypadku zmienna składowa reprezentuje różnicę w zachowaniu, a nie w liczbie).
Może jedynie wydawać się, że oba te rozwiązania się różnią, choćby na podstawie różnic w diagramach przedstawionych na rysunkach 8.3 i 8.4.
Rysunek 8.4.
Obiekt zawierający
atrybuty
Wielu projektantów uważa, że pomiędzy zawieraniem przez obiekt
Porównanie
innego obiektu, a zawieraniem przez obiekt atrybutów istnieje różnica.
obu rozwiązań
Jednak mimo że atrybuty są zmiennymi typów prostych (na przykład
, ) i nie przypominają obiektów, to są nimi z punktu
widzenia projektowania obiektowego. Pamiętajmy, że w programowaniu obiektowym wszystko stanowi obiekt (nawet podstawowe typy danych, których zachowanie okre-
śla arytmetyka). Specyficzna składnia posługiwania się tymi obiektami (na przykład
odpowiadająca ) ukrywa jedynie fakt, iż są to obiekty o określonym za-
chowaniu.
124
Część III ♦ Wzorce projektowe
W ten sposób rozwiązanie zastosowane w przypadku zmienności atrybutów i rozwiązanie
w przypadku zmienności zachowania okazują się do siebie podobne. Najłatwiej będzie
to pokazać na przykładzie. Załóżmy, że opracować muszę system obsługi punktu sprze-
daży. Kluczowy element tego systemu stanowić będzie faktura. Na fakturze tej znajdzie się całkowita wartość zakupu. Początkowo dla jej reprezentacji mógłbym użyć typu prostego . Jeśli jednak system będzie musiał wystawiać faktury w różnych walu-
tach, to szybko pojawi się problem odpowiedniej konwersji. Dlatego też zdecyduję się raczej utworzyć klasę , która przechowywać będzie informacje o kwocie i jej
walucie. Tak więc suma na fakturze będzie teraz manifestacją obiektu klasy .
Choć może wydawać się na początku, że jedynym zadaniem obiektu klasy jest
przechowanie odpowiedniej informacji, to jednak szybko okaże się, że zgodnie z zasadą odpowiedzialności obiekty tej klasy muszą posiadać także metody służące konwersji
pomiędzy różnymi walutami. Jak się okazuje, zadanie konwersji nie sprowadza się tyl-
ko do przechowania w obiekcie kolejnej informacji (o aktualnym przeliczniku walut).
Komplikację wprowadzić może na przykład konieczność dokonywania konwersji po-między walutami na podstawie ich kursów pochodzących z przeszłości. W takim przy-
padku atrybut można by zastąpić klasą ! . Dodawanie zachowań do klasy
lub ! dodaje je także do klasy "# , która zależy od umieszczonych w niej
obiektów (a zatem także i obiektów ! ). Niemniej jednak takie rozwiązanie
ani nie powoduje zwiększenia stopnia złożoności klasy "# , ani nie wymaga
wprowadzania w niej jakichkolwiek zmian.
Strategię polegającą na uzyskiwaniu określonego zachowania obiektu w zależności od
rodzaju zawieranego obiektu zademonstruję omawiając kilka następnych wzorców
projektowych.
Analiza wspólności i zmienności
a klasy abstrakcyjne
Książka Copliena omawiająca problem analizy wspólności i zmienności,
Analiza wspólności
pokazuje, jak odnajdywać w dziedzinie problemu czynniki zmienne
i zmienności
oraz elementy wspólne: „Określ, gdzie („analiza wspólności”) oraz
jak („analiza zmienności”) elementy się od siebie różnią”.
Coplien stwierdza, iż: „Analiza wspólności polega na poszukiwaniu
Analiza wspólności
wspólnych elementów, które pozwalają zrozumieć, na czym polega
podobieństwo członków tej samej rodziny”4. Pod pojęciem „człon-
ków rodziny” Coplien rozumie elementy, które są ze sobą powiązane ze względu na