Diagramy klas UML
Wojciech Bura
Instytut Informatyki Uniwersytetu Śląskiego
Sierpień 2010
Wojciech Bura
Co to jest diagram klas?
Diagram klas stanowi statyczny, koncepcyjny widok projektowanej
aplikacji
Pokazuje kluczowe elementy (klasy) oraz ich związki w systemie
Klasa jest to ogólne określenie dla grupy podobnych obiektów
Obiekt jest instancją klasy
Pojęcie klasy na diagramie jest ściśle powiązane z technikami
programowania zorientowanego obiektowo
Jest to jeden z istotniejszych diagramów UML
Wojciech Bura
Do czego służy diagram klas?
Pozwala na sformalizowanie specyfikacji danych i zestawu metod
Pełni rolę uniwersalnego środka graficznego wizualizującego
implementację klas
Narzędzia projektowe zgodne ze specyfikacją UML umożliwiają, na
podstawie diagramów klas, generowanie elementów źródeł w
popularnych językach obiektowych, takich jak: C++, Java, C#
Wojciech Bura
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Reprezentacja klasy UML
Graficzną reprezentacją klasy jest prostokąt,
zwykle poziomo podzielony na trzy sekcje:
nazwę
atrybuty
operacje (metody)
<<Property>> -dataWystawienia : Date
<<Property>> -dataSprzedazy : Date
<<Property>> -numerId : string
<<Property>> -liczbaFaktur : int
+Faktura()
+Wydrukuj() : void
Faktura
Wojciech Bura
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Reprezentacja klasy UML cd
Wszystkie elementy specyfikacji klasy za wyjątkiem nazwy klasy są
opcjonalne.
Nazwa klasy to z reguły rzeczownik w liczbie pojedynczej.
Format pola nazwa klasy
stereotyp nazwa klasy właściwości
Format pola atrybutów
stereotyp dostępność nazwa atrybutu : typ = wart początkowa właściwości
Format pola operacji
stereotyp dostępność nazwa metody (lista arg) : typ wart zwracanej właściwości
Wojciech Bura
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Widoczność
Dla atrybutów i operacji można przypisać poziom widoczności
publiczny - dostęp mają obiekty dowolnej klasy systemu
prywatny - dostęp mają tylko obiekty tej samej klasy
chroniony - dostęp mają obiekty tej samej klasy oraz obiekty klas
dziedziczących
pakiet - dostęp mają tylko obiekty klas w tym samym pakiecie (Java)
Na diagramach widoczność oznaczamy znakiem poprzedzającym
nazwę elementu
+ : publiczny
- : prywatny
# : chroniony
~ : pakiet
Wojciech Bura
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Typy
Elementy składowe klas oraz paremetry i wartości zwracane przez metody
są określonego typu. Może nim być dowolna klasa w ramach systemu lub
jeden z predefiniowanych typów prostych UML:
Integer – liczba całkowita (C++: int)
Float – liczba zmiennoprzecinkowa (C++: float, double)
String – łańcuch znaków (C++: char* lub std:string)
Void – typ nieokreślony (C++: void)
Zazwyczaj narzędzia UML umożliwiają definiowanie listy typów prostych.
Wojciech Bura
Reprezentacja klasy UML
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Elementy statyczne
Element statyczny jest związany z
klasą, a nie z jej instancją (obiektem).
Statyczna metoda może odwoływać
się tylko do innych elementów
statycznych.
Zarówno atrybuty jak i operacje klas
mogą być zadeklarowane jako
statyczne
Statyczne elementy klas oznaczane są
przez podkreślenie
<<Property>> -dataWystawienia : Date
<<Property>> -dataSprzedazy : Date
<<Property>> -numerId : string
<<Property>> -liczbaFaktur : int
+Faktura()
+Wydrukuj() : void
Faktura
Wojciech Bura
Reprezentacja klasy UML
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Klasy abstrakcyjne
Klasa abstrakcyjna
Klasa abstrakcyjna to klasa, która posiada co najmniej jedną metodę
abstrakcyjną. Metoda abstrakcyjna nie posiada implementacji - jest
jedynie zapowiedzią realizacji w klasach potomnych.
W UML klasy abstrakcyjne wyróżnione są nazwą klasy pisaną
kursywą
Analogicznie, w ten sam sposób mogą być oznaczone jako
abstrakcyjne operacje składowe klasy
-posX : int
-posY : int
+GetClassName() : string
+MoveTo(x : int, y : int)
+Draw()
TBaseControl
Wojciech Bura
Reprezentacja klasy UML
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Jest to mechanizm pozwalający na rozszerzanie zbioru pojęć UML
poprzez dziedziczenie nowych elementów modelu z już istniejących
Wszystkie istniejące elementy UML mogą mieć ustalony stereotyp,
który precyzuje ich semantykę oraz rolę w projektowanym systemie.
Stereotyp reprezentowany jest przez jego nazwę zapisaną pomiędzy
znakami: « », np. «Interface»
Określenie konkretnego stereotypu może mieć wpływ na wygląd
elementu na diagramie UML oraz na sposób generowania kodu
źródłowego na podstawie modelu.
Wojciech Bura
Reprezentacja klasy UML
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy przykłady
«Interface» - oznaczenie klasy będącej interfejsem
«Property» - oznaczenie zmiennej, która jest własnością i powinna
posiadać metody dostępu (setter i getter).
«Bind» - oznaczenie relacji zależności tak aby reprezentowała
uszczegółowienie klasy parametrycznej
«Constructor» - oznaczenie metody, która pełni rolę konstruktora
Wojciech Bura
Reprezentacja klasy UML
Widoczność i typy
Elementy statyczne i klasy abstrakcyjne
Stereotypy
Związki między klasami
Pełny model obiektowy wymaga opisu związków zachodzących
między klasami
Notacja diagramu klas UML przewiduje następujące rodzaje relacji:
Asocjacja
Agregacja
Kompozycja
Zależność
Generalizacja (dziedziczenie)
Realizacja (implementacja)
Wojciech Bura
Asocjacja n-arna
Klasa asocjacyjna
Asocjacja
Asocjacja oznacza tymczasowe powiązanie niezależnych obiektów
dwóch klas.
Jest alternatywym sposobem definiowania cech klasy w stosunku do
atrybutów wpisanych. Asocjacja jest równoważna atrybutowi.
Czas życia połączonych obiektów nie jest ze sobą związany, żaden
obiekt nie nie jest właścicielem drugiego.
Relacja asocjacji może posiadać nazwę, zwykle w formie czasownika.
Asocjacja oznaczana jest linią łączącą graficzną reprezentację klas
będących w relacji
TDataSet
TDBEdit
dataSource
Wojciech Bura
Asocjacja n-arna
Klasa asocjacyjna
Nawigowalność
Nawigowalność wskazuje możliwość przejścia z obiektu klasy
źródłowej do docelowej
Oznaczona jest otwartą strzałką, wskazującą możliwy kierunek
przejścia
Domyślnie przyjmuje się dwukierunkowe przejście
Brak strzałki oznacza możliwość nawigacji w obu kierunkach
Wojciech Bura
Asocjacja n-arna
Klasa asocjacyjna
Krotność
Krotność
Jest to liczba instancji obiektów jednej klasy, która wchodzi w relację z
instancją innej klasy.
Cechy krotności:
definiowana osobno dla każdej klasy w relacji
jest określona przez wyrażenie tekstowe w formie oddzielonych
przecinkiem zakresów liczb
musi być zdefiniowana dla dwóch końców relacji
TDataSet
TDBEdit
0..*
1
dataSource
1
0..*
Wojciech Bura
Asocjacja n-arna
Klasa asocjacyjna
Sposób oznaczania krotności
Nieokreślona
Dokładnie jeden
1
Zero lub więcej
0..*
Zero lub więcej
*
Jeden lub więcej
1..*
Zero lub jeden
0..1
Zakres
2..4
Wielokrotne, rozdzialne zakresy
2, 4..6
Wojciech Bura
Asocjacja n-arna
Klasa asocjacyjna
Asocjacja przykład kodu
C++
class TDBEdit : public TBaseControl
{
. . .
private :
TDataSet ∗ m DataSet ;
public :
void SetDataSet (TDataSet ∗ DataSet ) ;
TDataSet ∗ GetDataSet ( ) ;
. . .
};
Wojciech Bura
Asocjacja n-arna
Zazwyczaj asocjacje opisują relację pomiędzy dwiema klasami
(asocjacje binarne).
Asocjację w której skład wchodzą więcej niż dwie klasy nazywamy
asocjacją (n-arną).
Reprezentowana jest jako zestaw linii wychodzących z klas
składowych i łączących się w centralnym rombie.
Nie określa nawigowalności - zawsze dwukierunkowa.
Produkt
Producent
Zamowienie
Wojciech Bura
Klasa asocjacyjna
Klasa asocjacyjna jest skrzyżowaniem asocjacji i klasy.
Umożliwia opis szczególnych własności charakteryzujących asocjacje.
Jest przydatna do realizacji przejścia z relacji wiele do wielu do
relacji jeden do wielu.
Graficznie reprezentowana jest tak samo jak zwykła klasa połączona
linią przerywaną z asocjacją, której dotyczy.
Osoba
Pracodawca
-pensja
-odKiedy
OsobaUPracodawcy
jestZatrudniona
Wojciech Bura
Kompozycja
Zależność
Generalizacja
Realizacja
Agregacja
Agregacja jest wariantem asocjacji typu ”całość - część” lub ”składa
się z”.
Czas życia połączonych obiektów nie jest ze sobą związany, żaden
obiekt nie nie jest właścicielem drugiego.
Agregacja wyróżniana jest pustym symbolem romba po stronie klasy,
która pełni rolę ”całości”.
Agregacja jest często mylona lub stosowana zamiennie z asocjacją.
TWindow
TBaseControl
*
*
childControls*
*
Wojciech Bura
Kompozycja
Zależność
Generalizacja
Realizacja
Agregacja przykład kodu
C++
class TWindow
{
. . .
private :
std : : vector<TBaseControl∗> m ChildControls ;
. . .
};
Wojciech Bura
Zależność
Generalizacja
Realizacja
Kompozycja
Kompozycja jest silniejszym wariantem asocjacji typu ”całość -
część”.
Czas życia połączonych obiektów jest ze sobą ściśle związany.
Obiekty pełniące rolę ”części” są niszczone gdy niszczona jest
”całość” i nie istnieją poza agregatem.
Kompozycja wyróżniana jest pełnym symbolem romba po stronie
klasy, która pełni rolę ”całości”.
Pozycja
Faktura
1
1..*
pozycje
1..*
1
Wojciech Bura
Zależność
Generalizacja
Realizacja
Kompozycja przykład kodu
C++
class Faktura
{
. . .
private :
std : : vector<Pozycja> m Pozycje ;
. . .
};
Wojciech Bura
Zależność
Zależność jest najsłabszą formą relacji między klasami
Oznacza, że przez jakiś czas obiekty wskazanej klasy używają
obiektów innej klasy
Przykładem takiej relacji jest użycie klasy jako parametru metody
lub użycie obiektów danej klasy w metodzie innej klasy
Zmiany w interfejsie lub sposobie działania klasy, od której zależy
klasa będąca początkiem relacji, może powodować konieczność
zmian w klasie zależnej
Zależność oznaczana jest linią przerywaną łączącą klasy będące w
relacji
Faktura
TSQLQuery
Uzywa
Wojciech Bura
Zależność przykład kodu
C++
void Faktura : : ZapiszDoBazy ()
{
TSQLQuery ∗ Query = new TSQLQuery( ) ;
. . .
Query−>Execute ( ) ;
. . .
delete Query ;
}
Wojciech Bura
Generalizacja (dziedziczenie)
Relacja między klasami w której jedna klasa współdzieli strukturę
i/lub działanie innej lub wielu innych klas
Klasa podrzędna (subclass, child) dziedziczy z klasy nadrzędnej
(superclass, parent)
Określenie generalizacja i dziedziczenie jest zwykle uznawane za
synonimy
Generalizację oznacza się ciąglą linią zakończoną zamkniętą strzałką
po stronie klasy nadrzędnej
Wojciech Bura
Generalizacja cd
-posX : int
-posY : int
+GetClassName() : string
+MoveTo(x : int, y : int)
+Draw()
TBaseControl
+GetClassName() : string
+Draw()
TEditBox
+GetClassName() : string
+Draw()
TLabel
Wojciech Bura
Generalizacja przykład kodu
C++
c l a s s TBaseControl
{
private :
i n t posX , posY ;
public :
void MoveTo( i n t x , i n t y ) ;
v i r t u a l String GetClassName ( ) ;
v i r t u a l void Draw() = 0;
};
c l a s s TEditBox : public TBaseControl
{
public :
String GetClassName ( ) ;
void Draw( ) ;
};
c l a s s TLabel : public TBaseControl
{
public :
String GetClassName ( ) ;
void Draw( ) ;
};
Wojciech Bura
Agregacja
Kompozycja
Zależność
Generalizacja
Realizacja (implementacja)
Realizacja jest połączeniem relacji zależności i generalizacji.
Wskazuje, że pewna klasa dziedziczy abstrakcyjne cechy wskazanej
klasy i je implementuje
Realizację oznacza się przerywaną linią zakończoną zamkniętą
strzałką po stronie klasy nadrzędnej
Zazwyczaj klasą bazową jest interfejs oznaczony stereotypem
«interface»
Wojciech Bura
Agregacja
Kompozycja
Zależność
Generalizacja
Realizacja cd
<<Interface>>
IWindow
GTKWindow
MotifWindow
GDIWindow
Wojciech Bura
Agregacja
Kompozycja
Zależność
Generalizacja
Realizacja przykład kodu Java
Java
public i n t e r f a c e IWindow {
public void draw ( ) ;
};
public c l a s s GDIWindows implements IWindow {
public void draw ( ) ;
};
public c l a s s GTKWindows implements IWindow {
public void draw ( ) ;
};
public c l a s s MotifWindows implements IWindow {
public void draw ( ) ;
};
Wojciech Bura
Dziedziczenie wielokrotne
O dziedziczeniu wielokrotnym mówimy w systuacji gdy klasa
podrzędna (subclass, child) dziedziczy z więcej niż jednej klasy
nadrzędnej
Nie wszystkie języki programowania wspierają taki model
dziedziczenia (np. C++ wspiera w pełni, Java wspiera wielokrotne
dziedziczenie po interfejsach)
Osoba
Uczen
Nauczyciel
Sportowiec
Wojciech Bura
Szablony klas
Pojęcie szablonu klas wywodzi się z języka C++
W notacji UML reprezentowane jest przez pojęcie klasy
parametrycznej.
Oznacza niepełną klasę, opisującą działanie i/lub strukturę w
oparciu o typ będący parametrem
Wykorzytanie klasy wymaga uszczegółowienia poprzez
parametryzację wskazaną klasą.
Klasa powstająca poprzez uszczegółowienie klasy parametrycznej
jest klasą związaną.
+push(element : T)
+pop() : T
Stack
T : class
Stack<int>
<<bind>>
Wojciech Bura
Dziedziczenie wielokrotne
Szablony klas
Pakiety
Dla dużego systemu zarządzanie klasami może być trudne.
Pakiety umożliwiają podział modelu na przestrzenie nazw
przypominające organizację folderów na dysku.
Podział na pakiety może pomóc w lepszym zrozumieniu większego
modelu.
Zastosowanie pakietów ma przełożenie na organizację generowanych
źródeł (pakiety Java, namespace w C++).
Wojciech Bura
Dziedziczenie wielokrotne
Szablony klas
Pakiety cd
Reprezentacja graficzna pakietu zawierającego trzy klasy.
Controls
+GetClassName() : string
+Draw()
TLabel
+GetClassName() : string
+Draw()
TEditBox
-posX : int
-posY : int
+GetClassName() : string
+MoveTo(x : int, y : int)
+Draw()
TBaseControl
-posX : int
-posY : int
+GetClassName() : string
+MoveTo(x : int, y : int)
+Draw()
TBaseControl
+GetClassName() : string
+Draw()
TEditBox
+GetClassName() : string
+Draw()
TLabel
Wojciech Bura
Przykładowe narzędzia
Wolne/otwarte:
ArgoUML
BoUML
NetBeans
StarUML
Zamknięte:
Borland Together
Enerprise Architect
IBM Rational Software Modeler
Sybase PowerDesigner
Visual Paradigm for UML (istnieje wersja darmowa)
Wojciech Bura
Koniec
Dziękuję za uwagę!
Wojciech Bura