Diagramy klas i
obiektów
GRUPA ZIN I
Modelowanie aplikacji
w UML 2.0
Mateusz Drzymała
Marcin Opszalski
Mateusz Pisarek
Modelowanie Klas
• Na etapie zbierania wymagań oraz analizy systemu, przy pomocy
klas tworzy się słownik pojęć dziedzinowych, które powinny
odzwierciedlać byty występujące w dziedzinie problemu postrzegania
z punktu widzenia przyszłych jego użytkowników.
• Precyzja nazewnictwa, na tym etapie, pozwala na precyzyjne opisanie
dziedziny problemu, zapobiegając późniejszym, fundamentalnym
zmianom wynikającym z nieporozumień na linii specjalista
dziedzinowy – analityk.
„Gdy ja używam jakiegoś słowa, oznacza ono dokładnie to, co mu każę
oznaczać… ni mniej, ni więcej.”
Humpty Dumpty
Klas
a
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij
zwolnij
oblicz
wynagrodzenie
Nazwa
Atrybuty
Cechy
Operacje
Klasa – jest opisem obiektów, posiadających takie same atrybuty, operacje,
związki oraz semantykę
Klasę oznacza się przy pomocy prostokąta podzielonego na trzy podstawowe
części. W części górnej należy podać nazwę klasy oraz można podać
dodatkowe informacje, takie jak stereotyp oraz dodatkowe właściwości.
część środkowa służy do definiowania atrybutów klasy. W części dolnej podaje
się operacje zdefiniowane dla klasy.
Klas
a
Klasa – może zawierać dodatkowe części, zdefiniowane przez osobę
modelującą. W takim przypadku, każda część symbolu klasy powinna
być zapoczątkowana nazwą (słowem kluczowym). Typowym przykładem
dodatkowych części są:
• lista sygnałów, na które reaguje obiekt,
• lista odpowiedzi klasy.
Atrybut
y
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij
zwolnij
oblicz
wynagrodzenie
Określają właściwości pojęcia
Reprezentowanego przez klasę
Wyznaczają zawartość
Informacyjną klasy,
Specyfikują dane
Związane z klasą i jej
obiektami
Typ i liczność
atrybutów
Pracownik
imię: string
nazwisko: string
stanowisko: stanowisko
data zatrudnienia: date
umiejętności[1…*]: Umiejętność
zatrudnij
zwolnij
oblicz
wynagrodzenie
Pełna składnia deklaracji atrybutu:
<widoczność> <nazwa> [<liczność>] ‘:’ <typ> [ ‘=‘ <wartość początkowa> ][<modyfikatory>]
• <widoczność> -> ‘-’ | ‘#’ | ‘+’ | ‘~’
• <liczność> -> ‘[‘ <minimalna ilość> ‘..’ <maksymalna ilość> ‘]’
• <modyfikatory> -> { <modyfikator> (‘,’ modyfikator)*}
• <modyfikator> -> ‘readOnly’ | ‘union’ | ‘subsets’ <nazwa atrybutu> | ‘redefines’
<nazwa atrybutu> | ‘ordered’ | ‘unique’ | <ograniczenie>
Typ i liczność
atrybutów
Typ atrybutu określa dopuszczalny rodzaj / zbiór wartości jakie mogą
przyjmować atrybuty. Typ atrybutu określa się przy pomocy nazwy
umieszczonej po nazwie atrybutu i znaku rozdzielającym ‘:’.
UML – owe typy danych:
• typy proste (typy prymitywne / predefiniowane : Boolean, Integer,
String, UnlimitedNatural, typ wyliczeniowy),
• typy złożone – klasy.
Liczność atrybutów - jest określana przez umieszczenie w nawiasach
kwadratowych dopuszczalnego zakresu możliwej liczby wartości do
przyjęcia przez atrybut. Jeżeli ta jest równa jeden, wówczas
wskaźnik liczności jest pomijany.
Widoczność i zakres
atrybutów
Pracownik
id {private}
zmodyfikowany {protected}
imię {public}
nazwisko {public}
stanowisko {public}
data zatrudnienia {public}
odczytanie z bazy danych {package}
zatrudnij
zwolnij
oblicz
wynagrodzenie
Pracownik
- id
# zmodyfikowany
+ imię
+ nazwisko
+ stanowisko
+ data zatrudnienia
~ odczytanie z bazy danych
zatrudnij
zwolnij
oblicz
wynagrodzenie
Atrybuty określają zawartość informacyjną, jaką klasa niesie w systemie.
Widoczność i zakres
atrybutów
Przynależność atrybutów:
Atrybuty klasy (class scope attribute) Atrybuty klasy przyjmują swoją
wartość jeden raz dla całej klasy.
Atrybuty obiektu (instance scope attribute) Atrybuty obiektu przyjmują
swoją wartość dla każdego obiektu z osobna.
Atrybuty klasy są oznaczone przez podkreślenie nazwy jedną linią
(na przykład : domyślny kształt).
Nazwę atrybutu podaje się w normalny sposób (na przykład: imię).
Widoczność atrybutów:
• prywatne – oznaczone przez „-” lub słowem kluczowym private,
• chronione – oznaczone przez „#” lub słowem kluczowym protected,
• publiczne – oznaczone przez „+” lub słowem kluczowym public,
• pakietowe – oznaczone przez „~” lub słowem kluczowym package.
Modyfikatory
atrybutów
data zatrudnienia: DateTime {readOnly}
umiejętności[1…*]: Umiejętność {ordered, unique}
obowiązki[1…*]: Umiejętność {subsets umiejętności}
/dni kalendarzowe[1…*]: Date {union}
dni powszednie[1…*]: Date {subset dni kalendarzowe}
dni weekendowe[1…*]: Date {subset dni kalendarzowe}
święta[1…*]: Date {subset dni kalendarzowe}
/staż pracy: Integer
stanowisko: String = „Projektant”
wynagrodzenie: Real {wynagrodzenie > 0.00}
Znaczenie poszczególnych metek:
{readOnly}: atrybut nie może być modyfikowany,
{unique}: zbiór wartości atrybutu wielowartościowego nie zawiera powtórzeń,
{ordered}: zbiór wartości atrybutu wielowartościowego jest uporządkowany,
{subsets atrybut}: zbiór wartości atrybutu wielowartościowego jest podzbiorem
zbioru wartości innego atrybutu,
{union}: zbiór wartości atrybutu jest sumą mnogościową zbiorów wartości
atrybutów, które zadeklarowano jako podzbiory tego atrybutu.
Obiekty
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij
zwolnij
oblicz
wynagrodzenie
andrzej: Pracownik
Imię = „Andrzej”
Nazwisko = „Wtorkowski”
Stanowisko = „Projektant”
data zatrudnienia = 10/12/2002
krzysztof: Pracownik
Imię = „Krzysztof”
Nazwisko = „Ćwikłowski”
Stanowisko = „Programista”
data zatrudnienia = 15/09/2005
grażyna: Pracownik
Imię = „Grażyna”
Nazwisko = „Wójcik”
Stanowisko = „Analityk”
data zatrudnienia = 01/07/2006
staszek: Pracownik
Imię = „Stanisław”
Nazwisko = „Rybak”
Stanowisko = „Tester”
data zatrudnienia = 10/05/1996
Obiekty
Obiekt można zdefiniować jako element o dobrze zdefiniowanych granicach oraz
tożsamości, która hermetyzuje w sobie określone zachowanie oraz stan.
Obiekt jest reprezentantem klasy.
Stan, w tym przypadku, należy rozumieć jako kolekcję wartości atrybutów oraz
powiązań, w jakich obiekt w danym momencie występuje.
W tym miejscu warto także wspomnieć o tożsamości obiektów. Każdy obiekt
powoływany do życia automatycznie posiada swoją własną tożsamość.
Oznacza to, iż nie jest konieczne modelowanie cech w klasie, przy pomocy
których będzie zapewniana unikalność każdego z tworzonych obiektów.
Obiekt przedstawia się na diagramach podobnie jak klasę.
Podanie nazwy obiektu, przed nazwą klasy, umożliwia dokładne wskazanie
konkretnego obiektu (w danym kontekście).
Obiekt znajdujący się w określonym stanie (zbiorze stanów) pokazuje się na
diagramach przez umieszczenie po nazwie klasy list stanów, w których obiekt
się znajduje.
<nazwa obiektu> ‘:’ <nazwa klasy> ‘[‘ <lista stanów> ‘]’
Na przykład:
Klient : Osoba [‘Uprzywilejowany’]
Operacj
e
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij
zwolnij
oblicz
wynagrodzenie
Specyfikuje zbiór procedur,
Które można wywoływać
Na obiektach klasy,
Wyznaczają sposób dostępu
Do danych.
Opisują zachowania bytów
Reprezentowanych przez klasę
Widoczność i zakres
operacji
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij {public}
zwolnij {public}
oblicz wynagrodzenie {public}
oblicz wartość premii
{private}
Oblicz płacę podstawową
{protected}
Znajdź wg nazwiska {public}
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
+zatrudnij
+zwolnij {public}
+oblicz wynagrodzenie
{public}
-oblicz wartość premii
{private}
#Oblicz płacę podstawową
{protected}
+Znajdź wg nazwiska {public}
Operację można zdefiniować jako usługę świadczoną przez klasę na
rzecz swojego otoczenia
Widoczność i zakres
operacji
Operacje klasy (class scope operation) mogą być wywoływane dla klasy, a więc
nie wymagają istnienia żadnego obiektu tej klasy, i nie mogą się odwoływać do
atrybutów obiektu. Operacje klasy są oznaczane przez podkreślenie nazwy jedną
linią (np.: utwórz).
Operacje obiektu (instance scope operation) Operacje obiektu są wywoływane
dla poszczególnych obiektów należących do danej klasy. Nazwę operacji obiektu
podaje się bez podkreślenia (na przykład: oblicz wiek).
Widoczność operacji
• prywatne – oznaczone przez „-” lub słowo kluczowym private,
• chronione – oznaczone przez „#” lub słowo kluczowym protected,
• publiczne – oznaczone przez „+” lub słowo kluczowym public,
• pakietowe – oznaczone przez „~” lub słowo kluczowym package.
Użytkownik może definiować własne rodzaje określeń widoczności operacji.
Określone w ten sposób typy przedstawiane są w modelu w postaci własności
(ang. property) na końcu definicji operacji.
Parametry, wartość
zwracana
+ zatrudnij(od dnia:Date)
- oblicz wartość premii():Real
+ oblicz wynagrodzenie(na dzien:Date):Real
+ posortuj wg stażu(lista: Pracownik[*]): Pracownik[*]
- pobierz miesiąc i rok(in data:Date, out miesiąc: Integer, out
rok:Integer)
+ posortuj wg nazwiska(inout lista:Pracownik[*])
+ wyszukaj binarnie(lista:Pracownik[*] {ordered}, nazwisko:
String) Pracownik
+ zatrudnij(od dnia:Date = DateTime.Today)
Pełna składnia deklaracji operacji:
< wodoczność <nazwa> [‘(‘<lista parametrów> ‘)’] ‘:’ <typ zwracanej wartości> [<modyfikatory
operacji>]
<widoczność> -> ‘-’ | ‘#’ | ‘+’ | ‘~’
• <liczność> -> ‘[‘ <minimalna ilość> ‘..’ <maksymalna ilość> ‘]’
• <modyfikatory operacji> -> { <modyfikator operacji> [ (‘,’ modyfikator
operacji)]*}
• <modyfikator operacji> -> ‘redefines’ <nazwa operacji> | query | ordered | unique |
ograniczenie>
• <lista parametrów> -> <parametr> [ ‘,’ <parametr> ]*
• <parametr> -> [<kierunek>] <nazwa> ‘:’ <typ> [<liczność>] [‘=‘ <wartość domyślna> ]
[<modyfikatory parametru>]
• <kierunek> -> ‘in’ | ‘out’ | ‘inout’
• <modyfikatory parametru> -> {<modyfikator parametru> [ ‘,’ <modyfikator parametru>]*}
• <modyfikator parametry> -> ‘ordered’ | ‘unique’ | <ograniczenie>
Parametry, wartość
zwracana
Pracownik
imię
nazwisko
stanowisko
data zatrudnienia
zatrudnij(od dnia: Date)
zwolnij (z dniem: Date)
oblicz wynagrodzenie (na dzień:
Date): Real
Wyjątki:
i
RaisedException
Nie można zatrudnić
Wyjątki :
Metamodel UML uwzględnia możliwość specyfikowania wyjątków, zgłaszanych przez
operacje, ale nie ma to odzwierciedlenia w składni operacji. Zaleca się używania do
tego celu notatek.
U Uml 1.x wyjątki modelowano jako klasy ze stereotypem
<<
exceptuion
>>
, z punktu
widzenia UML 2.0 wyjątek jest daną dowolnego typu.
Modyfikatory operacji i
parametrów
Oblicz wynagrodzenie(na dzień: Date): Real {query}
Pobierz dni urlopu(miesiąc: int, rok: int): Date[*]{unique}
Posortuj wg stażu(lista: Pracownik[*]): Pracownik [*]
{ordered}
Wyszukaj binarnie( lista: Pracownik[*]{ordered}, nazwisko:
string): Pracownik
Znaczenie poszczególnych metek:
{query}: operacja nie zmienia stanu obiektu, tzn. nie
modyfikuje wartości atrybutów.
{unique}: zbiór wartości zwróconych w wyniku nie zawiera
powtórzeń
{ordered}: zbiór wartości, zwróconych w wyniku jest
uporządkowany
{ordered}: dla parametru: zbiór wartości parametru
wielokrotnościowego jest uporządkowany.
Zachowa
nie
•
Diagramy klas nie opisują sposobu realizacji
operacji.
Do tego celu wykorzystuje się diagramy
opisujące
dynamiczny aspekt systemu:
• Diagram maszyny stanów
• Diagram aktywności
• Diagram interakcji (sekwencji, komunikacji)
Związki
Związek (and. Association)
Semantyczna zależność występuje między klasami, która ma bezpośrednie
odzwierciedlenie w powiązaniach(ang. link) występujących między konkretnymi
obiektami systemu.
Każdy związek posiada swoją nazwę, która powinna być unikalna w ramach zbioru
klas które są przez ten związek łączone. Doprecyzowanie funkcji jaką pełni dana
klasa w związku jest możliwe poprzez zastosowanie koncepcji roli (ang. role).
Powyższy rysunek prezentuje klasy Pracownik oraz Zakład połączone związkiem
o nazwie „zatrudnia”. Związek określa miejsce klasy w systemie w określonym
kontekście. Pracownik może interesować osobę modelującą w kontekście związku
z zakładem, jak i np.: jako „zasób ludzki” posiadający określone certyfikaty,
potwierdzające jego kompetencje.
Pracownik
Zakład
*
pracownik
zatrudnia *
pracodawca
Rola
Nazwa związku
Symbol związku
Role
Role obiektów w związku są reprezentowane za pomocą specjalnych atrybutów.
Atrybut, reprezentujący rolę należy do klasy po przeciwnej stronie związku, niż klasa
występująca w tej roli. Jego typ jest zgodny z klasą występującą w roli a liczność
odpowiada liczności klasy w związku.
Pracownik
Zakład
*
pracownik
zatrudnia
*
pracodawca
imię: string
nazwisko : string
stanowisko: string
/pracodawca[*]: Zakład
nazwa: string
adres : string
NIP: string
REGON: string
/pracownik[*]:
Pracownik
Liczności
związku
Liczność związku jest górnym i dolnym ograniczeniem liczności zbioru obiektów, z którymi może być powiązany
dany obiekt w danej roli.
Liczność związku określa się dla każdej z ról osobno. Liczność związku specyfikuje się poprzez podanie przedziału
liczb naturalnych, domkniętego obustronnie:
<granica dolna> … < granica górna>
• Jeżeli granica górna jest nieograniczona, wówczas należy użyć symbolu „*”.
• Jeżeli liczność związku jest precyzyjnie określona, wówczas należy podać tylko jedną liczbę, na przykład „4”
• Jeżeli liczność związku nie może być w żaden sposób oszacowana i może przyjąć wartości od 0 do ∞,
wówczas należy podać jedynie symbol „*”.
Samochód
Koło
1
4
Wielokąt
Wierzchołek
1
1..
*
Towarzystwo
ubezpieczeniowe
Polisa
1
*
Pracownik
Zakład
*
*
Butelka
Korek
0..1
0..
1
Związki
rekurencyjne
Związek może dotyczyć tej samej klasy. W takim przypadku, w systemie,
dwa obiekty tej samej klasy są ze sobą powiązane. W celu rozróżnienia
powiązanych obiektów, konieczne jest określenie ról na obydwu końcach
związku.
Pracownik
0..1
szef
*
podwładny
zarządza
Nawigacja
Jeżeli z punktu widzenia systemu, istotny jest jeden aspekt związku, wówczas
należy wskazać, jaka informacja jest wymagana. Kierunek przeglądania związku
jest oznaczony grotem umieszczonym na końcu symbolu związku. Na powyższym
przykładzie, obiekty klasy Kolekcja będą miały powiązania z obiektami klasy
Element. Obiekty klasy Element nie będą miały powiązań z obiektami klasy
Kolekcja.
Kolekcja
Element
*
zawiera
*
Uporządkowanie
związku
Uporządkowanie związku
Jeżeli liczność związku jest większa niż 1, wówczas może zajść konieczność
pokazania, iż elementy znajdujące się po stronie „wiele” mają być uporządkowane
według jakiegoś porządku. Sytuację taką oznacza się na diagramie własnością
{ordered}. Jeżeli elementy nie są uporządkowane, wówczas nie należy tej sytuacji
osobno specyfikować, gdyż jest ona przyjmowana jako domyślna.
Harmonogram
Zadanie
1
grupuje
*
{ordered}
Ogranicze
nia
Ograniczenia (ang. Constraint)
Czasami w trakcie tworzenia modelu występuje sytuacja, w której należy wyraźnie
zaznaczyć, iż tylko jedno z potencjalnie wielu powiązań może być utworzone dla
danego obiektu.
Sytuację taką zaznacza się poprzez nałożenie ograniczeń {xor} na związki określone
na modelu klas.
Osoba
Firma
0..
1
*
{xor}
Konto
*
1..
*
Klasa
związku
Jeżeli wraz z wystąpieniem powiązania między obiektami pojawiają się dodatkowe
informacje, związek na
modelu klas należy wzbogacić o klasę związku (ang. Association Class).
Klasa związku jest reprezentowana na diagramie w taki sam sposób jak normalna
klasa. Różni się od niej
tym, iż semantycznie jest ona integralną częścią związku, i samodzielnie na diagramie
nie występuje.
Klasa związku jest przykładem czysto analitycznej konstrukcji, nie posiadającej
swojego odpowiednika w
językach programowania. Z punktu widzenia metamodelu UML, klasa związku jest
zarówno klasą, jak i
związkiem. Z punktu widzenia modelu, klasę związku należy rozumieć jako zestaw
danych oraz usług, które
zaistnieją tylko wówczas, gdy pomiędzy obiektami reprezentującymi klasy znajdujące
się po dwóch
stronach związku zaistnieje powiązanie.
Pracownik
Zakład
*
pracodawc
a
*
pracown
ik
Umowa
zatrudnia
rodzaj
wynagrodzenie
Klasa
związku
Należy pamiętać, iż domyślnie nie dopuszcza się, aby w
systemie wystąpiły dwa powiązania o tym samym
identyfikatorze (na który składają się identyfikatory
powiązanych obiektów). Oznacza to, że nie może zaistnieć
w systemie więcej niż jedno powiązanie (pracownik1,
pracodawca1), gdzie pracownik1, pracodawca1 są
obiektami znajdującymi się na końcach powiązania
utworzonego na podstawie związku „zatrudnienia” – nie
mogą istnieć w systemie 2 pary tych samych obiektów
powiązanych różnymi obiektami klasy związku. W
podanym przykładzie przekłada się to na brak możliwości
zatrudnienia konkretnego pracownika w konkretnym
zakładzie pracy na podstawie więcej niż jednej umowy.
Kolekcje z
powtórzeniami
Pracownik
Zakład
*
pracodawc
a
*
pracown
ik
Umowa
zatrudnia
rodzaj
Wynagrodzenie
Data podpisania
{bag}
Kolekcje, reprezentujące role klas w związkach mogą zawierać powtórzenia.
Oznacza to, że dwa obiekty mogą być ze sobą powiązane więcej niż raz w tym
samym związku. Zgodnie z diagramem na slajdzie pracownik może być
wielokrotnie zatrudniony w tym samym zakładzie (np.: w wyniku zmiany
warunków umowy, albo zwolnienia i ponownego zatrudnienia po pewnym
czasie).
Kwalifikat
or
Kwalifikator jest atrybutem lub zbiorem atrybutów powiązania
umożliwiającym podział obiektów powiązanych z danym obiektem
kwalifikowanym (obiektem klasy do której jest przyłączony kwalifikator)
na zbiory według określonego atrybutami kryterium.
Liczność związku określa się dla ustalonego obiektu i kwalifikatora. W
przypadku gdy liczność jest określona jako „0..1” lub „1”, kwalifikacja
ma zarówno znaczenie semantyczne jak i implementacyjne. W
przypadku liczności „0..*” kwalifikator może mieć
jedynie znaczenie implementacyjne, sugerując w ten sposób
konieczność uwzględnienia szybkiego dostępu do zbioru obiektów.
Wartym odnotowania jest fakt, iż w przypadku rozważania powiązania
kwalifikowanego bez ustalonej wartości kwalifikatora, przyjmuje się
liczność „0..*”.
Pracownik
Zakład
0..1
*
imię
nazwisko
Stanowisko
Data zatrudnienia
nazwa
adres
NIP
REGON
nazwisko
imię
Agregacja i
kompozycja
Agregacja jest szczególnym rodzajem związku, implikującym pewną
zależność między obiektem – agregatem a obiektami – składowymi.
Agregacja jest zawsze związkiem binarnym i jest relacją przechodnią i
asymetryczną. Agregacja nie niesie ze sobą żadnych implikacji
projektowych i implementacyjnych.
Szczególnym rodzajem agregacji jest kompozycja (ang. Composition). W
przypadku takiego związku, składowe mogą w danym momencie
należeć tylko do jednego agregatu (aczkolwiek agregat może się
zmieniać). Ponadto agregat jest odpowiedzialny za usunięcie
składowych, gdy sam jest usuwany.
Zespół
Zawodnik
*
1..
*
Wydział
Instytut
*
składa się z
składa się z
Podzbiory ról
Za pomocą własności subsets można wyrazić fakt, że elementy jednej
kolekcji są podzbiorem elementów innej kolekcji. Własność union
oznacza, że zawartość kolekcji jest sumą wszystkich podzbiorów, które
zostały na niej zadeklarowane, a zatem sumą zawartości wszystkich
kolekcji, dla których użyto własności subsets z nazwą tej kolekcji.
Członek
stowarzyszenia
Oddział
stowarzyszenia
1
*
imię
nazwisko
Data wstąpienia
nazwa
Adres
REGON
należy do
Jest w zarządzie
Jest członkiem
zwyczajnym
*
5..7
0..1
0..1
członek
zwyczajny
{subsets
członek}
/członek {union}
Widoczność roli
Widoczność roli:
Określenie widoczności roli umożliwia późniejszą kontrolę dostępu do
obiektów. Widoczność roli określa się w podobny sposób jak widoczność
atrybutów i operacji.
Rola „rozdział w związku łączącym książkę z rozdziałem została
określona jako prywatna dla klasy Książka. Podobnie, rola „akapit”
została ustalona jako prywatna dla klasy rozdział. Taka definicja
widoczności ról skutkuje tym, iż niemożliwe jest bezpośrednie odwołanie
się od obiektu klasy Książka do obiektu klasy akapit. Informacja taka
może zostać uzyskana jedynie poprzez wywołanie ewentualnej operacji
zdefiniowanej w klasie Rozdział.
Książka
Rozdział
1..*
1
Książka.Rozdział
1..*
Akapit
{private
}
{private
}
1
Związki
wielokrotne
Związki wielokrotne, podobnie jak klasy związków, są konstrukcjami
analitycznymi. Przechodząc do etapu projektowania, należy zmienić
związki wielokrotne na odpowiednie związki binarne.
Liczność związku dla danej roli odczytuje się przy ustalonych obiektach
występujących w pozostałych rolach.
Dziecko
Klasa
0..1
*
0..n
Ro
k
Koniec