Celem tego rozdziału jest zaprezentowanie podstawowej techniki projektowania, najczęściej stosowanej w modelach projektowych.
Diagram klas – definicja i zastosowanie
Diagram klas obrazuje pewien zbiór klas, interfejsów i kooperacji oraz związki między nimi. Jest on grafem złożonym z wierzchołków (klas, interfejsów, kooperacji) i łuków (reprezentowanych przez relacje). Diagram klas stanowi opis statyki systemu, który uwypukla związki między klasami, pomijając pozostałe charakterystyki. Najsilniej prezentuje on więc strukturę systemu, stanowiąc podstawę dla jego konstrukcji. W modelowaniu złożonych systemów nie mamy obowiązku przedstawiania ich struktury na jednym diagramie. Powinniśmy pamiętać o tym, że złożenie wszystkich diagramów, a właściwie ich elementów
i relacji, stanowi kompletny model. Możemy zatem przyjąć, że podzbiory zbioru klas użyte na diagramach klas są wybierane celowo i stanowią wynik decyzji zarówno analitycznych, jak i projektowych. Tak na przykład, diagramy klas stanowiące wynik decyzji analitycznych tworzą tzw. widoki klas biorących udział w realizacji danego przypadku użycia (ang. view of participating class – VOPC) i powiązania między nimi.
Zasadniczo jednak diagramy klas służą do zobrazowania statycznych aspektów perspektywy projektowej, w której bierze się pod uwagę wymagania funkcjonalne systemu – usługi, jakie system powinien udostępniać swoim użytkownikom.
Diagram klas – notacja i semantyka
Klasa
Klasa stanowi opis wybranego podzbioru obiektów, w którym każdy z obiektów posiada takie same atrybuty, operacje, metody, związki i znaczenie.
Z określenia tego wynika założenie dotyczące inwariantności (niezmienności) cech i zachowań obiektów, którym przypisano wspólny klasyfikator w postaci nazwy klasy.
Ponieważ klasa stanowi wzorzec dla tworzonych obiektów, nie jest celowe, aby każdy z nich przechowywał kopię tego samego opisu operacji; wszystkie utworzone obiekty powinny zatem odwoływać się do wspólnej definicji operacji zawartych w klasie. Możemy więc założyć, że klasa nie stanowi jedynie prostego opisu zbioru obiektów, ale zawiera jeden egzemplarz definicji operacji, które działają na wielu egzemplarzach atrybutów, unikatowych dla każdego obiektu.
Atrybut to nazwana właściwość klasyfikatora, określająca zestaw wartości, które mogą przyjmować jego instancje.
Atrybuty klas charakteryzują pojedyncze obiekty lub grupy obiektów, tworząc dla każdego z nich niezależną ich instancję. Jeżeli atrybut klasy może istnieć niezależnie od obiektu, to często lepszym rozwiązaniem jest zbudowanie z niego nowej klasy, np. atrybut Adres dla klasy Klient.
Operacja to funkcja dostarczana przez obiekt, która manifestuje się przez odpowiednie jego zachowanie. Operacja ma sygnaturę, która określa jej dopuszczalne parametry i sposób wywołania. Operacje klasy działają na pojedynczych obiektach lub ich zbiorach. W odróżnieniu od atrybutów, zwykle tworzona jest jedna instancja operacji klasy (przechowywana w klasie), wspólna dla wszystkich obiektów tej klasy. W niektórych sytuacjach operację lepiej jest przedstawić jako klasę (np. operacja wypożyczSamochód jako działanie może być operacją klasy lub może być klasą wypożyczSamochód z własnymi atrybutami: dataWypożyczenia, dataZwrotu, etc.).
Klasa może używać interfejsów do definiowania zestawu operacji oferowanych jej środowisku.
Rysunek 35. Elementy składowe klasy
Metoda to implementacja operacji. Określa algorytm lub procedurę, która dostarcza wynik operacji.
Związek asocjacji (powiązania)
Rysunek 38. Związek asocjacji – notacja
Związek asocjacji to semantyczna relacja (związek) pomiędzy dwoma bądź większą liczbą klas, która ustanawia powiązania (wiązania) pomiędzy instancjami klasyfikatorów. W szczególności asocjacja może zachodzić pomiędzy dwoma lub większą liczbą klas. Często do powiązania dodawane są nazwy ról i liczebności.
Rysunek 39. Przykład użycia asocjacji wraz z rolą
Na rysunku 39 zamieszczono przykład zastosowania asocjacji wraz z rolą. Rola to swego rodzaju „oblicze”, które klasa przy jednym końcu powiązania prezentuje klasie przy drugim końcu.
Związek agregacji
Rysunek 40. Związek agregacji – notacja
Związek agregacji to rodzaj asocjacji pomiędzy klasyfikatorami, która określa relację „całość-część” pomiędzy agregatem (całością) a jego częściami; egzemplarz należący do klasyfikatora reprezentującego „całość” zawiera – jako swoje komponenty – elementy należące do klasyfikatora reprezentującego „część”. W przypadku klas, wartościami atrybutów obiektu zagregowanego mogą być obiekty należące do klas reprezentujących „części”.
Rysunek 41. Przykładowe zastosowanie agregacji
Na rysunku 41 pokazano przykładową agregację, która oznacza,
że ubezpieczenie jest częścią wypożyczenia samochodu.
Silna agregacja (kompozycja)
Rysunek 42. Silna agregacja – notacja
Związek silnej agregacji (kompozycja, agregacja całkowita) to rodzaj agregacji z przynależnością elementów składowych do elementu macierzystego oraz z powiązanym okresem życia elementów składowych z ich elementami macierzystymi. Elementy składowe mogą być kreowane po utworzeniu elementu macierzystego. Raz utworzone istnieją i są kasowane wraz ze swoim elementem macierzystym. Mogą też być kasowane przed momentem kasowania elementu macierzystego. Kompozycja może być rekursywna.
Pozostałe diagramy UML: