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.
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.
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).
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:
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:
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:
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:
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:
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>>.
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) |
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:
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
Kopiuj
Osadź
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Relacja dwukierunkowa
Relacja dwukierunkowa może logicznie reprezentować asocjację N:M:
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ń.
Kopiuj
Osadź
classDiagram
bar ()-- foo
Kopiuj
Osadź
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Definiowanie przestrzeni nazw
Przestrzenie nazw grupują klasy.
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
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:
Kopiuj
Osadź
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- W zagnieżdżonej strukturze definicji klasy:
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.
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:
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
Kopiuj
Osadź
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Łącze URL:
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.
Kopiuj
Osadź
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck