Sequence Diagram - to diagram, który uwypukla kolejność komunikatów w czasie; ma postać tabeli, w której obiekty są ułożone wzdłuż osi X a komunikaty wzdłuż osi Y, uporządkowane według czasu ich wysyłania. W diagramach tych kładzie się nacisk na sposób przekazywania komunikatów w miarę ich pojawiania się, diagramy te są szczególnie przydane w kontekście scenariusza przypadków użycia.
W systemie wspomagającym zarządzanie miejskiej firmy kurierskiej do wyboru sposobu przewiezienia przesyłki przeprowadzana jest symulacja czasu przewiezienia różnymi środkami transportu (rower, motor, samochód, ciężarówka). W tym celu obiekt klasy Analityk chcąc poznać najlepszy śr. transportu, tworzy obiekt tymczasowy klasy Szacowanie, który po zakończeniu szacowania jest usuwany. Czas potrzebny na przewiezienie zależy od wielkości paczki i odległości (np. nie każdą paczkę można zawieźć rowerem, a do zawiezienia listu nie potrzeba ciężarówki). Narysuj diagram przebiegu dla opisanej sytuacji. Klasy i metody do wykorzystania:
ŚrodkiTransportu Ilość() – zwraca ilość śr. transportu Podaj(nr) – zwraca śr. transportu z pozycji o zadanym numerze
Środek CzyPrzewiezie(przesyłka) – czy można przewieźć taką przesyłkę tym środkiem transportu
PlanMiasta Czas(start, koniec, srodek) – zwraca czas potrzebny do osiągnięcia celu zadanym śr. transportu
Szacowanie Szacowanie(start, koniec, przesylka) – konstruktor, oblicza czasy dla różnych możliwości PodajNajszybszy() – zwraca najszybszy środek transportu w danym przypadku
Na początku musimy wybrać diagram przebiegu w tym celu wybieramy go z okna Create New Diagram i klikamy Finish tak jak na rys 135:
Rysunek 135
Pojawia nam się okno edytora z dobrze znaną paletą narządzi dzięki którym stworzymy nasz diagram (widok na rys. 136).
Rysunek 136
Wczytując się w treść zadania widzimy że na pewno musimy stworzyć obiekt aktora oraz cztery linie życia dla obiektów klasy Szacowanie, SredekTransportu, Srodek oraz PlanMiasta, z czego obiekt klasy Szacowanie zostanie stworzony przez aktora. Zacznijmy więc od stworzenia aktora w tym celu z okna palety wybieramy opcję:. Klikamy LPM na obszarze przeznaczonym do edycji i wyniku otrzymujemy widok:
Rysunek 137
Widzimy że aktor został stworzony jednak nie ma on żadnej nazwy ani przydzielonej klasy. W tym celu klikamy na obszar zaznaczony strzałką na rys. 137 dwa razy LPM i otrzymujemy obszar przygotowany do edycji (jak na rys. 138).
Rysunek 138
Wpisując nazwę analityk:Analityk i zatwierdzając ja ENTER-em pojawi nam się komunikat (jeżeli wcześniej mieliśmy już stworzoną klasę Analityk nie zobaczymy takiego komunikatu):
Rysunek 139
Wystarczy tylko zatwierdzić wciskając YES, w tym momencie stworzymy klasę Analityk a w oknie edytora zobaczymy następujący widok:
Rysunek 140
Stwórzmy teraz trzy linie życia dla obiektów klasy SrodekTransportu, Srodek oraz PlanMiasta obiektem klasy Szacowanie zajmiemy się za chwilkę. Zacznijmy więc od obiektu pierwszej klasy. W oknie palety wybieramy opcję: i klikamy LPM w dowolnym miejscu na obszarze edytora. Powinniśmy w efekcie otrzymać następujący widok:
Rysunek 141
Znowu widzimy puste pole w nazwie obiektu i jego klasie, więc analogicznie do przypadku z aktorem klikamy 2xLPM na ten obszar i wpisujemy srodT:SrodkiTransporu. Zatwierdzamy ENTER-em (ponownie może wyskoczyć komunikat z wiadomością że taka klasa jeszcze nie istnieje, wiemy jak sobie z tym poradzić) i oto stworzyliśmy linię życia obiektu (patrz rys. 142).
Rysunek 142
Podobnie postępujemy z pozostałymi dwoma liniami życia i w efekcie otrzymujemy poniższy widok:
Rysunek 143
Widzimy że utworzyliśmy trzy linie życia. Zauważyć również można że w miejscu oznaczonym na rys. 127 strzałką utworzyły się pomocnicze nazwy z obiektami i ich klasami. Bardzo przydatna opcja w momencie kiedy nasz diagram jest bardzo obszerny i nie widzimy z czym związana jest poszczególna linia życia.
Zacznijmy dodawać teraz do naszego diagramu poszczególne metody zgodnie z kolejnością ich pojawiania się. Zaczynamy więc od wywołania metody Szacowanie(), która jest zarazem konstruktorem klasy Szacowanie i stworzy nam obiekt tej klasy. W tym celu wybieramy z palety opcję . Pojawia nam się dobrze już nam znana różdżka. Najpierw klikamy 1xLPM na linie życia aktora a potem na dowolne miejsce w polu edycji otrzymując w ten sposób rezultat jak na rys. 144
Rysunek 144
Nazwijmy nowo powstały obiekt sz:Szacowanie. W ten sposób otrzymamy wynik jak na rys. 145
Rysunek 145
Widzimy że połączenie stworzyło sie bez żadnych problemów, jednak przydałoby sie je podpisać żeby było wiadomo jaką metodę wywołujemy w tym momencie, oraz jaki jest stereotyp tej metody w naszym przypadku będzie to <<create>>. Najłatwiej te dwie rzeczy jest zmienić klikając PPM na połączenie i wybierając opcje Properties jak na rys. 146.
Rysunek 146
Pojawi nam się okno jak poniżej:
Rysunek 147
Tutaj w polu Name możemy wybrać nazwę metody, a klikając na … (oznaczone strzałką na rys. 147) przy opcji Stereotypes wpisać stereotyp <<create>>.
W wyniku nasze okno powinno wyglądać następująco:
Rysunek 148
Klikamy na Close i w wyniku w edytorze widzimy następujący widok:
Rysunek 149
Nie pokazał nam sie stereotyp, ale to niestety jest jedna z wad Netbeansa. Jeżeli na początku nie widzimy również i nazwy metody Szacowanie(), wtedy należy kliknąć PPM na połączenie i wybrać opcję Labels -> Show Message Name jak na rys. 150.
Rysunek 150
Teraz wywołamy synchroniczną metodę Ilosc(), która zwróci nam zmienną N. Początek wywołania będzie z obiektu sz koniec w obiekcie srodT. Do tego celu z palety wybieramy opcję:. Pojawia nam się różdżka, najpierw klikamy 1xLPM na linie życia obiektu sz, potem ponownie LPM na linie życia obiektu srodT. W wyniku otrzymujemy:
Rysunek 151
Widzimy że linie nie są podpisane. Musimy nadać im nazwy , postępujemy tak jak przed chwilą, w wyniku otrzymujemy:
Rysunek 152
Teraz chcemy wykonywać metodę w pętli od 1 do wartości N zwróconej przez metodę Ilosc(). W tym celu wybieramy z palety opcję: . I na obszarze edytora zaznaczamy gdzie chcemy umieścić nasz blok. Otrzymamy w ten sposób widok jak na rys. 153.
Rysunek 153
Chcemy żeby nasz blok był typu LOOP, zmienić możemy to we właściwościach bloku, klikając PPM na obramowanie chodzimy w opcje Properties i pojawia się okno:
Rysunek 154
W opcjach operator zmieniamy na loop (widoczne na rysunku 155)
Rysunek 155
Teraz chcielibyśmy dodać opis że pętla wykonuje się od 1 do N. W tym celu klikamy na blok PPM i wybieramy opcję Interaction Opernd -> Edit Interaction Constraint (jak na rys. 156).
Rysunek 156
W oknie edytora pojawi nam się teraz widok z rys. 157.
Rysunek 157
Na rys. 157 widzimy zaznaczone pole [<expression>], klikamy na ten napis 2xLPM i poprawiamy to na i=1..N. Otrzymujemy poniższy widok:
Rysunek 158
Teraz w analogiczny sposób dodajemy pozostałem metody i blok OPT. Jeżeli wszystko zrobimy prawidłowo powinniśmy otrzymać wynik jak na rys. 159 .
Rysunek 159
Warto się tutaj na chwilkę zatrzymać i zwrócić uwagę na metodę czas. Widzimy że jest ona asynchroniczna. Jak to zrobiliśmy, bardzo podobnie do metody synchronicznej tylko trzeba wybrać odpowiednią opcję z palety – mianowicie . Teraz możemy spokojnie przejść do napisania asynchronicznej metody PodajNajszybszy() oraz destruktora ~Szacowanie() (koniecznie nie zapomnijmy dodać stereotypu <<destroy>> - wiemy jak to zrobić). Po dodaniu dwóch metod musimy zniszczyć linię życia elementu sz. W tym celu wystarczy kliknąć w palecie opcję: i po pojawieniu się różdżki kliknąć LPM na koniec linii życia obiektu sz. W wyniku otrzymamy widok jak rys 160:
Rysunek 160
GRATULACJE!!! Właśnie stworzyłeś (-aś) diagram sekwencji.
2
Metaloman