Diagramy klas UML. Mateusz Kobos 17.03.2011



Podobne dokumenty
Rysunek 1: Przykłady graficznej prezentacji klas.

Diagramy klas. dr Jarosław Skaruz

Modelowanie diagramów klas w języku UML. Łukasz Gorzel @stud.umk.pl 7 marca 2014

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Podstawy projektowania systemów komputerowych

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Modelowanie obiektowe

UML w Visual Studio. Michał Ciećwierz

Laboratorium 6 DIAGRAM KLAS (Class Diagram)

Programowanie obiektowe

Diagramy klas. WYKŁAD Piotr Ciskowski

Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 2 Ćwiczenia w narzędziu CASE diagram klas. Materiały dla nauczyciela

Programowanie obiektowe

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy programowania III WYKŁAD 4

Podstawy języka UML UML

Język UML w modelowaniu systemów informatycznych

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

UML. zastosowanie i projektowanie w języku UML

Technologie obiektowe

UML cz. II. UML cz. II 1/38

Podstawy modelowania w języku UML

Programowanie obiektowe

Baza danych przestrzennych modelowa reprezentacja fragmentu świata rzeczywistego

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Dziedziczenie. dr Jarosław Skaruz

Paweł Kurzawa, Delfina Kongo

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dokumentacja do API Javy.

Analiza i programowanie obiektowe 2016/2017. Wykład 6: Projektowanie obiektowe: diagramy interakcji

Język UML w modelowaniu systemów informatycznych

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wykład 8: klasy cz. 4

Język UML w modelowaniu systemów informatycznych

Materiały do zajęć VII

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Inżynieria Oprogramowania. UML Schematy klas

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Enkapsulacja, dziedziczenie, polimorfizm

4. Język UML Alfabet

Inżynieria oprogramowania. Część 5: UML Diagramy klas

INŻYNIERIA OPROGRAMOWANIA. laboratorium

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Klasy abstrakcyjne i interfejsy

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

DIAGRAM KLAS. Kamila Vestergaard. materiał dydaktyczny

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Baza danych przestrzennych modelowa reprezentacja fragmentu świata rzeczywistego

Technologie i usługi internetowe cz. 2

Modelowanie danych, projektowanie systemu informatycznego

TECHNOLOGIE OBIEKTOWE. Wykład 3

Aplikacje w środowisku Java

Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 5 Ćwiczenia w narzędziu CASE diagram przypadków uŝycia. Materiały dla nauczyciela

PHP 5 język obiektowy

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.

Programowanie obiektowe - 1.

1 Projektowanie systemu informatycznego

Podstawy języka UML UML

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 2 Ćwiczenia w narzędziu CASE diagram klas. Materiały dla studentów

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie obiektowe

Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 1 Wprowadzenie do narzędzia CASE. Materiały dla nauczyciela

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

RDF Schema (schematy RDF)

Przykładowy dokument XML

MODELOWANIE OBIEKTOWE

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

SysML Tworzenie diagramu kontekstowego i bloków wewnętrznych SysML003

GUI - projektowanie interfejsów cz. II

UML a kod. C++, Java i C#

Kurs programowania. Wykład 12. Wojciech Macyna. 7 czerwca 2017

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Modelowanie klas i obiektów. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Podstawy języka UML2 w realnych projektach

UML - zarys 2007/2008

Programowanie obiektowe

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Kurs WWW. Paweł Rajba.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Polimorfizm. dr Jarosław Skaruz

Podstawy Języka Java

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Podstawy inżynierii oprogramowania

Pakiety i interfejsy. Tomasz Borzyszkowski

Programowanie i projektowanie obiektowe

Podstawy Programowania Obiektowego

Wzorce projektowe. dr inż. Marcin Pietroo

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Polimorfizm, metody wirtualne i klasy abstrakcyjne

MAS dr. Inż. Mariusz Trzaska

Diagramy UML, przykład problemu kolizji

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń

Transkrypt:

Diagramy klas UML Mateusz Kobos 17.03.2011

UML UML to najpopularniejszy sposób graficznego opisywania budowy programu obiektowego. UML = Unified Modeling Language powstał z połączenia kilku wcześniejszych języków. UML jest opisany w standardzie UML 2.3, jednak w praktyce korzysta się również z pewnych nie ujętych w standardzie (za to popularnych) konwencji. 2/31

UML przykładowy diagram klas 3/31

Podstawowe informacje Nie jest zdefiniowane, jak diagram UML przekłada się na określony język programowania przy implementacji zawsze zachodzi potrzeba interpretacji diagramu przez człowieka. Szczegółowość diagramów zależy od fazy tworzenia oprogramowania przy analizie problemu diagramy ogólne, przy tworzeniu dokumentacji technicznej diagramy bardziej szczegółowe. Na jednym diagramie można używać elementów należących do różnych typów diagramów. Najczęściej używane diagramy UML to diagramy klas, które służą do reprezentowania statycznej struktury programu. 4/31

Podstawowe informacje ukrywanie informacji Podstawowa zasada UML: każda informacja na diagramie może zostać pominięta Np. klasa Farm w wersji rozszerzonej i w wersji z ukrytą większością informacji 5/31

Podstawowe informacje ukrywanie informacji Wniosek: na podstawie nieobecności jakiegoś elementu na diagramie nie można wyciągać wniosku o obecności lub nieobecności tego elementu w modelowanym systemie np. jeśli brakuje oznaczenia krotności danej relacji, to nie można wywnioskować jaką krotność może mieć dana relacja. Nawet jeśli w standardzie UML jest określona wartość domyślna (jak krotność =1 dla atrybutów), a danej informacji nie ma na diagramie, to może może być tak dlatego, że prawdziwa wartość jest ukryta (a nie równa wartości domyślnej). Mimo to istnieją pewne konwencje jak ta, że atrybuty wielowartościowe to zbiory. 6/31

Uwagi i komentarze Uwaga/komentarz mogą być: - oddzielnym obiektem - oddzielnym obiektem połączonym przerywaną linią z komentowanym elementem - komentarzem in-line 7/31

Zależności (ang. dependencies) Jeśli klasa A zależy od klasy B, oznacza to, że A wykorzystuje B lub wie o istnieniu B. Wynika stąd, że zmiana B pociągnie za sobą prawdopodobnie zmianę A. Zależność oznacza się za pomocą strzałki rysowanej przerywaną linią Np. Farmer zależy od Animal, Animal zależy od Food W praktyce to, że klasa Animal zależy od klasy Food może np. po prostu oznaczać, że klasa Animal zawiera metodę eat(), której jednym z parametrów jest parametr typu Food. Zgodnie z definicją, możemy zauważyć, że w tym przypadku, jeśli zmieni się np. jakaś publiczna metoda klasy Food, to pociągnie to za sobą prawdopodobnie zmianę w metodzie eat() klasy Animal. 8/31

Cechy (ang. properties) Cecha odpowiada polu klasy (lub właściwości (ang. property) z języka C#) i ew. prostym metodom służącym do obsługi tego pola (typu get..., set..., add..., remove...) Są 2 alternatywne sposoby reprezentacji cechy: atrybut (ang. attribute) umieszczamy w 2. od góry prostokącie diagramu klasy, np. atrybuty: owner, ducks, insurer, animalsno Farm +owner: Person +ducks: Duck [*] +insurer: InsuranceCompany [0..1] +animalsno: Integer asocjacja/powiązanie (ang. association) reprezentowane przez ciągłe strzałki, np. asocjacje: owner, ducks, insurer; atrybuty: animalsno Farm +animalsno: Integer * +owner +ducks * Person Duck Uwaga: do reprezentacji danej cechy w danej klasie nie należy używać jednocześnie atrybutu i asocjacji (tj. należy wybrać jedno z nich). +insurer 0..1 InsuranceCompany 9/31

Cechy - atrybuty Ogólna postać atrybutu (umieszczamy w 2. od góry prostokącie diagramu klasy): Farm +owner: Person +ducks: Duck [*] +insurer: InsuranceCompany [0..1] +animalsno: Integer visibility name: type [multiplicity] = default {property-string} np. - surname: String [1] = ''Doe'' {readonly} wszystkie elementy oprócz name są opcjonalne elementy: visibility: public (+), package (~), protected (#), private (-) name: odpowiada nazwie pola klasy type: odpowiada typowi pola klasy multiplicity: krotność - liczba elementów np. 1, 3..5, * default: wartość domyślna, którą przyjmuje nowy obiekt property-string: pozwala określić dodatkowe właściwości atrybutu i ograniczenia nakładane na atrybut np. {readonly} - atrybut nie może być modyfikowany po ustawieniu początkowej wartości 10/31

Cechy asocjacje Do oznaczenia asocjacji wykorzystuje się strzałki rysowane ciągłą linią Nazwa zawieranego elementu i jego krotność znajduje się na końcu z grotem Ważniejsze spostrzeżenia: analogiczne oznaczenia jak przy atrybutach stosuje się w asocjacjach; w przeciwieństwie do atrybutu, krotność może występować po dwóch stronach relacji. +owner Person Farm +animalsno: Integer * +ducks * Duck +insurer 0..1 InsuranceCompany 11/31

Cechy asocjacje Asocjacje mogą być dwukierunkowe oznacza to parę cech połączonych ze sobą na zasadzie odwrotności. Np.: Farmer 0..1 owner chickens * Chicken Poruszając się po strukturze danych: zaczynając od określonego kurczaka, można znaleźć jego właściciela. Następnie, spośród kurczaków należących do danego farmera można znaleźć określonego kurczaka tym samym wracając do punktu wyjścia. W praktyce oznacza to, że klasa Farmer ma pole chickens a klasa Chicken ma pole owner Asocjacje mogą mieć przypisany czasownik wraz z kierunkiem asocjacji. Czasownik opisuje relację. Np.: farmer jest właścicielem kurczaków 12/31

Cechy - krotność (ang. multiplicity) Przykłady określeń krotności, które są używane do opisu własności: 1 dokładnie jeden obiekt 3..5 od 3 do 5 obiektów * - dowolna liczba obiektów (zero lub więcej) 2..* - 2 i więcej obiektów Domyślna wartość krotności dla atrybutu: 1 Domyślnie, elementy związane z cechą o krotności większej niż 1 tworzą zbiór (tzn. nie są uporządkowane, elementy nie powtarzają się). By pokazać, że elementy są uporządkowane, można użyć propertystring: {ordered} By pokazać, że elementy mogą się powtarzać, można użyć propertystring: {nonunique} 13/31

Agregacja i zawieranie Agregacja (ang. aggregation) służy do pokazania relacji A jest właścicielem B Oznaczana strzałką z białym rombem Ta sama instancja klasy B może być składnikiem wielu innych instancji klasy A Np. jeden farmer może należeć do wielu klubów A B FarmerClub members 2..* Farmer Uwaga: agregacja jest pojęciem b. zbliżonym do asocjacji, dlatego w [D] zaleca się nie stosować agregacji Zawieranie (ang. composition) służy do pokazania relacji B jest częścią A Oznaczana strzałką z czarnym rombem Jedna instancja klasy B może być składnikiem tylko jednej instancji klasy A Np. jedno koło może należeć tylko do jednego ciągnika. Tractor wheels 4 A Wheel B 14/31

Operacje (ang. operations) Operacja odpowiada metodzie klasy Operacje umieszczamy w 3. od góry prostokącie diagramu klasy, np: Farmer - getage(): Integer +feed(animal: Animal, food: Food = Water) 15/31

Ogólna postać operacji: Operacje Farmer - getage(): Integer +feed(animal: Animal, food: Food =Water) visibility name (parameter-list) : return-type {property-string} np. + feed(animal: Animal, quantity: int): Boolean wszystkie elementy oprócz name są opcjonalne elementy: visibility: public (+), package (~), protected (#), private (-) name: odpowiada nazwie metody klasy parameter-list: lista parametrów. Każdy z parametrów ma postać: direction name : type = default, gdzie wszystkie elementy oprócz name są opcjonalne name, type, default: analogicznie jak przy atrybutach direction: mówi, czy parametr jest typu input (in), output (out), input&output (inout). Domyślna wartość to in. return-type: typ zwracanej wartości property-string: pozwala określić dodatkowe właściwości operacji 16/31

Własności operacji i atrybutów Operacje i atrybuty, które są statyczne są oznaczone przez podkreślenie np. atrybut chickensno i operacja createchicken są statyczne Uwaga: typy prymitywne/podstawowe (np. int, double, String) nie są zdefiniowane w standardzie UML standardowo przyjmuje się że pochodzą one z języka, w którym będzie implementowany diagram. Nie ma oddzielnej notacji do określania, że dana cecha jest tablicą. Jednakże, gdy cecha ma stałą liczbę obiektów np. atrybut postaci ducks: Duck[7], lub asocjacja z przypisaną krotnością 7, to stanowi sugestię, że dana cecha ma zostać zaimplementowana jako tablica 7-elementowa. Analogicznie przy oznaczeniu duck: Duck[3..*] {ordered} mamy sugestię, że dana cecha powinna zostać zaimplementowana jako lista (lub np. ArrayList) o minimum 3 elementach. 17/31

Dziedziczenie i klasy abstrakcyjne Dziedziczenie jest oznaczone za pomocą strzałki zakończonej białym grotem. Konwencja: jeśli klasa B dziedziczy po klasie A, to B powinna znajdować się poniżej klasy A na diagramie (jeśli to możliwe) Klasa abstrakcyjna jest oznaczona przez wyróżnienie nazwy kursywą. Abstrakcyjny atrybut i abstrakcyjna operacja również są oznaczone przez wyróżnienie nazwy kursywą Np. Animal jest klasą abstrakcyjną. makesound() w klasie Animal jest operacją abstrakcyjną. makesound() w klasie Chicken jest zaimplementowaną wersją operacji makesound() z klasy Animal. makesound() w klasie LoudChicken jest nadpisaną (ang. override) wersją operacji makesound() z klasy Chicken. Uwaga: w podklasie nie należy powtarzać nazwy pola, które zostało zdefiniowane w nadklasie. Analogicznie, w podklasie nie należy powtarzać nazwy operacji, która została zdefiniowana w nadklasie, o ile podklasa nie nadpisuje tej operacji. 18/31

Interfejsy (ang. interfaces) Interfejs oznacza się przez użycie słowa kluczowego <<interface>> Implementację/rozszerzenie interfejsu oznacza się za pomocą strzałki rysowanej przerywaną linią. Strzałka ta ma biały grot. W klasie implementującej interfejs znajdują się nazwy operacji z interfejsu, ponieważ klasa ta implementuje (czyli jakby nadpisuje) te operacje. Np. klasa Chicken implementuje interfejs WeightComparable. Klasa WeightSorter wykorzystuje interfejs WeightComparable. 19/31

Interfejsy notacja gniazd Do opisu interfejsów implementowanych przez klasę można użyć też notacji gniazd (zwaną też notacją z lizakami ). Notacja ta ukrywa szczegółową budowę interfejsu, za to podkreśla informację na temat udostępnianych i wymaganych przez klasę interfejsów. Np. odpowiednik diagramu z poprzedniego slajdu klasa Chicken implementuje (udostępnia) interfejs WeightComparable a klasa WeightSorter wykorzystuje interfejs (wymaga interfejsu) WeightComparable Co można również przedstawić tak: 20/31

Mechanizmy rozszerzające UML Elementy zdefiniowane w UML nie zawsze wystarczają do przedstawienia wszystkich ważnych niuansów rozważanego systemu. Dlatego wprowadzono mechanizmy kontrolowanego rozszerzania języka przez użytkownika, a wśród nich: stereotypy (ang. stereotypes) czasami stosuje się też nazwę słowa kluczowe (ang. keywords), ograniczenia (ang. constraints). 21/31

Stereotypy (ang. stereotypes) Stereotyp służy do stworzenia nowego rodzaju obiektu ma podstawie obiektu zdefiniowanego już w standardzie UML. Najprostszym sposobem dodania nowego stereotypu jest dodanie nazwy stereotypu <<nazwa stereotypu>> przy nazwie obiektu. W standardzie UML jest zdefiniowanych kilkadziesiąt stereotypów np. <<interface>>. Np. gdy chcemy wśród klas wyróżnić wyjątki (bo mają one zupełnie inne zastosowanie niż reszta klas), można to zrobić dodając nowy stereotyp <<exception>>: Uwaga: wprowadzanie własnych oznaczeń do diagramów zmniejsza natychmiastową ich czytelność. Dlatego z możliwości tworzenia nowych stereotypów należy korzystać tylko wtedy, gdy rzeczywiście jest taka potrzeba. 22/31

Stereotypy przykład z event Za pomocą zdefiniowanych przez użytkownika stereotypów można też reprezentować elementy, które nie są zdefiniowane w standardzie UML. Takim elementem jest np. zdarzenie (ang. event) występujące w C#. Zdarzenia możemy reprezentować np. wprowadzając stereotypy <<event>>, <<handle>> i używając ich w sposób następujący: Zdarzenie można reprezentować też w sposób bardziej rozbudowany np. wprowadzając stereotypy <<event>>, <<handle>>, <<delegate>>: 23/31

Ograniczenia (ang. constraints) Tworzenie asocjacji, ustalanie hierarchii dziedziczenia, ustalanie krotności itd. może być interpretowane jako dodawanie ograniczeń w konstrukcji programu. Jednak nie wszystkie ograniczenia można wyrazić za pomocą symboli UML, dlatego ograniczenia można przedstawiać również w sposób opisowy, przedstawiony poniżej. Ograniczenia można umieszczać: w uwadze jako in-line 24/31

Ograniczenia (ang. constraints) cd. Ogólna postać ograniczenia: elementy: {name: description} np. {disallow multilocation: person must not be in more than one place at once} name (opcjonalne) nazwa ograniczenia description opis ograniczenia w języku naturalnym (opcja zalecana) lub w języku programowania lub w UML-owym języku OCL UML zawiera pewne zdefiniowane ograniczenia np. dla cech: readonly, nonunique, ordered W języku programowania ograniczeniom odpowiadałyby asercje (w języku C#: metoda Debug.assert, w języku Java i C++: assert) lub warunki, których niespełnienie skutkowałoby wyrzuceniem wyjątku 25/31

Ograniczenia klasy abstrakcyjne Ograniczeń można też użyć do oznaczenia klas, operacji i atrybutów abstrakcyjnych: Dodajemy tutaj ograniczenie {abstract}, które jest skróconą wersją {abstract=true}. Ta konwencja jest jednak o wiele mniej popularna niż używanie kursywy do oznaczania nazw elementów abstrakcyjnych. 26/31

Wzorce (ang. templates) Wzorzec (szablon/klasa generyczna/template) jest przedstawiany poprzez umieszczenie parametrów wzorca w prostokącie w prawym górnym rogu klasy. Prostokąt jest rysowany przerywaną linią. konkretyzacja (wiązanie wzorca) może być przedstawiana na 2 sposoby: jawny i niejawny Np. ChickenList jest jawną konkretyzacją wzorca List, gdzie Chicken jest parametrem wzorca. Klasa znajdująca się po prawej stronie jest konkretyzacją niejawną. 27/31

Inne Typy wyliczeniowe (ang. enumerations): «enumeration» Color red white blue Asocjacje kwalifikowane (ang. qualified associations) odpowiednik struktur słownikowych, hashmap. W tych strukturach określonemu kluczowi przypisujemy pewną wartość/pewne wartości. Krotność podana na diagramie odnosi się do liczby wartości związanych z danym kluczem. Np. po podaniu imienia krowy (klucz), asystent zwraca krowę (wartość), która jest do przypisana do imienia (ew. zwraca pustą referencję, jeśli krowa o takim imieniu nie istnieje). Dane imię może być przypisane co najwyżej jednej krowie. 28/31

Diagramy pakietów (ang. package diagrams) Diagramy pakietów reprezentują pakiety/przestrzenie nazw (ang. namespaces) i zależności między nimi Np. pakiet farm summaries zależy od pakietów livestock i facilities. Pakiet livestock zawiera co najmniej 3 klasy: Animal, Chicken, Cow. 29/31

Uwagi końcowe UML jest obszernym standardem i większość ludzi używa tylko małego podzbioru UML Diagram przede wszystkim powinien być czytelny i powinien przekazywać główny zamysł projektowy autora. Wynikają z tego następujące zalecenia. Przy tworzeniu diagramów nie należy starać się używać wszystkich możliwych oznaczeń i pokazywać wszystkich możliwych zależności. Nie należy się starać na jednym diagramie zawrzeć wszystkich klas i zależności występujących w programie najlepiej przedstawiać budowę programu od ogółu do szczegółu, czyli np. stworzyć jeden diagram ogólny programu o małej szczegółowości a potem kolejne diagramy, bardziej szczegółowo opisujące poszczególne elementy programu. Na diagramie powinno być b. mało obiektów, które nie są połączone z innymi (np. strzałką) diagram powinien przedstawiać spójną strukturę całego programu. 30/31

Polecane programy i literatura Polecane programy do tworzenia diagramów UML: UMLet (posłużył do stworzenia diagramów umieszczonych na tych slajdach) BOUML Dia MS Visio programy do tworzenia grafiki wektorowej (np. Inkscape) Literatura: [Dpl] Fowler, UML w kropelce, wersja 2.0, 2005 (opis UML 2.0) [D] Fowler, UML distilled, 3 rd ed., 2003 (opis UML 2.0) [N] Pilone, Pitman, UML 2.0 in a Nutshell, 2005 (opis UML 2.0) [G] Booch, Rumbaugh, Jacobson, The Unified Modeling Language user guide 2 nd ed, 2005 (opis UML 2.0) [Gpl] Booch, Rumbaugh, Jacobson, UML przewodnik użytkownika, 2001 (opis UML 1.0) [R] Rumbaugh, Jacobson, Booch, The Unified Modeling Language reference manual, 1999 (opis UML 1.0) 31/31