Proces Typ
Wyrażenie graficzne
Myślenie Typ
Wyrażenie strukturalne
Notatki Typ
Efektywne wyrażanie

Diagram klasSkładnia

Diagram klas

Diagram klas jest głównym elementem modelowania obiektowego. Służy do ogólnego modelowania koncepcyjnego struktury aplikacji, a także do szczegółowego modelowania przekształcającego model w kod programistyczny. Diagram klas można również stosować do modelowania danych. Klasy na diagramie klas reprezentują zarówno główne elementy i interakcje w aplikacji, jak i klasy wymagające programowania.

Kod
                            
Kopiuj
Osadź
--- title: Animal example --- classDiagram note "From Duck till Zebra" Animal <|-- Duck note for Duck "can fly can swim can dive can help in debugging" Animal <|-- Fish Animal <|-- Zebra Animal : +int age Animal : +String gender Animal: +isMammal() Animal: +mate() class Duck{ +String beakColor +swim() +quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ +bool is_wild +run() }

Składnia

Klasa

UML zapewnia mechanizmy reprezentowania składowych klasy, takich jak właściwości i metody, oraz powiązanych informacji. Pojedyncza instancja klasy składa się z trzech części:

  • Górna część zawiera nazwę klasy. Jest drukowana pogrubioną czcionką i wyśrodkowana, z pierwszą literą wielką. Może również zawierać opcjonalny tekst adnotacji opisujący charakter klasy.
  • Środkowa część zawiera właściwości klasy. Są wyrównane do lewej, a pierwsza litera jest mała.
  • Dolna część zawiera operacje, które klasa może wykonywać. Są również wyrównane do lewej, a pierwsza litera jest mała.
Kod
                            
Kopiuj
Osadź
--- title: Bank example --- classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

Definiowanie klasy

Istnieją dwa sposoby definiowania klasy

  • Jawne użycie składni class (np. class Animal), co zdefiniuje klasę Animal.
  • Poprzez relację, która jednocześnie definiuje dwie klasy i relację między nimi (np. Vehicle <|-- Car).
Kod
                            
Kopiuj
Osadź
classDiagram class Animal Vehicle <|-- Car

Zasady nazewnictwa: nazwa klasy może składać się wyłącznie ze znaków alfanumerycznych (w tym unicode), podkreślenia (_) i myślnika (-).

Etykieta klasy

Jeśli chcesz nadać klasie etykietę, możesz użyć następującej składni:

Kod
                            
Kopiuj
Osadź
classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car

Możesz także użyć odwrotnych apostrofów (``), aby uciec znaki specjalne w etykiecie:

Kod
                            
Kopiuj
Osadź
classDiagram class `Animal Class!` class `Car Class` `Animal Class!` --> `Car Class`

Definiowanie składowych klasy

UML zapewnia mechanizmy reprezentowania składowych klasy (takich jak właściwości i metody) oraz powiązanych informacji o nich.

Mermaid rozróżnia właściwości od funkcji lub metod na podstawie obecności nawiasów (). Te z () są traktowane jako funkcje lub metody, a pozostałe jako właściwości.

Istnieją dwa sposoby definiowania składowych klasy; niezależnie od tego, której składni użyjesz do zdefiniowania składowej, wynik jest taki sam. Te dwa różne sposoby to:

1. Użycie dwukropka (:) po którym następuje nazwa składowej, aby powiązać składową klasy; jest to przydatne do definiowania jednej składowej naraz. Na przykład:

Kod
                            
Kopiuj
Osadź
classDiagram class BankAccount BankAccount : +String owner BankAccount : +BigDecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

2. Użycie nawiasów klamrowych {}, aby powiązać składowe klasy, przy czym składowe są grupowane w nawiasach klamrowych. Nadaje się do definiowania wielu składowych naraz. Na przykład:

Kod
                            
Kopiuj
Osadź
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) +withdrawal(amount) }

Typ zwracany

Możesz określić typ danych, który zostanie zwrócony, na końcu definicji metody lub funkcji. Uwaga: między ostatnim ')' a typem zwracanym musi znajdować się spacja. Przykład:

Kod
                            
Kopiuj
Osadź
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawal(amount) int }

Typy ogólne

Typy ogólne można przedstawić jako część definicji klasy, a także użyć w składowych klasy lub typie zwracanym. Aby przedstawić element jako typ ogólny, otocz ten typ znakiem tyldy (~). Obsługiwane są zagnieżdżone deklaracje typów, np. List<List<int>>, ale obecnie nie są obsługiwane typy ogólne zawierające przecinki, takie jak List<List<K, V>>.

Kod
                            
Kopiuj
Osadź
classDiagram class Square~Shape~{ int id List~int~ position setPoints(List~int~ points) getPoints() List~int~ } Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ Square : +getDistanceMatrix() List~List~int~~

Widoczność

Aby opisać widoczność właściwości lub metody/funkcji, możesz użyć opcjonalnego symbolu przed nazwą składowej:

  • + publiczna
  • - prywatna
  • # chroniona
  • ~ wewnętrzna

Definiowanie relacji

Relacja to ogólny termin obejmujący określone typy logicznych połączeń występujących na diagramach klas i diagramach obiektów.

                            
Kopiuj
Osadź
[classA][Arrow][ClassB]

UML为类定义了八种不同类型的关系:

Typ Opis
<|-- Dziedziczenie
*-- Kompozycja
o-- Agregacja
--> Asocjacja
-- Łącze (ciągłe)
..> Zależność
..|> Implementacja
.. Łącze (kreskowane)
Kod
                            
Kopiuj
Osadź
classDiagram classA <|-- classB classC *-- classD classE o-- classF classG <-- classH classI -- classJ classK <.. classL classM <|.. classN classO .. classP

Możemy użyć etykiety do opisania charakteru relacji między dwiema klasami. Ponadto strzałki można również użyć w odwrotnym kierunku:

Kod
                            
Kopiuj
Osadź
classDiagram classA --|> classB : Inheritance classC --* classD : Composition classE --o classF : Aggregation classG --> classH : Association classI -- classJ : Link(Solid) classK ..> classL : Dependency classM ..|> classN : Realization classO .. classP : Link(Dashed)

Etykieta relacji

Do relacji można dodać tekst etykiety:

                            
Kopiuj
Osadź
[classA][Arrow][ClassB]:LabelText
Kod
                            
Kopiuj
Osadź
classDiagram classA <|-- classB : implements classC *-- classD : composition classE o-- classF : aggregation

Relacja dwukierunkowa

Relacja dwukierunkowa może logicznie reprezentować asocjację N:M:

Kod
                            
Kopiuj
Osadź
classDiagram Animal <|--|> Zebra

语法如下:

                            
Kopiuj
Osadź
[Relation Type][Link][Relation Type]

其中 Relation Type 是以下之一:

Typ Opis
<| Dziedziczenie
* Kompozycja
o Agregacja
> Asocjacja
< Asocjacja
|> Implementacja

Link jest jednym z następujących:

Typ Opis
-- Linia ciągła
.. Linia kreskowana

Interfejs lizakowy

Klasie można także przypisać specjalny typ relacji, który definiuje dla klasy interfejs lizakowy. Interfejs lizakowy definiuje się za pomocą następującej składni:

  • bar ()-- foo
  • foo --() bar

Interfejs z lizakiem (bar) jest połączony z klasą (foo).

Uwaga: każdy zdefiniowany interfejs jest unikalny; celem jest brak współdzielenia między klasami i brak możliwości wskazania go przez wiele połączeń.

Kod
                            
Kopiuj
Osadź
classDiagram bar ()-- foo
Kod
                            
Kopiuj
Osadź
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

Definiowanie przestrzeni nazw

Przestrzenie nazw grupują klasy.

Kod
                            
Kopiuj
Osadź
classDiagram namespace BaseShapes { class Triangle class Rectangle { double width double height } }

Liczebność/mnogokość relacji

Mnogokość lub liczebność na diagramie klas określa liczbę wystąpień jednej klasy, które można powiązać z wystąpieniem innej klasy. Na przykład każda firma ma jednego lub więcej pracowników, nie może mieć zera, a każdy pracownik jest obecnie zatrudniony w zerze lub jednej firmie.

Symbole mnogokości umieszcza się w pobliżu końca asocjacji.

Różne opcje liczebności to:

  • 1 tylko 1
  • 0..1 0 lub 1
  • 1..* 1 lub więcej
  • * 0 lub 1 lub więcej
  • n n (gdzie n>1)
  • 0..n od 0 do n (gdzie n>1)
  • 1..n od 1 do n (gdzie n>1)

Liczebność można łatwo zdefiniować, umieszczając opcję tekstową w podwójnych cudzysłowach przed lub po danej strzałce. Na przykład:

                            
Kopiuj
Osadź
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Kod
                            
Kopiuj
Osadź
classDiagram Customer "1" --> "*" Ticket Student "1" --> "1..*" Course Galaxy --> "many" Star : Contains

Adnotacje klasy

Klasy można adnotować znacznikami, aby dostarczyć dodatkowe metadane o klasie. Może to wyraźniej wskazać charakter klasy. Niektóre typowe adnotacje obejmują:

  • <<Interface>> reprezentuje klasę interfejsu
  • <<Abstract>> reprezentuje klasę abstrakcyjną
  • <<Service>> reprezentuje klasę usługi
  • <<Enumeration>> reprezentuje wyliczenie

Adnotacja jest definiowana między początkowym << i końcowym >>. Istnieją trzy sposoby dodawania adnotacji do klasy; wynik wszystkich trzech metod jest taki sam:

  • Wbudowane w definicję klasy
                            
Kopiuj
Osadź
classDiagram class Shape <<interface>>

W osobnej linii po definicji klasy:

Kod
                            
Kopiuj
Osadź
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • W zagnieżdżonej strukturze definicji klasy:
Kod
                            
Kopiuj
Osadź
classDiagram class Shape{ <<interface>> noOfVertices draw() } class Color{ <<enumeration>> RED BLUE GREEN WHITE BLACK }

Komentarz

W diagramie klas można wprowadzać komentarze, które edytor zignoruje. Komentarz musi zajmować osobną linię i zaczynać się od podwójnego znaku procentu (%%). Wszystko do następnej linii będzie traktowane jako komentarz, w tym dowolna składnia diagramu klas.

Kod
                            
Kopiuj
Osadź
classDiagram %% This whole line is a comment classDiagram class Shape <<interface>> class Shape{ <<interface>> noOfVertices draw() }

Ustawianie kierunku diagramu

Możesz użyć instrukcji kierunku, aby ustawić kierunek renderowania diagramu klas:

Kod
                            
Kopiuj
Osadź
classDiagram direction RL class Student { -idCard : IdCard } class IdCard{ -id : int -name : string } class Bike{ -id : int -name : string } Student "1" --o "1" IdCard : carries Student "1" --o "1" Bike : rides

Interakcja

Do węzła można powiązać zdarzenie kliknięcia. Zdarzenie kliknięcia może wywołać funkcję zwrotną JavaScript lub otworzyć łącze, które zostanie załadowane w nowej karcie przeglądarki. Uwaga: ta funkcja jest wyłączona przy securityLevel='strict' i włączona przy securityLevel='loose'.

Możesz zdefiniować te operacje w osobnej linii po wszystkich deklaracjach klas.

                            
Kopiuj
Osadź
action className "reference" "tooltip" click className call callback() "tooltip" click className href "url" "tooltip"
  • action to link lub callback, w zależności od typu interakcji, którą chcesz wywołać.
  • className to identyfikator węzła powiązanego z operacją.
  • reference może być łączem URL lub nazwą funkcji zwrotnej.
  • (Opcjonalnie) Podpowiedź to ciąg znaków wyświetlany po najechaniu kursorem na element.
  • Funkcja zwrotna zostanie wywołana z nodeId jako parametrem.

Uwaga

Możesz dodać komentarz na diagramie za pomocą note "line1 line2". Możesz dodać komentarz do konkretnej klasy za pomocą note for <CLASS NAME> "line1 line2".

Przykład

Kod
                            
Kopiuj
Osadź
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

Łącze URL:

Kod
                            
Kopiuj
Osadź
classDiagram class Shape link Shape "https://www.github.com" "This is a tooltip for a link" class Shape2 click Shape2 href "https://www.github.com" "This is a tooltip for a link"

Konfiguracja

Ramka składowych

Możesz ukryć pustą ramkę składowych węzła klasy; odbywa się to poprzez zmianę wartości hideEmptyMembersBox w konfiguracji diagramu klas.

Kod
                            
Kopiuj
Osadź
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck