UML - Unified Modelling Language (www.uml.org)
UML pomaga w specyfikacji, dokumentacji i wizualizacji projektowanych systemów informatycznych. Jego główną część stanowi 12 diagramów:
Jednak poza samymi diagramami z używania UML-a płyną także inne korzyści:
Aktualna "oficjalna" specyfikacja UML - 1.5; wkrótce jednak zostanie zastąpione przez poprawioną wersję 2.0.
Materiały do ćwiczeń i programy (format .tar.gz)
Materiały do ćwiczeń i programy (format .zip)
Strona domowa programu Dia Diagrams
Aktor | |
Przypadek użycia | |
Powiązania między przypadkami użycia | |
Specjalizacja |
Ćw.: znajduje się w pliku UseCaseDiagram1.dia. Rozwiązanie można znaleźć tu.
Stan początkowy/ końcowy | |
Czynność | |
Rozgałęzienie | |
Wykonanie współbieżne | |
Powiązanie między czynnościami |
Ćw.: znajduje się w pliku ActivityDiagram1.dia. Rozwiązanie można znaleźć tu.
Klasa | |
Agregacja | |
Asocjacja | |
Zależność | |
Dziedziczenie |
Strona domowa programu dia2code: http://dia2code.sourceforge.net/
Program "Dia2code" jest wygodnym narzędziem do automatycznego generowania kodu w Javie, lub innych językach, takich jak C++, na podstawie diagramów klas stworzonych w Dia Diagrams. Zależności między graficznym zobrazowaniem klas, a ich tłumaczeniem na kod są w większości przypadków intuicyjne, najlepiej jednak przyjrzeć się im z bliska i dla kilku eksperymentalnych diagramów wygenerować kod (na naszych zajęciach będzie to kod w języku Java).
./dia2code -h (uzyskanie krótkiej informacji o programie)
Dla poniższych przykładów najwygodniej wywołać ./dia2code -t java -cl < lista aktualnie omawianych klas >
Dla takiego określenia klasy Point został wygenerowany następujący kod:
public class Point {
/** Attributes */
private Float x;
private Float y;
}
Ćw.: spróbuj zmienić nazwy, typ, widoczność, domyślną wartość atrybutów i sprawdź co wygeneruje Dia2code.
Uwaga! Dia pozwala nadać dwum atrybutom identyczne nazwy, a Dia2code wygeneruje nieprawidłowy kod.
Przedstawiony na rysunku związek oznacza, że klasa Circle składa się (między innymi) z itsCentre (trzeba wpisać odpowiednią rolę w okienku edycji strzałki), które jest obiektem klasy Point. Klasa Circle zawiera również kilka metod.
Obejrzyj wygenerowany kod.
Ćw.: dodaj do Circle metodę publiczną Circumference(): Float.
Klasy Circle i Rectangle dziedziczą po abstrakcyjnej klasie Shape (sprawdź jej parametry w Dia). Dodaj klasę Square dziedziczącą po Rectangle.
Jednym z atrybutów obiektów klasy Window jest obiekt rozbudowanej klasy DrawingContext (zauważ, że kod generowany przy zwykłym związku jest identyczny jak przy agregacji, a co będzie atrybutem czego, jest mniej jasne). Klasa ta składa się również z zera, lub wielu obiektów klasy Shape (krotność nie wpływa na kod, Dia2code nie wie w jaki sposób będziemy przechowywać obiekty Shape).
Argument metody Draw w klasie Shape jest elementem klasy DrawingContext, więc
klasa ta powinna coś wiedzieć o klasie DrawingContext. Obrazujemy to przerywaną strzałką (zwróć uwage na
kierunek), a Dia2code zrealizuje to przez
import DrawingContext;
w kodzie klasy Shape.
Jak widać korzystanie z programu Dia2code jest rodzajem kompromisu między tym, co chcemy powiedzieć, a tym, co chcielibyśmy wygenerować. Wydaje się jednak, że wygodniej, na przykład używać agregacji zamiast prostych zwiazków, gdyż diagram staje się bardziej czytelny, gdy wiemy jaki kod zostanie dla niego wygenerowany.
W dii diagramy ERD można wykonać używając komponentów UML, a następnie za pomocą programu tedia2sql wygenerować z diagramu skrypt zakładający bazę m.in. dla mysqla, oracla i postresql-a.
Interpretacja komponentów UML-owych w kontekście ERD:
Encje reprezentujemy za pomocą komponentu "Class". Atrybutami encji to atrybuty klasy. Atrybuty tworzące klucz główny to atrybuty klasy z widocznością ustawioną na "protected". Typy pól muszą odpowiadać typom w bazie danych, np. VARCHAR, NUMBER. Jako wartość można podać NOT NULL (wtedy pole nie będzie mogło przechowywać wartości NULL), albo NULL. Można ukryć część klasy odpowiadającą za metody, w opcjach enji odznaczając pole "Operations Visible". | ||
Relację jeden-do-wielu reprezentujemy za pomocą komponentu agregacji. Jeżeli romb po jednej stronie relacji zamienimy (w wyobraźni oczywiście) na "miotłę", to wszystko stanie się jasne. W właściwościach relacji w pola "Role" należy wpisać które pole z obu encji sobie odpowiadają, czyli które mają się "zgadzać". Pola te muszą mieć te same typy. Opcjonalnie można też nazwać relację - będzie to nazwa wygnereowanego klucza obcego. W pole "Multiplicity" można wpisać krotność: np. 1, 0..*, 1..*. | ||
Relację jeden-do-jednego reprezentuje się za pomocą komponentu asocjacji. Jedyną zmianą w stosunku do poprzedniego punktu jest to, że dodatkowo trzeba określić kierunek relacji: która encja jest ojcem, a która dzieckiem - pole "Direction" w własnościach relacji. |
Główne opcje programu tedia2sql:
Ćw.: w pliku erd.dia jest już gotowy diagram encji. Dodaj do niego encję "Koło" i stwórz odpowiednią relację z samochodem, po czym wygeneruj skrypt do tworzenia bazy danych dla postgresql-a.
Więcej informacji o używaniu programu tedia2sql i wykorzystaniu innych komponentów UML można znaleźć tutaj.
Linie życia obiektów tworzymy za pomocą komponentów "Lifeline", co nie wydaje się być bardzo zaskakujące. W jej opcjach możemy dodatkowo dodać znak zniszczenia obiektu. | ||
Komunikaty reprezentowane są przez komponent "Message". W opcjach można określić jakiego typu jest wysyłany komunikat: może byc to wywołanie metody ("Call"), w tym przypadku należy wpisać jej nazwę. Może to być też powrót rekurencyjny ("Recursive"), albo zwykły ("Return"). Dostępne są też inne opcje. |
Przykład diagramu interakcji znajduje się w pliku InteractionDiagram.dia.
Mogłoby się wydawać że UML jest pozbawiony wad, ale oczywiście tak nie jest. Jak każde narzędzie, trzeba je wykorzystywać umiejętnie. Główne zagrożenia:
Strona domowa programu Poseidon
Bezpłatną wersję "community" można ściągnąć ze strony producenta. Można też uruchomić ją bezpośrednio z przeglądarki.