Diagramy klas UML: Zalecenia
W Visual Studio Ultimate można użyć diagramu klas UML do opisu typów danych oraz ich relacji, niezależnie od ich implementacji.Diagram pozwala skupić się na logicznych aspektach klas, a nie na ich implementacji.
Aby utworzyć diagram klas UML, w menu Architektura wybierz polecenie Nowy Diagram.
[!UWAGA]
Ten temat dotyczy diagramów klas UML.Istnieje inny rodzaj diagramów klas, które można tworzyć i używać w celu wizualizacji kodu programu.Zobacz projektowanie i przeglądanie klas i typów.
W tym temacie
Używanie diagramów klas UML
Podstawowe kroki rysowania diagramów klas
Używanie klas, interfejsów oraz wyliczeń
Atrybuty i operacje
Rysowanie i używanie asocjacji
Dziedziczenie
Typy szablonów
Definiowanie przestrzeni nazw oraz pakietów
Generowanie kodu z diagramów klas UML
Używanie diagramów klas UML
Można używać diagramu klas UML do różnych celów:
Aby dostarczyć niezależny od implementacji opis typów, które są używane w systemie i przekazywane pomiędzy jego składnikami.
Na przykład typ Zamówienie posiłku może być zaimplementowany w kodzie .NET w warstwie biznesowej, w języku XML w interfejsie między składnikami, w języku SQL w bazie danych i w języku HTML w interfejsie użytkownika.Chociaż szczegóły tych implementacji różnią się, relacje między typem Zamówieniem posiłku a innymi typami, takimi jak Menu lub Zapłata, są zawsze takie same.Diagram klas UML umożliwia omówienia tych relacji niezależnie od implementacji.
Aby objaśnić terminy używane do komunikacji między aplikacją i jej użytkownikami oraz w opisie potrzeb użytkownika.Zobacz Modelowanie — Wymagania dla użytkownika.
Na przykład można wziąć pod uwagę historie użytkownika, przypadki użycia lub inne opisy wymagań dla aplikacji restauracji.W takim opisie można znaleźć terminy, takie jak Menu, Zamówienie, Posiłek, Cena, Zapłata, i tak dalej.Można narysować diagram klas UML, który zdefiniuje relacje pomiędzy tymi terminami.Zmniejszy to ryzyko wystąpienia niespójności w opisach wymagań oraz w interfejsie użytkownika i dokumentach pomocy.
Związek z innymi diagramami
Diagram klas UML jest zazwyczaj rysowany wraz z innymi diagramami modelującymi, aby dostarczyć opisy typów, których używają.W każdym przypadku fizyczna reprezentacja typów nie jest implikowana przez żaden z diagramów.
Jeśli użytkownik narysuje: |
Diagramu klas UML można użyć do opisywania: |
---|---|
Diagramu aktywności |
Typu danych przekazywanych przez Węzeł obiektu. Typów styków wejściowych i wyjściowych oraz węzłów parametrów aktywności. |
Diagramów sekwencji |
Typów parametrów i wartości zwracanych wiadomości. Typów linii życia.Klasa linii życia powinna zawierać operacje dla wszystkich wiadomości, które może otrzymać. |
Diagramów składników |
Składników komponentów, poprzez wypisanie ich operacji. |
Diagramów przypadków użycia |
Typów, wspomnianych w opisach celów oraz kroków w przypadku użycia. |
Podstawowe kroki rysowania diagramów klas
Aby uzyskać informacje referencyjne na temat elementów na diagramach klas UML, zobacz Diagramy klas UML: Odwołanie.
[!UWAGA]
Szczegółowe kroki tworzenia dowolnego diagramu modelowania zawiera Edytowanie modeli i diagramów UML.
Aby utworzyć diagram klas UML
W menu Architektura wybierz Nowy Diagram.
W sekcji Szablony wybierz Diagram klasy UML.
Nadaj nazwę diagramowi.
W sekcji Dodaj do projektu modelowania wybierz istniejący projekt modelowania w rozwiązaniu lub Utwórz nowy projekt modelowania, a następnie wybierz OK.
W przyborniku Diagram klasUML pojawi się nowy diagram klas.Przybornik zawiera wymagane elementy i relacje.
Aby narysować diagram klas UML
Aby utworzyć typ, wybierz z przybornika narzędzie Klasa, Interfejs lub Wyliczenie, a następnie kliknij pustą część diagramu.(Jeśli przybornik jest niewidoczny, naciśnij klawisze CTRL+ALT+X.)
Można również utworzyć typy, oparte na typach w kodzie.Można przeciągnąć na diagram typy z Eksploratora rozwiązań, Eksploratora architektury lub grafów zależności.Zobacz Tworzenie diagramów klasy UML na podstawie kodu.
Aby dodać atrybuty lub operacje do typów lub literały do wyliczenia, wybierz nagłówek Atrybuty, Operacje lub Literały w typie, a następnie naciśnij klawisz ENTER.
Można napisać podpis, taki jak f(x:Boolean):Integer.Zobacz Atrybuty i operacje.
Aby szybko dodać kilka elementów, naciśnij klawisz ENTER dwa razy na końcu każdego elementu.Można użyć klawiszy strzałek, aby przemieszczać się w górę i w dół listy.
Aby rozwinąć lub zwinąć typ, wybierz ikonę pagonu w jego lewym górnym rogu.Można również rozwijać i zwijać sekcje Atrybuty i Operacje w klasie lub interfejsie.
Aby narysować asocjacje, dziedziczenie lub łącza zależności między typami, kliknij odpowiednie narzędzie, następnie typ źródłowy a następnie na typ docelowy.
Aby utworzyć typy w pakiecie, utwórz pakiet przy użyciu narzędzia Pakiet, a następnie utwórz nowe typy i pakiety w tym pakiecie.Można również użyć polecenia kopiuj do skopiowania typów i wklejenia ich do pakietu.
Każdy diagram jest widokiem modelu, który jest współdzielony przez inne diagramy w tym samym projekcie.Aby wyświetlić widok drzewa pełnego modelu, wybierz polecenie Widok, Inne okna, Eksplorator modelu UML.
Używanie klas, interfejsów oraz wyliczeń
W przyborniku dostępne są trzy standardowe rodzaje klasyfikatorów.W tym dokumencie są one określane jako typy.
Użyj typu Klasa (1) do reprezentowania typów danych lub obiektów w większości zastosowań.
Użyj typu Interfejsy (2) w kontekście, w którym trzeba odróżnić czyste interfejsy od konkretnych klas, które mają wewnętrzne implementacje.Różnica ta jest przydatna, gdy diagram służy do opisywania implementacji oprogramowania.Mniej przydatna jest, kiedy modelowane są dane pasywne lub kiedy definiuje się koncepcje używane do opisu wymagań użytkownika.
Użyj typu Wyliczenie (3) do reprezentacji typu, który ma ograniczoną liczbę wartości literałowych, na przykład Stop i Go.
Dodaj wartości literałów do wyliczenia.Każdemu z nich nadaj odrębną nazwę.
W razie potrzeby możesz również podać wartość liczbową dla każdej wartości literału.Otwórz menu skrótów dla literału w wyliczeniu, wybierz polecenie Właściwości, a następnie wpisz liczbę w polu Wartość w oknie Właściwości.
Każdemu typowi nadaj unikatową nazwę.
Pobieranie typów z innych diagramów
Można spowodować pojawienie się typów z innego diagramu w diagramie klas UML.
Inny typ diagramu |
Jak uzyskać typy z innego diagramu |
---|---|
Diagram klas UML |
Można wymusić pojawienie się klasy na więcej niż jednym diagramie klas UML.Po utworzeniu klasy na jednym diagramie, przeciągnij ją z Eksploratora modelu UML na inny diagram. Jest to przydatne, jeśli każdy diagram ma się koncentrować na konkretnej grupie relacji. Na przykład, na jednym diagramie można pokazać asocjację pomiędzy Zamówieniem posiłku i Menu restauracji, a na innym asocjację pomiędzy Zamówieniem posiłku a Zapłatą. |
Diagramów składników |
Jeżeli zdefiniowano interfejsy na składnikach w diagramie składników, możesz przeciągnąć interfejs z Eksploratora modelu UML na diagram klas.Na diagramie klasy można zdefiniować metody, które zawiera interfejs. |
Diagram sekwencji UML |
Można utworzyć klasy i interfejsy z linii życia w diagramie sekwencji, a następnie przeciągnąć klasę z Eksploratora modelu UML do diagramu klas UML.Każda linia życia w diagramie sekwencji reprezentuje wystąpienie obiektu, składnika lub aktora. Aby utworzyć klasę z linii życia, otwórz menu skrótów dla linii życia, a następnie wybierz Utwórz klasę lub Utwórz interfejs.Zobacz Diagramy sekwencyjne UML: Zalecenia. |
Kod programu |
Można reprezentować w modelu typy z kodu programu.Przeciągaj klasy, interfejsy lub wyliczenia z Eksploratora architektury lub grafów zależności na diagram klas UML. Typy, które zostaną przeciągnięte, pojawią się na diagramie.Typy zależne również zostaną dodane do modelu.Po utworzeniu typu UML w ten sposób, możesz kliknąć go dwukrotnie, aby otworzyć kod źródłowy.Zobacz Tworzenie diagramów klasy UML na podstawie kodu.
|
Atrybuty i operacje
Atrybut (4) jest nazwaną wartością, którą może mieć każde wystąpienie typu.Dostęp do atrybutu nie zmienia stanu wystąpienia.
Operacja (5) jest metodą albo funkcją, którą wystąpienia danego typu mogą wykonywać.Może zwracać wartość.Jeśli jej właściwość isQuery ma wartość true, to nie może zmienić stanu wystąpienia.
Aby dodać atrybut lub operację do typu, otwórz menu skrótów typu, wybierz polecenie Dodaj, a następnie wybierz polecenie Atrybut lub Operacja.
Aby wyświetlić jego właściwości, otwórz menu skrótów atrybutu lub operacji, a następnie wybierz Właściwości.Właściwości są wyświetlane w oknie Właściwości.
Aby wyświetlić właściwości parametrów operacji, wybierz **[...]**we właściwości Parametry.Zostanie wyświetlone nowe okno dialogowe właściwości.
Aby uzyskać szczegółowe informacje dotyczące wszystkich właściwości, które można ustawiać, zobacz:
Typy atrybutów i operacji
Każdy Typ atrybutu lub operacji i każdy typ parametru może być jednym z następujących:
(brak) — Można zostawić typ nieokreślony w podpisie, pomijając poprzedzający dwukropek (:).
Jednym ze standardowych typów pierwotnych: Boolean, Integer, String.
Typem zdefiniowanym w modelu.
Wartość sparametryzowana typu szablonu, zapisane szablonu < parametr >.Zobacz Typy szablonów.
Możesz także wpisać nazwę typu, który nie został jeszcze zdefiniowany w modelu.Nazwa będzie wyświetlana w obszarze Nieokreślone typy w Eksploratorze modelu UML.
[!UWAGA]
Jeśli klasa lub interfejs o tej nazwie zostaną następnie zdefiniowane w modelu, starsze atrybuty i operacje będą nadal odwoływały się do elementu o typie Nieokreślonym.Jeśli chcesz, ab odwoływały się do nowej klasy, dla każdego atrybutu lub operacji musisz zresetować typ, wybierając nową klasę z menu rozwijalnego.
Typy wielokrotne
Można ustawić liczebność dowolnego atrybutu, operacji lub typu parametru.
Dozwolone są następujące wartości:
Liczebność |
Atrybut, parametr lub wartość zwracana zawiera: |
---|---|
[1] |
Jedną z wartości danego typu.Domyślnie włączone. |
[0..1] |
Null lub wartość danego typu. |
[*] |
Kolekcję dowolnej liczby wystąpień danego typu. |
[1..*] |
Kolekcję przynajmniej jednego wystąpienia danego typu. |
[n..m] |
Kolekcję między n a m wystąpień danego typu. |
Jeśli liczebność jest większa niż 1, można też ustawić następujące właściwości:
IsOrdered — Jeśli ma wartość true, kolekcja ma zdefiniowaną kolejność.
IsUnique — Jeśli ma wartość true, w kolekcji nie ma zduplikowanych wartości.
Widoczność
Widoczność wskazuje, czy można uzyskać dostęp do atrybutu lub operacji poza definicją klasy.Dozwolone są następujące wartości:
Nazwa |
Krótka forma |
Znaczenie |
---|---|---|
Public |
+ |
Dostępny dla wszystkich typów. |
Private |
- |
Dostępny tylko dla wewnętrznej definicji tego typu. |
Package |
~ |
Dostępny tylko w ramach pakietu zawierającego ten typ oraz w dowolnych innych pakietach, które jawnie go importują.Zobacz Definiowanie przestrzeni nazw oraz pakietów. |
Protected |
# |
Dostępny tylko dla danego typu i typów, które po nim dziedziczą.Zobacz Dziedziczenie. |
Ustawianie podpisu atrybutu lub operacji
Podpis atrybutu lub operacji jest kolekcją właściwości, zawierającą widoczność, nazwę, parametry (dla operacji) oraz typ.
Podpis można zapisać bezpośrednio na diagramie.Kliknij atrybut lub operację, aby ją zaznaczyć, a następnie kliknij ją ponownie.
Wpisz podpis w formie:
visibility attribute-name : Type
—lub—
visibility operation-name (parameter1 : Type1, ...) : Type
Na przykład:
+ AddItem (item : MenuItem, quantity : Integer) : Boolean
Można użyć krótkiej formy widoczności.Wartością domyślną jest + (publiczny).
Każdy typ może być typem zdefiniowanym w modelu, typem standardowym, takim jak Integer albo String, lub nazwą nowego typu, który nie został jeszcze zdefiniowany.
[!UWAGA]
Jeśli na liście parametrów zostanie wpisana nazwa bez typu, wskazuje ona nazwę parametru, a nie jego typ.W tym przykładzie MenuItem oraz Integer stają się nazwami dwóch parametrów o nieokreślonych typach:
AddItem(MenuItem, Integer) /* parameter names, not types! */
Aby ustawić liczebności typu w podpisie, wpisz liczebność w nawiasach kwadratowych po nazwie typu, na przykład:
+ AddItems (items : MenuItem [1..*])
+ MenuContent : MenuItem [*]
Jeżeli atrybut lub operacja są statyczne, ich nazwy będą wyświetlane w podpisie z podkreśleniem.Jeśli są abstrakcyjne, nazwa będzie napisana kursywą.
Jednak właściwości Jest statyczny i Jest abstrakcyjny mogą być ustawione tylko w oknie Właściwości.
Pełny podpis
Podczas edycji podpisu atrybutu lub operacji niektóre dodatkowe właściwości mogą być wyświetlane na końcu wiersza, po każdym z parametrów.Pojawiają się one w nawiasach {...}.Można edytować lub dodawać te właściwości.Na przykład:
+ AddItems (items: MenuItem [1..*] {unique, ordered})
+ GetItems (filter: String) : MenuItem [*] {ordered, query}
Właściwości są następujące:
W podpisie |
Właściwość |
Znaczenie |
---|---|---|
unique |
Jest unikatowy |
Nie istnieją zduplikowane wartości w kolekcji.Dotyczy typów, których liczebność jest większa niż 1. |
ordered |
Jest uporządkowany |
Kolekcja jest sekwencją.Jeśli ma wartość false, nie jest określony pierwszy element.Dotyczy typów, których liczebność jest większa niż 1. |
query |
Jest zapytaniem |
Operacja nie zmienia stanu jego wystąpienia.Dotyczy tylko operacji. |
/ |
Jest pochodny |
Atrybut jest obliczany na podstawie wartości innych atrybutów lub asocjacji. Przed nazwą atrybutu jest wyświetlane "/".Na przykład:
|
Zwykle pełny podpis pojawia się na diagramie tylko podczas jego edytowania.Po zakończeniu edycji dodatkowe właściwości są ukryte.Jeśli pełny podpis ma być widoczny przez cały czas, należy otworzyć menu skrótów dla danego typu, a następnie wybrać Pokaż pełny podpis.
Rysowanie i używanie asocjacji
Można użyć asocjacji do reprezentacji dowolnego rodzaju powiązania pomiędzy dwoma elementami, niezależnie od tego, jak połączenie jest zaimplementowane w oprogramowaniu.Na przykład można użyć asocjacji do reprezentacji wskaźnika w języku C#, relacji w bazie danych lub odwołania z jednej części pliku XML do innej.Może ona reprezentować asocjacje pomiędzy obiektami w świecie rzeczywistym, takimi jak ziemia i słońce.Asocjacja nie określa, w jaki sposób połączenie jest reprezentowane, określa jedynie, że taka informacja istnieje.
Właściwości asocjacji
Po utworzeniu asocjacji należy ustawić jej właściwości.Otwórz menu skrótów dla asocjacji, a następnie wybierz Właściwości.
Oprócz właściwości asocjacji jako całości każda rola, to znaczy każdy koniec asocjacji, ma wybrane własne właściwości.Aby je wyświetlić, należy rozwinąć właściwości Pierwsza rola i Druga rola.
Niektóre właściwości poszczególnych ról są bezpośrednio widoczne na diagramie.Są one następujące:
Nazwa roli.Pojawia się na odpowiednim końcu asocjacji na diagramie.Można ją ustawić na diagramie lub w oknie Właściwości.
Liczebność, domyślnie ustawiona na 1.Również pojawia się na diagramie, w pobliżu odpowiedniego końca asocjacji.
Agregacja.Pojawia się jako kształt rombu na jednym końcu łącznika.Można jej używać do wskazania, że wystąpienia w roli agregacji posiadają lub zawierają wystąpienia innych.
Jest nawigowalna.Jeśli ma wartość true dla tylko jednej roli, pojawia się strzałka w kierunku, dla którego nawigacja jest możliwa.Służy to do wskazania możliwości nawigacji dla łączy i relacji bazodanowych w oprogramowaniu.
Aby uzyskać szczegółowe informacje o tych i innych właściwości, zobacz Właściwości skojarzeń w diagramach przypadków UML.
Możliwość nawigacji
Podczas rysowania asocjacji, ma ona strzałkę na jednym końcu, oznaczającą, że nawigacja jest możliwa w tym kierunku.Jest to przydatne, jeśli diagram klas reprezentuje klasy w oprogramowaniu, a asocjacje reprezentują wskaźniki lub odwołania.Ale kiedy diagram klas służy do reprezentacji obiektów i relacji lub koncepcji biznesowych, reprezentacja możliwości nawigacji jest mniej znacząca.W takim przypadku można preferować rysowanie asocjacji bez strzałek.Można to zrobić przez ustawienie właściwości Jest nawigowalna na obu końcach asocjacji na wartość True.Aby ułatwić, można pobrać przykładowy kod modelowania domeny UML.
Atrybuty i asocjacje
Asocjacja jest obrazowym sposobem przedstawiania atrybutu.Na przykład, zamiast tworzenia klasy Restauracja z atrybutem typu Menu można narysować asocjację z Restauracji do Menu.
Każda nazwa atrybutu staje się nazwą roli.Pojawia się na przeciwległym końcu asocjacji względem typu, będącego właścicielem.Zobacz na przykład myMenu na ilustracji.
Ogólnie rzecz biorąc, lepiej jest używać atrybutów tylko dla typów, które nie będą rysowane na diagramie, takich jak typy pierwotne.
Dziedziczenie
Można użyć narzędzia Dziedziczenie, aby utworzyć jedną z następujących relacji.
Relację generalizacja między typem wyspecjalizowanym a typem ogólnym
—lub—
Relację realizacja między klasą a interfejsem, który implementuje.
Nie można tworzyć pętli w relacjach dziedziczenia.
Generalizacja
Generalizacja oznacza, że typ wyspecjalizowany lub pochodny dziedziczy atrybuty, operacje i asocjacje typu ogólnego lub podstawowego.
Typ ogólny znajduje się na końcu relacji oznaczonym strzałką.
Operacje i atrybuty dziedziczone zazwyczaj nie są wyświetlane w typach wyspecjalizowanych.Można dodać odziedziczone operacje do listy operacji typu wyspecjalizowanego.Jest to przydatne, gdy chcesz zastąpić niektóre właściwości operacji w typie wyspecjalizowanym, lub jeśli chcesz wskazać, że powinno to zostać zrobione w kodzie implementującym.
Aby zastąpić definicję operacji w typie wyspecjalizowanym
Kliknij relację generalizacji.
Pojawi się wyróżniona, a tag Akcja zostanie wyświetlony w pobliżu.
Kliknij tag Akcja, a następnie kliknij Zastąp operacje.
Pojawi się okno dialogowe Zastąp operacje.
Wybierz operacje, które mają być wyświetlane w typie wyspecjalizowanym, a następnie kliknij OK.
Operacje, które wybrano, pojawią się w typie wyspecjalizowanym.
Realizacja
Realizacja oznacza, że klasa implementuje atrybuty i operacje, określone przez interfejs.Interfejs znajduje się na końcu łącznika ze strzałką.
Po utworzeniu łącznika realizacji operacje interfejsu są automatycznie replikowane w klasie, która go realizuje.Jeśli nowe operacje zostaną dodane do interfejsu, zostaną zreplikowane w realizujących go klasach.
Po utworzeniu relacji realizacji można przekonwertować ją do notacji typu lizak.Kliknij prawym przyciskiem myszy relację i wybierz polecenie Pokaż jako lizak.
Pozwala to na pokazanie interfejsów, które implementuje klasa, bez zaśmiecania diagramu klas łączami realizacji.Można również pokazać interfejs i realizujące go klasy na oddzielnym diagramie.
Typy szablonów
Można zdefiniować typ generyczny lub szablonu, który może być sparametryzowany poprzez inne typy lub wartości.
Na przykład można utworzyć generyczny Słownik sparametryzowany przez typy klucza i wartości:
Aby utworzyć typ szablonu
Utwórz klasę lub interfejs.Będzie to typ szablonu.Nadaj mu odpowiednią nazwę, na przykład Dictionary.
Otwórz menu skrótów dla nowego typu, a następnie wybierz Właściwości.
W oknie Właściwości kliknij przycisk [...] w polu Parametry szablonu.
Pojawi się okno dialogowe Edytor kolekcji parametrów szablonu.
Wybierz Dodaj.
Ustaw właściwość nazwa na nazwę parametru swojego typu szablonu, na przykład Key.
Ustaw Rodzaj parametru.Wartością domyślną jest Klasa.
Jeśli parametr ma akceptować tylko klasy pochodne konkretnej klasy bazowej, ustaw Wartość ograniczona na wybraną klasę podstawową.
Dodaj tyle parametrów, ile potrzebujesz, a następnie wybierz OK.
Dodaj atrybuty i operacje do typu szablonu, tak jak w przypadku innych klas.
W definicji atrybutów oraz operacji można używać parametrów, których rodzaje to Klasa, Interfejs lub Wyliczenie.Na przykład, przy użyciu klas parametrów Key i Value można zdefiniować następującą operację w Dictionary:
Get(k : Key) : Value
Można użyć parametru, którego rodzaj jest Liczbą całkowitą, jako granicę liczebności.Na przykład, całkowitoliczbowy parametr max może być użyty do definiowania liczebności atrybutu jako [0..max].
Po utworzeniu typów szablonu, można ich używać do definiowania powiązań szablonów:
Aby użyć typu szablonu
Utwórz nowy typ, na przykład AddressTable.
Otwórz menu skrótów dla nowego typu, a następnie wybierz Właściwości.
We właściwości Powiązanie szablonów wybierz z listy rozwijalnej typ szablonu, na przykład Dictionary.
Rozwiń właściwość Powiązanie szablonów.
Dla każdego parametru typu szablonu pojawi się wiersz.
Ustaw każdy parametr na odpowiednią wartość.Na przykład, ustaw parametr Key na klasę o nazwie Name.
Pakiety
Pakiety można przeglądać na diagramie klas UML.Pakiet jest kontenerem dla innych elementów modelu.Można utworzyć dowolny element wewnątrz pakietu.Na diagramie elementy wewnątrz pakietu będą się poruszały podczas przesuwania pakietu.
Można użyć formantu zwiń/rozwiń, aby ukryć lub pokazać zawartość pakietu.
Zobacz Definiowanie pakietów i przestrzeni nazw.
Generowanie kodu z diagramów klas UML
Aby rozpocząć implementację klas na diagramie klas UML, można wygenerować kod w języku C# lub dostosować szablony do generacji kodu.Aby rozpocząć generację kodu przy użyciu dostarczonych szablonów w języku C#:
Otwórz menu skrótów diagramu lub elementu, wybierz opcję Generuj kod, a następnie ustaw niezbędne właściwości.
Aby uzyskać więcej informacji dotyczących ustawiania tych właściwości i dostosowania dostarczonych szablonów, zobacz Generowanie kodu na podstawie diagramów klas UML.
Zobacz też
Informacje
Diagramy sekwencji UML: Odwołanie
Koncepcje
Edytowanie modeli i diagramów UML
Modelowanie — Wymagania dla użytkownika
Diagramy składników UML: Odwołanie