Class diagrams (Диаграмма классов)

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


classDiagram
    Animal <|-- Duck
    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 - язык графического описания для моделирования бизнес-процессов и организационных структур.

  • UML предоставляет механизмы для представления членов класса, таких как атрибуты и методы, а также дополнительную информацию о них. Один экземпляр класса на диаграмме содержит три отсека:
  1. В верхней строке содержится название класса. Он вводится жирным шрифтом и по центру, а первая буква написана заглавной. Также может содержать необязательный текст аннотации, описывающий сущность класса.
  2. Средние строки содержат атрибуты класса. Они выровнены по левому краю, а первая буква - в нижнем регистре.
  3. Нижние строки содержат операции, которые может выполнять класс. Они также выровнены по левому краю, а первая буква записывается в нижнем регистре.



Описание класса

  • Существует два способа описания класса:
  1. Явное определение класса с использованием ключевого слова class, например, class Animal.
  2. Описание двух классов через связь между ними Vehicle <|-- Car. Это характеризует два класса Vehicle и Car с их отношениями.


Имя класса должно состоять из буквенно-цифровых символов (допускается использование юникода) и символов подчеркивания.

Определение участников класса.

  • Mermaid различает атрибуты и функции/методы в зависимости от того, присутствуют ли круглые скобки () или нет. Те записи, которые имеют круглые скобки (), рассматриваются как функции/методы, а другие - как атрибуты.
  • Существует два способа определения участников класса, и независимо от того, какой синтаксис используется для их определения, выходные данные будут одинаковыми:
  1. Связывание члена класса, используя двоеточие :, за которым следует имя участника. Используется для определения одного участника. Например:





  1. Связь членов класса с помощью фигурных скобок {}, где участники группируются в фигурных скобках. Подходит для определения нескольких элементов одновременно. Например:



Типы возврата

  • Можно завершить определение метода/функции типом данных, который будет возвращен (примечание: между окончательным значением должен быть пробел) определения метода и примера возвращаемого типа:



Общие(универсальные типы)

  • Элементы для полей, параметров и возвращаемых типов, могут быть определены с использованием общих типов, таких как List<int>. Выполнить можно, заключив тип в ~ (тильда).
  • Примечание: Определение вложенных типов (например, List<List<int>>) в настоящее время не поддерживаются.
  • Это может быть сделано, как часть любого метода определения класса:


Видимость

  • Чтобы указать видимость члена класса (т.е. любого атрибута или метода), можно использовать обозначения, представленные ниже. Они могут быть помещены перед именем члена, но это необязательно.

+ -  общедоступный;

- - частный;

# - защищенный;

~ -  комплекс/внутренний.

Примечание: Можно включить дополнительные классификаторы в определение метода, добавив следующие обозначения в конце метода, т.е. после круглых скобок ():

* - абстрактный, например, someAbstractMethod()*

$ - статичный, например, someStaticMethod()$

Примечание: Вы также можете включить дополнительные классификаторы в определение поля, добавив следующие обозначения в конец имени поля.

$ - статичный, например, String someField$

Определение взаимосвязей

  • Связь - это общий термин, охватывающий конкретные типы логических связей, обнаруживаемых на диаграммах классов и объектов.
