UML
Lab 3: Diagram klas
Diagram klas to graficzne przedstawienie statycznych, deklaratywnych elementów dziedziny przedmiotowej oraz związków między nimi. W przypadku języków obiektowych przedstawia strukturę klas i relacje między nimi.
Elementy:
Klasa
Klasa w języku UML jest przedstawiona w postaci prostokąta podzielonego na trzy części.
W pierwszej części znajduje się nazwa klasy (jest to jedyne pole wymagane, pozostałe pomija się
w przypadku, gdy nie występują wewnątrz nich żadne elementy bądź, gdy ukrycie ich utrudnia zrozumienie diagramu), w drugiej atrybuty bądź informacje o nich, w trzeciej zaś udostępniane przez nią zachowania.
Widoczność elementów
Widoczność określa, kto ma dostęp do atrybutów bądź operacji klasy. Język UML udostępnia 4 poziomy widoczności:
Publiczny (+) – element jest dostępny dla każdej metody dowolnej klasy,
Chroniony (#) – element może być używany przez metody danej klasy i metody klas dziedziczących,
Pakietowy (~) – element będzie widoczny dla metod z klas w tym samym pakiecie,
Prywatny (-) – element jest widoczny tylko dla metod z tej samej klasy.
Typ atrybutu
Typ atrybutu występuje po jego nazwie, oddzielony od nie j dwukropkiem. Jeśli atrybut reprezentuje więcej niż jeden obiekt ich ilość zapisuje się w nawiasie kwadratowym, z czego:
[liczba] – oznacza, że parametr zawiera dokładnie podaną liczbę parametr ów,
[liczba1..liczba2] – oznacza, że parametr może zawierać od liczba1 do liczba2 obiektów,
[*] – oznacza, że parametr może zawierać dowolną liczbę obiektów.
Domyślna wartość początkowa
Domyślną wartość początkową piszemy po typie, od którego oddzielamy ją znakiem „=”.
Właściwości atrybutu
Właściwości atrybutu są dodatkowymi informacjami o jego cechach, piszemy je jako ostatnie między nawiasami klamrowymi. Przykładowe właściwości: unique, readOnly.
Uwaga: atrybuty można również określać poprzez asocjację, zostanie to omówione w dalszej części tekstu.
Parametry
Parametry są używane do określenia, jakie informacje są udostępniane operacji. Piszemy je w nawiasie po nazwie. W przypadku, gdy występuje ich kilka oddzielamy je przecinkami.
Typ zwracany
Typ zwracany przez parametr określamy po parametrach i oddzielamy od nich znakiem dwukropka. Jedynie konstruktor nie posiada typu zwracanego.
Operacje i atrybuty statyczne
W diagramie klas elementy statyczne określa się poprzez ich podkreślenie.
Klasy abstrakcyjne
Operacje (metody) abstrakcyjne (pozostawione do implementacji w klasach potomnych) oznaczamy kursywą.
Interfejsy
Interfejs jest zbiorem operacji nieposiadającym ich implementacji. Jest on stosowany w nowszych językach programowania w celu uniknięcia problemów wynikłych z braku dziedziczenia wielokrotnego.
Implementację interfejsu można oznaczyć w klasie na dwa sposoby w zależności od użytej formy graficznej:
Uwaga: wykorzystywanie interfejsów nie zostało omówione w tym laboratorium.
Związki miedzy klasami
Zależność
Zależność mówi o tym, że jedna (zależna) klasa wykorzystuje drugą lub wie o jej istnieniu. W praktyce oznacza to, że zmiana klasy drugiej może mieć wpływ na klasę zależną od niej (np. klasa Zwierzę posiada operację jedz, która przyjmuje za parametr Jedzenie). Na diagramie oznaczamy ją przerywaną linią z grotem.
Asocjacja
Asocjacja oznacza, że dana klasa posiada odwołania/obiekty innej klasy. W najprostszej formie oznacza się to linią prostą łączącą dwie klasy. Na brzegach linii mogą występować wartości liczbowe określające ilość obiektów danego typu (brak oznacza jeden) i ich nazwa (jej brak oznacza brak referencji). Powyższy przykład oznacza, że klasa Farmer posiada zbiór elementów Zwierzę o nazwie Zwierzęta a jednocześnie każde Zwierzę posiada referencję farmera o nazwie Właściciel. Dodatkowo może występować nazwa asocjacji wraz z jej kierunkiem (powyżej jest to „Posiada”).
Asocjacja może być kierunkowa o oznacza się strzałką na końcu linii. Krzyżyk oznacza brak referencji. Powyższy przykład oznacza, że Farmer posiada referencję do zwierząt, ale zwierzęta nie posiadają już informacji o swoim farmerze. Gdyby krzyżyk zastąpić strzałką i przepisać wartości lewej strony asocjacji z diagramu wyżej oznaczałoby to, że dane zwierzę ma referencję dokładnie do tego farmera, który je posiada.
Agregacja częściowa
Agregacja oznacza, że klasa agregująca (agregat) jest właścicielem obiektów klasy agregowanej (segmenty).
Agregacja częściowa oznacza, że klasa jest właścicielem obiektów klasy agregowanej, ale może je również współdzielić z innymi klasami/obiektami. Likwidacja obiektu klasy farmer nie oznacza likwidacji wszystkich zwierząt z nią powiązanych.
Agregacja całkowita
Agregacja częściowa oznacza, że segment jest „częścią” agregata i nie ma powiązań z innymi obiektami. Likwidacja obiektu klasy Rachunek spowoduje utratę wszystkich jego Pozycji.
Uogólnienie
Uogólnienie oznacza, że jedna klasa jest rozszerzoną wersją drugiej. W praktyce oznacza proces dziedziczenia.
Pakiety
Pakiety (przestrzenie nazw) przedstawiamy w formie zaprezentowanej powyżej. W przypadku, gdy uwzględniamy zawarte w nim elementy nazwę piszemy w mniejszym prostokącie w lewym górnym rogu, jeśli je pomijamy nazwę umieszczamy na środku, co zostało pokazane na rysunku poniżej.