Wykład 7: Diagramy implementacyjne oraz diagramy pakietów

Transkrypt

Wykład 7: Diagramy implementacyjne oraz diagramy pakietów
7 Diagramy implementacyjne oraz
diagramy pakietów
7.1
Wstęp
Diagramy implementacyjne słuŜą do ilustracji dwóch aspektów implementacji systemu informatycznego:
struktury kodu i konfiguracji elementów czasu wykonania.
Diagramy pakietów z kolei, są budowane przede wszystkim dla duŜych projektów, tworzonych przez duŜą grupę
współpracujących osób, projektów składających się z wielu jednostek funkcjonalnych, ze złoŜonymi
zaleŜnościami pomiędzy tymi jednostkami. Zadaniem pakietów jest grupowanie elementów danego (jednego)
modelu, wraz z występującymi pomiędzy tymi elementami relacjami.
Istnieje co najmniej kilka powodów, dla których warto jest uŜywać diagramów pakietów:
•
W celu ukrycia mniej istotnych elementów modelu (podobnie jak zilustrowano to w przykładzie o
subkolaboracji umieszczonym w wykładzie dotyczącym diagramów interakcji).
•
Dla ułatwienia podziału pracy między członkami zespołu czy teŜ róŜnymi zespołami.
•
Dla ułatwienia procesu zarządzania budową produktu informatycznego.
7.2
Diagramy implementacyjne
UML definiuje dwa rodzaje diagramów implementacyjnych:
•
Diagramy komponentów – ilustrują strukturę kodu projektowanego systemu poprzez specyfikowanie
implementacji elementów projektu (np. klas czy podsystemów) za pomocą komponentów i ich
interfejsów, oraz wskazanie zaleŜności występujących pomiędzy komponentami. Celem identyfikacji
komponentów jest budowa systemów o odpowiednio wysokiej jakości, wypełniających poŜądane
potrzeby biznesowe i budowanych szybko − raczej poprzez składanie z gotowych części niŜ poprzez
wypracowywanie kaŜdego elementu samodzielnie. Taki sposób pracy jest korzystny dla budowy np.
rodziny aplikacji: niektóre komponenty opłaca się opracować samodzielnie, a niektóre warto odszukać
wśród gotowych, istniejących juŜ w organizacji czy na rynku i ewentualnie zaadaptować do aktualnych
potrzeb.
•
Diagramy wdroŜeniowe – pokazują konfigurację systemu czasu wykonania, czyli rozmieszczenie
komponentów i obiektów na węzłach. Węzły modelują obliczeniowe zasoby czasu wykonania. Taka
konfiguracja moŜe być zarówno statyczna, jak i dynamiczna: komponenty i obiekty mogą migrować
między węzłami w czasie wykonania.
Omówienie diagramów implementacyjnych rozpoczniemy od diagramów komponentów.
7.2.1
Diagramy komponentów
Komponent stanowi nietrywialną, dobrze wyizolowaną z kontekstu jednostkę implementacji, spójną ze względu
na wypełniane funkcje (wysoka kohezja, słabe sprzęŜenia) i posiadającą dobrze zdefiniowany interfejs; z
załoŜenia, komponent nadaje się do wielokrotnego uŜycia. Prawidłowo skonstruowany komponent korzysta z
innych komponentów wyłącznie za pośrednictwem ich interfejsów, co z załoŜenia ułatwia przyszłe modyfikacje.
MoŜna wyróŜnić kilka rodzajów komponentów: komponenty z perspektywy jednego projektu, komponenty z
perspektywy całości rozwoju oprogramowania w danej organizacji oraz komponenty biznesowe (np. do obsługi
zamówień, sprzedaŜy, itp.).
Kategorie modelowania, wykorzystywane przy konstruowaniu diagramów komponentów w UML 2.*,
przedstawiono w Tab. 1.
Kategoria modelowania
Notacja
komponent
interfejs udostępniający
interfejs pozyskujący
port
Port złoŜony
zaleŜność
realizacja
«realize»
Konektor delegowany
«delegate»
Konektor składany
Tab. 1 Kategorie modelowania dla diagramu komponentów w UML 2.*
Komponenty mogą być opatrywane stereotypami. Przykładowe stereotypy to: podsystem (ang. subsystem),
program wykonywalny (ang. executable), biblioteka (ang. library) i baza danych/tabela bazy danych (ang. table).
Przykładowe diagramy komponentów przedstawiają Rys. 1 i Rys. 2.
cod Ticket reservation system
component
named interface
IReservations
Ticket reservation
dependency
User interface
Repertoire updating
unnamed interface
Rys. 1 Przykładowy diagram komponentów (1)
Diagramy komponentów pokazują zaleŜności pomiędzy komponentami oprogramowania. Komponenty mogą
istnieć w róŜnym czasie: niektóre z nich w czasie kompilacji (komponenty kodu źródłowego), niektóre w czasie
konsolidacji (komponenty kodu binarnego), zaś niektóre tylko w czasie wykonania (komponenty kodu
wykonywalnego). Diagram komponentów jest przedstawiany w postaci grafu skierowanego, gdzie węzłami są
komponenty, a łuki w postaci strzałek z przerywaną linią modelują zaleŜności występujące pomiędzy klientami i
dostawcami pewnej informacji. Bezpośrednia specyfikacja klientów i dostawców informacji ma duŜe znaczenie
dla przeprowadzania modyfikacji elementów systemu: zmiany wprowadzane do elementu modelującego
dostawcę pewnej informacji mogą skutkować koniecznością wprowadzania zmian do elementów modelujących
jej klienta.
cod SHOP
IOrder
«delegate»
IPerson
«component»
«component»
IOrder
Orders
IPerson
Clients
IAccount
IProduct
ball&socket
IProduct
«delegate»
«component»
Products
IAccount
Rys. 2 Przykładowy diagram komponentów (2)
Zbiór komponentów składających się na kod systemu moŜe być opisany na dwa sposoby:
•
Poprzez utworzenie listy komponentów wraz ze specyfikacją ich zaleŜności – jest to tzw. biblioteka
komponentów. W tym przypadku bardzo pomocne jest nazywanie interfejsów.
•
Poprzez diagram komponentów ilustrujący sieć ich wzajemnych zaleŜności. Diagram komponentów
pokazuje takŜe, za realizację jakiego interfejsu jest odpowiedzialny kaŜdy z komponentów.
7.2.2
Przykład z kancelarią prawniczą
Na Rys. 3 zaprezentowano diagram komponentów skonstruowany w oparciu o tekst specyfikujący wymagania
dla systemu wspierajacego pracę kancelarii prawniczej (rozdział 2, podrozdział 2.10).
cod Law office
People handling
User interface
Cases handling
Rys. 3 Diagram komponentów dla systemu wspierającego pracę kancelarii prawniczej
7.2.3
Diagramy wdroŜeniowe
Diagramy wdroŜeniowe przedstawiają konfigurację następujących elementów czasu wykonania:
•
komponentów sprzętowych, czyli fizycznych jednostek posiadających pamięć, a często równieŜ moc
obliczeniową;
•
komponentów oprogramowania (kod wykonywalny);
•
obiektów związanych z komponentami.
Diagram wdroŜeniowy jest grafem, gdzie wierzchołki, zwane tu węzłami, połączone są liniami
odwzorowującymi połączenia komunikacyjne komponentów sprzętowych (Rys. 4). Węzły, podobnie jak
połączenia komunikacyjne, mogą być opatrzone stereotypami, np.: «CPU», «pamięć». Węzły przechowują
obiekty i wystąpienia komponentów; węzły mogą brać udział w związkach generalizacji.
dd Ticket reservation system
communication channel
:Server
:Laptop
node
:Ticket
reservation
:User
interface
IReservations
Rys. 4 Przykładowy diagram wdroŜeniowy
W UML istnieje moŜliwość zastąpienia symboli standardowych symbolami specjalnymi, które mogą znacząco
ułatwiać percepcję diagramów (Rys. 5).
Main server
Corporate
Ethernet
Internet
Web Client
Accounting
server
Local
branch
Ethernet
Windows-based PC
Windows-based PC
Rys. 5 Diagram wdroŜeniowy z wykorzystaniem specjalnych symboli
7.3
Diagramy pakietów
Pakiety grupują elementy danego (jednego) modelu wraz z występującymi pomiędzy tymi elementami relacjami.
Elementy, wchodzące w skład pakietu, to tzw. elementy wysokiego poziomu, jak np.: klasy i ich związki,
maszyny stanów, grafy przypadków uŜycia, itp. To, co jest zawarte w elementach wysokiego poziomu, np.
atrybuty, operacje, wnętrza stanów zagnieŜdŜonych, linie Ŝycia, komunikaty, itp., z reguły nie pojawia się jako
bezpośrednia zawartość pakietów. Pakiet zazwyczaj nie posiada swojego interfejsu (oprócz specjalnego rodzaju
pakietu zwanego podsystemem – patrz podpunkt omawiający specjalne rodzaje pakietów 7.3.3) a zaleŜności
występujące pomiędzy pakietami wynikają z relacji między ich elementami składowymi. ZaleŜności są
przedstawiane na diagramach pakietów w postaci strzałek z przerywaną linią i mogą być opatrywane
stereotypami. Relacje między elementami, opisywane pośrednio przez zaleŜności, mogą być róŜnego rodzaju,
ale tego typu informacja zazwyczaj nie jest przenoszona przez diagramy pakietów – dzięki specyfikacji
zaleŜności uwidaczniany jest jedynie fakt występowania relacji, a nie jej rodzaj, np. fakt istnienia asocjacji
między dwiema klasami umieszczonymi w dwóch róŜnych pakietach. Bezpośrednie pokazywanie relacji
pomiędzy elementami zawartymi w róŜnych pakietach nie jest zabronione, zaleca się raczej jedynie podkreślanie
faktu ich występowania. Dla diagramów pakietów obowiązuje taka sama zasada abstrakcji, jak wszystkich
poprzednio omawianych rodzajów diagramów: szczegóły nigdy nie powinny utrudniać rozumienia całości.
Pakiety mogą być zagnieŜdŜane oraz mogą brać udział w związkach dziedziczenia, co jest zaznaczane
analogicznie jak na diagramach klas.
Dany model zazwyczaj opisywany jest przez wiele pakietów. Definicja kaŜdego elementu wchodzącego w skład
modelu moŜe znajdować się tylko w jednym z pakietów opisujących model. Podział modelu na pakiety jest
arbitralny, ale u jego podstaw powinny leŜeć racjonalne przesłanki, np. wspólna funkcjonalność, silne
skojarzenia, itp.
Kategorie modelowania, wykorzystywane przy konstruowaniu diagramów pakietów w UML 2.*, przedstawiono
w Tab. 2. Jak widać, pakiet jest przedstawiany w postaci duŜego prostokąta z małym prostokątem, zwanym
„etykietą”, umieszczonym w lewym górnym rogu. JeŜeli zawartość pakietu nie jest pokazana, wówczas nazwa
pakietu jest wpisana do większego prostokąta; w przeciwnym przypadku nazwa pakietu jest umieszczana w
etykiecie.
Kategoria modelowania
Notacja
pakiet
zaleŜność
zagnieŜdŜanie
+
Tab. 2 Kategorie modelowania dla diagramów pakietów w UML 2.*
Rys. 6 przedstawia róŜne sposoby prezentowania zagnieŜdŜania pakietów.
Package A
Package A
Package B1
Package B1
Package B2
Package B2
Package B3
Package B3
Package B4
Package B4
Package A
+
Package B1
Package B2
Package B3
Package B4
Rys. 6 RóŜne sposoby prezentowania zagnieŜdŜania pakietów
7.3.1
Odwołania między pakietami
Pakiet (klient), który odwołuje się do elementu w innym pakiecie (dostawcy informacji), moŜe wykorzystać
pakiet zawierający ten element, uŜywając zaleŜności typu «import» albo «access» (będących rodzajami
zaleŜności typu «usage»). Główną cechą róŜniącą oba rodzaje zaleŜności jest odmienny sposób traktowania
nazw elementów.
Nazwy z pakietów zaimportowanych za pomocą zaleŜności typu «import» są dodawane do przestrzeni nazw
pakietu importującego. Na przykład na diagramie z Rys. 7 nazwy z pakietu Q są dodawane do przestrzeni nazw
pakietu P, co oznacza, Ŝe elementy z P traktują nazwy z Q tak samo jak nazwy z P (uwaga: moŜe tutaj wystąpić
konflikt nazw).
Class notion
P
Q
«import»
A
E
X:E
Rys. 7 Ilustracja zaleŜności typu «import»
Dla zaleŜności typu «access» nazwa, do której następuje odwołanie, musi być poprzedzona nazwą pakietu, w
którym jest zdefiniowana. Na Rys. 8 pokazano, Ŝe atrybut X w klasie A zawartej w pakiecie P będzie
wystąpieniem klasy E, której definicja została umieszczona w pakiecie Q. Nazwa klasy E została poprzedzona
nazwą pakietu Q, co ma zapobiec wystąpieniu konfliktu nazw.
P
Q
A
«access»
E
X:Q::E
Rys. 8 Ilustracja zaleŜności typu «access»
7.3.2
Reguły widoczności
Pakiet widzi wszystkie zewnętrzne dla niego pakiety poprzez pakiet, wewnątrz którego jest zagnieŜdŜony;
innymi słowy, zagnieŜdŜony pakiet widzi wszystko to, co widzi pakiet, który go zawiera. Specjalne symbole
„+” (publiczny), „–” (prywatny) oraz „#” (chroniony) są uŜywane na oznaczenie widoczności elementu
zawartego w pakiecie na zewnątrz pakietu. Zasady widoczności dla elementów zawartych w pakietach są
następujące:
•
Element zdefiniowany w danym pakiecie jest widoczny dla innych elementów tego pakietu.
•
Jeśli element jest widoczny w pakiecie A, to jest widoczny we wszystkich pakietach, które są w A
zagnieŜdŜone.
•
Jeśli pakiet B jest powiązany zaleŜnością z pakietem A, to wtedy wszystkie elementy o widoczności
publicznej w A są widoczne w B.
•
Jeśli pakiet B dziedziczy z pakietu A, to wtedy wszystkie elementy w A o widoczności publicznej lub
chronionej są widoczne w B.
ZaleŜności nie są przechodnie, tzn. jeśli A jest połączone zaleŜnością z B, a B z C, to nie znaczy, Ŝe A jest
połączone zaleŜnością z C. ZaleŜności nie są teŜ symetryczne.
Ponadto, UML określa następujące reguły widoczności dla elementów klas w pakietach:
•
Elementy zawarte wewnątrz klasy, np. atrybuty, operacje czy klasy zagnieŜdŜone są widoczne (dostępne
dla innych klas) wewnątrz pakietu, jeśli widoczność tych elementów jest publiczna.
•
W przypadku dziedziczenia, podklasa widzi elementy o widoczności publicznej i chronionej.
•
Cała zawartość klasy jest widoczna wewnątrz klasy.
Rys. 9 stanowi ilustrację powyŜszych reguł. Pakiet A jest powiązany zaleŜnością typu «access» z pakietem B;
zaleŜność odwrotna nie występuje. Klasa U w pakiecie B – o widoczności publicznej – jest dostępna dla klas X i
Y w pakiecie A. Klasa V, jako klasa o widoczności prywatnej, nie jest dostępna dla klas z pakietu A. Klasy U i V
nie mają dostępu do Ŝadnej klasy w pakiecie A pomimo publicznej widoczności klasy X (brak odpowiedniej
zaleŜności – pakiet B nie ma dostępu do pakietu A). Klasy X i Y, podobnie jak U i V, jako klasy zdefiniowane w
tym samym pakiecie widzą nawzajem swoje publiczne elementy.
A
B
+X
+U
«access»
-Y
-V
Rys. 9 Ilustracja reguł widoczności dla pakietów
Z kolei Rys. 10 pokazuje sposób, w jaki moŜna uczynić diagram bardziej czytelnym prowadząc zaleŜność od
wewnętrznej granicy pakietu; zaleŜność ta oznacza, Ŝe wszystkie elementy zawarte w pakiecie A odwołują się do
publicznych elementów pakietu C. Podobny sposób „upraszczania” diagramów – polegający na zmniejszeniu
liczby elementów bez utraty informacji – był juŜ prezentowany dla diagramów stanów przy opisie stanów
złoŜonych.
A
A
«access»
+X
«access»
+X
C
B
C
+K
+K
B
-L
-L
«access»
Rys. 10 Wykorzystanie zaleŜności poprowadzonej od wewnętrznej granicy pakietu
7.3.3
Specjalne rodzaje pakietów
UML wyróŜnia następujące specjalne rodzaje pakietów:
•
«fasada» (ang. «facade») – zawiera wyłącznie odwołania do elementów zdefiniowanych w innych
pakietach.
•
«model» – stanowi abstrakcję systemu widzianą z pewnej perspektywy. Zwykle zawiera drzewo
pakietów. Model moŜe zawierać relewantne elementy z otoczenia systemu, np. aktorów. Elementy z
róŜnych modeli nie oddziaływują bezpośrednio na siebie, ale często stanowią róŜne reprezentacje tego
samego bytu, róŜniące się na przykład ilością detali, co moŜe wymuszać potrzebę łączenia ich
zaleŜnością typu «trace» czy «refinement».
•
«podsystem» (ang. «subsystem») – reprezentuje pewien spójny, logiczny, wyizolowany z kontekstu
fragment systemu oraz posiada dobrze wyspecyfikowany zbiór interfejsów do interakcji z otoczeniem.
Podsystem podzielony jest na dwie części: specyfikacyjną i realizacyjną. Część specyfikacyjna zawiera
opis interakcji z otoczeniem, z reguły za pomocą przypadków uŜycia. Część realizacyjna, posługując się
kolaboracjami, podaje sposoby realizacji przypadków specyfikowanych w pierwszej części opisu
podsystemu. Podsystemy mogą być zbudowane z innych podsystemów, przy czym podsystemy
najniŜszego poziomu muszą zawierać elementy modelu. Podsystem stanowi zgrupowanie elementów
modelu logicznego, podczas gdy komponent jest zgrupowaniem elementów modelu implementacyjnego.
W wielu przypadkach podsystemy są implementowane jako komponenty, co upraszcza transformację
modelu logicznego w implementacyjny i przez to jest powszechnie stosowanym podejściem.
7.3.4
Przykład z kancelarią prawniczą
Na Rys. 11 zaprezentowano diagram pakietów skonstruowany w oparciu o tekst specyfikujący wymagania dla
systemu wspierajacego pracę kancelarii prawniczej (rozdział 2, podrozdział 2.10).
pd Law office
People handling
Cases handling
User interface
Rys. 11 Diagram pakietów dla systemu wspierającego pracę kancelarii prawniczej
7.4
Podsumowanie
Konstruowanie diagramów implementacji jest uŜyteczne zarówno ze względu na ponowne uŜycie, jak i ze
względu na moŜliwość uzyskania za ich pomocą odpowiednich parametrów wydajnościowych projektowanego
systemu.
Z kolei stosowanie pakietów ułatwia zarządzanie przechowywaniem, konfiguracjami oraz modyfikowaniem
elementów systemu – dobrze przeprowadzony podział na pakiety moŜe znacząco ułatwić zarządzanie procesem
budowy produktu programistycznego.
Problematykę diagramów pakietów moŜna podsumować następująco:
•
Pakiety stanowią zgrupowanie elementów modelu.
wykorzystywanym do budowy struktur hierarchicznych.
•
KaŜdy element modelu, który nie jest zawarty wewnątrz innego elementu modelu, musi być
zdefiniowany wewnątrz dokładnie jednej przestrzeni nazw (ang. home package).
•
Oprócz elementów modelu pakiet moŜe takŜe zawierać inne pakiety (poprzez zagnieŜdŜanie).
•
Pakiety mogą brać udział w związkach dziedziczenia.
•
WyróŜnia się pakiety specjalnego rodzaju, m.in. «fasada», «model» oraz «podsystem».
Są
środkiem
ogólnego
przeznaczenia
•
7.5
W praktyce, podsystemy są implementowane jako komponenty, co upraszcza transformację modelu
logicznego w model implementacyjny.
Przykładowe pytania i problemy do rozwiązania
1.
Krótko scharakteryzuj cel budowy diagramów implementacyjnych.
2.
Wymień i omów rodzaje diagramów implementacyjnych.
3.
Zdefiniuj pojęcia: komponent, wystąpienie komponentu, interfejs, port, zaleŜność, węzeł.
4.
Kiedy, w jakich sytuacjach i w jakim celu wykorzystywane są diagramy pakietów?
5.
Podaj notację UML dla pakietu w oparciu o prosty przykładowy diagram.
6.
Jakie rodzaje związków mogą występować między pakietami?
7.
Wymień i krótko omów specjalne rodzaje pakietów.
8.
Co oznacza pojęcie: home package?
9.
Jaka zaleŜność występuje pomiędzy pojęciami: podsystem i komponent? Na jakim etapie cyklu Ŝyciowego
produktu informatycznego funkcjonuje kaŜde z tych pojęć?
10. W oparciu o tekst specyfikujący wymagania dla systemu wspierającego pracę wypoŜyczalni płyt dvd
(rozdział 2, podrozdział 2.12), skonstruuj diagram pakietów oraz diagram komponentów.

Podobne dokumenty