[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


Двусторонние взаимосвязи

  • Взаимосвязи могут быть изображены по разному:
classDiagram
    Animal <|--|> Zebra
  • Используется следующий синтаксис:
[Relation Type][Link][Relation Type]
  • Где тип взаимосвязи может быть одним из представленных ниже:

    Тип Описание
    <| Наследование
    * Композиция
    o Объединение (агрегация)
    > Взаимосвязь (ассоциация)
    < Взаимосвязь (ассоциация)
    |> Реализация
  • Также связь может быть одной из:

Тип Описание
-- Сплошная (непрерывная) связь
.. Пунктирная связь

Важность/множественность во взаимосвязях

  • Важность или множественность в диаграммах классов указывает на количество экземпляров одного класса, связанных с одним экземпляром другого класса. Например, в одной компании будет один или несколько сотрудников, но каждый сотрудник работает только в одной компании.
  • Обозначения кратности помещаются рядом с концом ассоциаций.
  • Различными вариантами важности являются:
1 - только 1
0..1 - 0 или 1
1..* - 1 или несколько
* - много
n - определенное количество (где n>1)
0..n - от нуля до n (где n>1)
1..n - от 1 до n (где n>1)
  • Важность легко установить, поместив текст в кавычки перед(необязательно) и после (необязательно) заданной стрелки.
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText



Комментарии

  • Комментарии могут быть введены в диаграмму, которые будут проигнорированы синтаксическим анализатором.
  • Комментарии должны быть прописаны в отдельной строке и начинаться с %% (двойные знаки процента).
  • Любой текст после начала комментария к следующей новой строке будет рассматриваться как комментарий, включая любой синтаксис диаграммы:
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
    <<interface>>
    noOfVertices
    draw()
}

Изменение направления диаграммы.

  • Существует возможность использовать оператор direction, чтобы задать направление, в котором будет отображаться диаграмма, как в примере ниже:



Ориентация диаграммы

Вы можете выбрать необходимую ориентацию диаграммы. Вот возможные варианты настройки:

TD/TB - сверху-вниз;

BT - снизу-вверх;

RL - справа-налево;

LR - слева-направо.

Взаимодействие

  • Можно привязать событие к узлу, нажатие может привести либо к обратному вызову JavaScript, либо к ссылке, которая будет открыта в новой вкладке браузера.

Примечание: Эта функция отключена при использовании securityLevel='strict' и включена при использовании securityLevel='loose'.

  • Вы можете определить эти действия в отдельной строке после установки всех классов.
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
  • action is - это либо link (ссылка - связь), либо callback (обратный вызов),в зависимости от того, какой тип взаимодействий вы хотите вызвать;
  • className - идентификатор узла, с которым будет связано действие;
  • reference - либо URL-ссылка, либо имя функции для обратного вызова;
  • optional - всплывающая подсказка - строка, которая отображается при наведении курсора мыши на элемент (примечание: стили всплывающей подсказки задаются классом .mermaidTooltip.).

Примеры

  • 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"
  • Обратный вызов:
classDiagram
class Shape
callback Shape "callbackFunction" "This is a tooltip for a callback"
class Shape2
click Shape2 call callbackFunction() "This is a tooltip for a callback"

Примечание: функциональность всплывающих подсказок и возможность ссылки на URL-адреса доступны с версии 0.5.2.

Стили диаграммы

  • Основной стиль диаграммы классов выполнен с предустановленным количеством классов css. Во время визуализации, эти классы извлекаются из файла, расположенного по адресу src/themes/class.scss.

Стили узла

  • К отдельным узлам можно применить определенные стили, такие как: более толстая граница или другой цвет фона. Это делается путем предварительной установки классов в стилях css, которые могут быть применены из синтаксиса диаграммы, как в примере ниже:
<style>
    .cssClass > rect{
        fill:#FF0000;
        stroke:#FFFF00;
        stroke-width:4px;
    }
</style>
  • Затем прикрепите этот класс к определенному узлу, как показано в примере ниже:
cssClass "nodeId1" cssClass;
  • Также можно присоединить класс к списку узлов в одном операторе:
cssClass "nodeId1,nodeId2" cssClass;
  • Более короткая форма добавления класса заключается в присоединении имени класса к узлу с помощью оператора :::, как показано ниже:
classDiagram
    class Animal:::cssClass

или

classDiagram
    class Animal:::cssClass {
        -int sizeInFeet
        -canEat()
    }

Примечание: css-стили не могут быть добавлены с помощью этого сокращенного метода одновременно с инструкцией relation

Примечание: Из-за ограничений, связанных с синтаксисом для диаграммы, в настоящее время невозможно определить классы css внутри самой диаграммы