Диаграмма классов
Диаграмма классов является основным строительным блоком объектно-ориентированного моделирования. Она используется для общего концептуального моделирования структуры приложения, а также для детального моделирования с преобразованием модели в программный код. Диаграммы классов также можно использовать для моделирования данных. Классы на диаграмме классов обозначают как основные элементы и взаимодействия в приложении, так и классы, требующие программирования.
Копировать
Встраивание
---
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()
}
Синтаксис
Класс
UML предоставляет механизмы для представления членов класса, например свойств и методов, и дополнительной информации о них. Отдельный экземпляр класса содержит три части:
- Верхняя часть содержит имя класса. Оно печатается полужирным шрифтом по центру, с заглавной первой буквы. Она также может содержать необязательный текст аннотации, описывающий природу класса.
- Средняя часть содержит свойства класса. Они выровнены по левому краю, а первая буква — строчная.
- Нижняя часть содержит операции, которые может выполнять класс. Они также выровнены по левому краю, а первая буква — строчная.
Копировать
Встраивание
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Определение класса
Существует два способа определения класса
- Явно использовать синтаксис class (например, class Animal), что определит класс Animal.
- Через отношение, которое одновременно определяет два класса и отношение между ними (например, Vehicle <|-- Car).
Копировать
Встраивание
classDiagram
class Animal
Vehicle <|-- Car
Правила именования: имя класса может состоять только из буквенно-цифровых символов (включая unicode), знака подчёркивания (_) и дефиса (-).
Метка класса
Если вам нужно задать метку для класса, можно использовать следующий синтаксис:
Копировать
Встраивание
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Вы также можете использовать обратные кавычки (``) для экранирования специальных символов в метке:
Копировать
Встраивание
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Определение членов класса
UML предоставляет механизмы для представления членов класса (таких как свойства и методы), а также дополнительной информации о них.
Mermaid различает свойства и функции или методы по наличию круглых скобок (). Элементы с () считаются функциями или методами, все остальные считаются свойствами.
Существует два способа определения членов класса; независимо от того, какой синтаксис используется для определения членов, результат будет одинаковым. Два различных способа таковы:
1. Использовать двоеточие (:) с последующим именем члена для связывания члена класса; это удобно для определения одного члена за раз. Например:
Копировать
Встраивание
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Использовать фигурные скобки {} для связывания членов класса, при этом члены группируются внутри фигурных скобок. Подходит для определения нескольких членов сразу. Например:
Копировать
Встраивание
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Тип возвращаемого значения
Вы можете указать тип данных, который будет возвращён, в конце определения метода или функции. Примечание: между последней ')' и типом возвращаемого значения должен быть пробел. Пример:
Копировать
Встраивание
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Обобщённый тип
Обобщённые типы могут быть представлены как часть определения класса, а также использоваться для членов класса или типа возвращаемого значения. Чтобы представить элемент как обобщённый тип, заключите тип в тильды (~). Поддерживаются вложенные объявления типов, например List<List<int>> , но в настоящее время не поддерживаются обобщённые типы, содержащие запятую, такие как List<List<K, V>> .
Копировать
Встраивание
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~~
Видимость
Чтобы описать видимость свойства или метода/функции, можно использовать необязательный символ перед именем этого члена:
- + Открытый
- - Закрытый
- # Защищённый
- ~ Внутренний
Определение отношений
Отношение — это общий термин, охватывающий определённые типы логических связей, встречающихся на диаграммах классов и диаграммах объектов.
Копировать
Встраивание
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Тип | Описание |
|---|---|
| <|-- | Наследование |
| *-- | Композиция |
| o-- | Агрегация |
| --> | Ассоциация |
| -- | Связь (сплошная) |
| ..> | Зависимость |
| ..|> | Реализация |
| .. | Связь (пунктирная) |
Копировать
Встраивание
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Мы можем использовать метки для описания характера отношения между двумя классами. Кроме того, стрелки можно использовать и в обратном направлении:
Копировать
Встраивание
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)
Метка отношения
К отношению можно добавить текст метки:
Копировать
Встраивание
[classA][Arrow][ClassB]:LabelText
Копировать
Встраивание
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Двунаправленное отношение
Двунаправленное отношение логически может представлять связь N:M:
Копировать
Встраивание
classDiagram
Animal <|--|> Zebra
语法如下:
Копировать
Встраивание
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Тип | Описание |
|---|---|
| <| | Наследование |
| * | Композиция |
| o | Агрегация |
| > | Ассоциация |
| < | Ассоциация |
| |> | Реализация |
Link — одно из следующего:
| Тип | Описание |
|---|---|
| -- | Сплошная линия |
| .. | Пунктирная линия |
Интерфейс «леденец»
Классу также можно присвоить особый тип отношения, который определяет для класса интерфейс «леденец». Интерфейс «леденец» определяется с помощью следующего синтаксиса:
- bar ()-- foo
- foo --() bar
Интерфейс с «леденцом» (bar) соединяется с классом (foo).
Примечание: каждый определённый интерфейс уникален, чтобы не использоваться совместно между классами и не допускать нескольких соединений, указывающих на него.
Копировать
Встраивание
classDiagram
bar ()-- foo
Копировать
Встраивание
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Определение пространства имён
Пространство имён группирует классы.
Копировать
Встраивание
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Кардинальность/кратность отношения
Кратность или кардинальность на диаграмме классов обозначает количество экземпляров одного класса, которые могут быть связаны с экземплярами другого класса. Например, в каждой компании будет один или несколько сотрудников, но не ноль, а каждый сотрудник в настоящее время работает в нуле или одной компании.
Обозначение кратности размещается рядом с концом связи.
Различные варианты кардинальности:
- 1 только 1
- 0..1 0 или 1
- 1..* 1 или более
- * 0, 1 или более
- n n (где n>1)
- 0..n от 0 до n (где n>1)
- 1..n от 1 до n (где n>1)
Кардинальность можно легко определить, заключив текстовый параметр в двойные кавычки ”“ перед данной стрелкой или после неё. Например:
Копировать
Встраивание
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Копировать
Встраивание
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Аннотация класса
Классы можно аннотировать с помощью маркеров, чтобы предоставить дополнительную метаинформацию о классе. Это позволяет более ясно указать природу класса. Некоторые распространённые аннотации включают:
- <<Interface>> обозначает класс интерфейса
- <<Abstract>> обозначает абстрактный класс
- <<Service>> обозначает сервисный класс
- <<Enumeration>> обозначает перечисление
Аннотация определяется открывающими << и закрывающими >>. Существует три способа добавления аннотации к классу; результат всех трёх способов одинаков:
- Встроенно вместе с определением класса
Копировать
Встраивание
classDiagram
class Shape <<interface>>
В отдельной строке после определения класса:
Копировать
Встраивание
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- Во вложенной структуре определения класса:
Копировать
Встраивание
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Комментарий
В диаграмму классов можно вводить комментарии, которые редактор игнорирует. Комментарий должен занимать отдельную строку и начинаться с двойного знака процента (%%). Весь текст до следующей строки считается комментарием, включая любой синтаксис диаграммы классов.
Копировать
Встраивание
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Настройка направления диаграммы
Вы можете использовать оператор направления для настройки направления рендеринга диаграммы классов:
Копировать
Встраивание
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
Взаимодействие
К узлу можно привязать событие клика. Событие клика может вызвать функцию обратного вызова JavaScript или открыть ссылку, которая загрузится в новой вкладке браузера. Примечание: эта функция отключена при securityLevel='strict' и включена при securityLevel='loose'.
Вы можете определять эти операции на отдельной строке после всех объявлений классов.
Копировать
Встраивание
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action — это link или callback, в зависимости от типа взаимодействия, которое вы хотите вызвать.
- className — это id узла, связанного с операцией.
- reference может быть ссылкой URL или именем функции обратного вызова.
- (необязательно) всплывающая подсказка — это строка, отображаемая при наведении курсора на элемент.
- Функция обратного вызова будет вызвана с nodeId в качестве параметра.
Примечание
Можно использовать note "line1 line2" для добавления комментария на диаграмму. Можно использовать note for <CLASS NAME> "line1 line2" для добавления комментария к конкретному классу.
Пример
Копировать
Встраивание
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Ссылка URL:
Копировать
Встраивание
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"
Конфигурация
Блок членов
Можно скрыть пустой блок членов узла класса; это делается путём изменения значения hideEmptyMembersBox в конфигурации диаграммы классов.
Копировать
Встраивание
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck