Процесс Тип
Графическое выражение
Мышление Тип
Структурированное выражение
Заметки Тип
Эффективное выражение

Диаграмма классовСинтаксис

Диаграмма классов

Диаграмма классов является основным строительным блоком объектно-ориентированного моделирования. Она используется для общего концептуального моделирования структуры приложения, а также для детального моделирования с преобразованием модели в программный код. Диаграммы классов также можно использовать для моделирования данных. Классы на диаграмме классов обозначают как основные элементы и взаимодействия в приложении, так и классы, требующие программирования.

Код
                            
Копировать
Встраивание
--- 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