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

Диаграмма классов описывает статическую структуру системы: её классы, их атрибуты и методы, а также связи между ними. Это наиболее широко используемая UML-диаграмма для документирования организации и проектирования кода.

В PlantUML синтаксис близок к синтаксису языков программирования, поэтому атрибуты, методы и обозначения видимости пишутся естественно. Стрелки для связей используют тот же стиль, что и в диаграммах последовательности.

Описание возможностей, доступных для всех типов диаграмм, см. в разделе общие команды.

Декларирующий элемент

[Ссылка для protocol и struct: GH-1028, для exception: QA-16258, для record и dataclass: GH-2232]

[Ref. for protocol and struct: GH-1028, for exception: QA-16258, for record and dataclass: GH-2232]

[Ref. for protocol and struct: GH-1028; for exception: GH-1056, QA-16258; for metaclass and stereotype: GH-1159, QA-16784; for record and dataclass: GH-2232]
WARNING
 This translation need to be updated. 
WARNING

Взаимосвязи между классами

Взаимосвязи между классами (согласно нотации UML) задаются с помощью следующих символов:

Тип Символ Назначение
Расширение <|-- Специализация класса в иерархии
Реализация <|.. Реализация интерфейса классом
Композиция *-- Часть не может существовать без целого
Агрегация o-- Часть может существовать независимо от целого
Зависимость --> Объект использует другой объект
Зависимость ..> Более слабая форма зависимости

Если рассматривать более универсально,

Зная эти правила можно нарисовать следующие изображения:

WARNING
 This translation need to be updated. 
WARNING

Метки на взаимосвязях

Для каждой связи можно добавить метку. Делается это с помощью добавления символа : после которого указывается текст метки.

Для добавления меток ближе к началу или концу стрелочки можно использовать двойные кавычки "" и помещать метки, обрамленные такими кавычками, перед или после стрелочки как на примере ниже:

Вы можете добавить дополнительные стрелки < или > в начале или в конце метки, чтобы указать на использование одного объекта другим.

Использование не буквенных символов

Если Вы хотите использовать не буквенные ( , /, \, *, # и прочее) или специальные unicode символы в названии класса (а также других элементов), Вам необходимо выполнить следующие условия:

Also note that names starting with ``$`` are valid, but to assign an alias to such element the name must be put between quotes ``""``.
WARNING
 This translation need to be updated. 
WARNING

Добавление методов

Для объявления полей и методов вы можете использовать символ :. Для этого каждый раз указываете класс, затем символ :и затем имя поля или метода, который Вы хотите добавить в этот класс.

Система определяет что именно Вы добавили по типу скобок, которые Вы укажете после имени. Для поля данных это должны быть квадратные скобки [], а для метода круглые скобки ().

Чтобы не указывать каждый раз имя класса, для которого Вы хотите добавить поле данных или метод, можно все такие поля и методы указать сразу перечислив их внутри фигурных скобок {}.

Синтаксис порядка описания типа/имени довольно гибок.

Вы можете специально указать что именно Вы добавляете (поле данных или метод) используя ключевые слова {field} - поле данных или {method} - метод. Они переопределяют собой типы, определяемые парсером по умолчанию.

Указание видимости

Определяя методы и поля данных, вы можете использовать символы указания видимости, приведённые в таблице ниже:

Символ Иконка для поля данных Иконка для метода Видимость
- private
# protected
~ package private
+ public

Заменить значки их текстовыми представлениями можно используя команду skinparam classAttributeIconSize 0:

*[Ref. [QA-4755](https://forum.plantuml.net/4755/provide-display-visibility-attributes-private-protected)]*
WARNING
 This translation need to be updated. 
WARNING

Visibility on compositions and aggregations

[Ref. QA-8294]

Абстрактные и статические

Вы можете определить статические или абстрактные методы и поля данных используя модификаторы {static} и {abstract} соответственно.

Эти модификаторы могут располагаться как в начале, так и в конце строки. Вы так же можете использовать {classifier} как замену для {static}.

Расширенное тело класса

По умолчанию, методы и поля автоматически группируются PlantUML. Вы можете использовать разделители, чтобы определить собственный порядок полей и методов. Можно использовать следующие разделители: -- .. == __.

Вы также можете использовать заголовки внутри разделителей:

Заметки и шаблоны

Шаблоны задаются ключевым словом class с парой символов << и >>.

Также вы можете создать и спозиционировать относительно любого класса заметку, используя ключевые слова note left of , note right of , note top of и note bottom of.

Вы также можете создать и спозиционировать заметку относительно последнего определённого класса, используя ключевые слова note left, note right, note top и note bottom.

Ключевым словом note легко создать заметку без привязки и затем привязать её используя символ ...

WARNING
 This translation need to be updated. 
WARNING

Больше о заметках

Допускается использование некоторых HTML-тегов (также смотри синтаксис записи Creole), таких как:

Также, заметку можно задавать в несколько строчек. В таком случае, конец заметки определяется по ключевым словам end note.

WARNING
 This translation need to be updated. 
WARNING

Создание заметки для поля данных или метода

Можно создать и привязать заметку к полю данных или методу.

⚠ Ограничения

Заметка к полю занных или методу

Заметка для разных методов с одинаковым именем

[Ref. QA-3474 and QA-5835]

WARNING
 This translation need to be updated. 
WARNING

Заметки на взаимосвязях

Чтобы добавить заметку на связь, сразу после определения такой связи в следующей строке разместите команду note on link.

Вы также можете использовать note left on link, note right on link, note top on link или note bottom on link для того, чтобы добавить заметку и спозиционировать её относительно последней определенной связи.

Абстрактные классы и интерфейсы

Вы можете определить класс как абстрактный, используя ключевые слова abstract или abstract class.

Такие классы будут нарисованы курсивом.

А еще Вы можете использовать ключевые слова interface, annotation и enum.

[Ref. 'Annotation with members' Issue#458]

Скрыть атрибуты, методы...

Вы можете параметризовать отображение классов с помощью команды hide/show .

Основная команда: hide empty members. Эта команда скроет атрибуты или методы, если они пусты.

Вместо empty members можно использовать:

Вы также можете указать, сразу после ключевого слова hide или show :

Вы можете использовать несколько команд show/hide для определения правил и исключений

[Ref. QA-2913]
WARNING
 This translation need to be updated. 
WARNING

Скрытие классов

Вы также можете использовать команду show/hide, чтобы скрывать классы.

Это может быть полезно, если Вы подключили большой файл, и хотите скрыть некоторые классы из этого файла после его включения. Сам класс и связи, которые к нему вели будут скрыты, но место, которое он занимал на экране по прежнему будет им занято.

Удаление классов

Вы можете использовать команду remove, чтобы удалять классы.

Это может быть полезно, если Вы подключили большой файл, и хотите полностью удалить некоторые классы из этого файла после его включения. В отличие от каманды hide, которая только скрывает класс при отображении его на экране (и при этом этот скрытый класс продолжает занимать на экране место), при использовании команды remove класс и его связи будут полностью удалены перед формированием изображения, как будто они даже не определялись.

Hide, Remove or Restore tagged element or wildcard

You can put $tags (using $) on elements, then remove, hide or restore components either individually or by tags.

By default, all components are displayed:

But you can:

Скрытие или Удаление классов баз связей

По умолчанию отображаются все классы:

Но вы можете:

[Adapted from QA-11052]

Использование дженериков

Вы можете использовать угловые скобки < и > чтобы указать на использование дженериков в классе.

Также Вы можете отключить отрисовку этих элементов, используя команду skinparam genericDisplay old.

Определение метки

Обычно, метка с буквой (C, I, E or A) испольуется для классов, интерфейсов, перечислений и абстрактных классов.

Но Вы можете создать свою собственную метку для класса при создании шаблона задав для неё собственную букву и цвет (используя html-код для цвета или название цвета).

Русские буквы также можно использовать.

Пакеты

Вы можете создать пакет, используя ключевое слово package, также можно дополнительно указать для него цвет фона (используя html-код для цвета или название цвета).

Обратите внимание, что пакеты могут быть вложенными.

WARNING
 This translation need to be updated. 
WARNING

Стили пакетов

Доступны различные стили для пакетов.

Можно глобально задать стиль по умолчанию с помощью команды: skinparam packageStyle встроенныйСтильПакета, или указать стиль для каждого пакета по отдельности при помощи определения для него шаблона package имяПакета <<встроенныйСтильПакета>>.

На примере ниже можно посмотреть доступные варианты стилей для пакетов:

Между пакетами также можно указывать взаимосвязи:

Пространства имён

Даже если класс располагается внутри пакета, его имя остается уникальным идентификатором для этого класса. Это значит, что у Вас не может быть двух классов в разных пакетах, но с одинаковым именем.

В этом случае, вам следует использовать пространства имен вместо пакетов.

Вы можете ссылаться на классы из других пространств имён по их полному определению. Классы без пространства имён определяются по наличию точки пред их именами.

Обратите внимание, что вы не обязаны явно создавать пространство имен: правильно определенный класс, в имени которого через точку указано пространство имен и затем его имя автоматически попадает в правильное пространство имен.

There won't be any difference between namespaces and packages anymore: both keywords are now synonymous.

There won't be any difference between ``namespaces`` and ``packages`` anymore: both keywords are now synonymous.
WARNING
 This translation need to be updated. 
WARNING

Настройка создания пространств имён

Вы можете задать другой разделитель (не точку) используя команду:

также Вы можете отключить автоматическое создание пакетов используя команду:

WARNING
 This translation need to be updated. 
WARNING

Lollipop интерфейс

Вы можете задвать интерфейсы в виде "lollipop" для классов, используя следующий синтаксис:

Изменение направления стрелок

По умолчанию, связи между элементами задаются при помощи двух тире -- для сплошных линий или при помощи двух точек .. для пунктирных линий и ориентированны вертикально. Можно указать, что связь необходимо изобразить горизонтально, для этого необходимо использовать одиночное тире - для сплошной линии или одну точку . для штриховой линии.

Изменить направление стрелки можно, переместив символ окончания стрелки на другую сторону:

Можно управлять направлением связи добавляя ключевые слова left, right, up или down внутрь стрелки:

Можно использовать более короткий синтаксис используя только первый символ указанных выше ключевых слов, например -d- или -do- вместо полного слова -down-.

Правда злоупотреблять такой короткой записью не стоит, так как GraphViz обычно дает более хороший результат, когда такая короткая запись НЕ используется.

И наконец, можно поменять все направления местами используя ключевое слово left to right direction. Для этого можно сравнить предыдущую диаграмму с диаграммой, представленной ниже:

Ассоциация классов

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

Вы можете задать это в другом направлении:

Ассоциация в одном и том же классе

[Ref. Incubation: Associations]

Параметры отображения

Вы можете использовать команду skinparam для глобального изменения шрифтов и цветов различных элементов диаграммы.

Вы можете использовать данную команду :

Параметры отображения для шаблонов

Расширяя пример выше, можно задавать специальные параметры для определенных шаблонов (и применять эти щаблоны затем к тем или иным классам).

Any of the spaces shown as `_` below will cause all skinparams to be ignored, see [discord discussion](https://discord.com/channels/1083727021328306236/1289954399321329755/1289967399302467614) and [issue #1932](https://github.com/plantuml/plantuml/issues/1932):
WARNING
 This translation need to be updated. 
WARNING

Цветовой градиент

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

Можно использовать как стандартные названия цветов, так и их RGB-коды в различных вариантах записи.

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

Для примера:

Помощь в расположении классов

Иногда диаграмма, формируемая по умолчанию выходит не совсем удачной...

Вы можете объединять несколько классов вместе используя ключевое слово together, тогда рендер постарается расположить объединенные таким образом классы рядом друг с другом так, как если бы они находились в одном пакете.

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

Разделение больших файлов

Иногда могут получиться очень большие файлы изображений.

Чтобы разделить создаваемое изображение на несколько файлов (страниц), Вы можете использовать команду page (hpages)x(vpages), где:

С этой командой также можно использовать команды skinparam параметр значение для настроек цвета разделённых страниц, и размеров их границы (смотри пример).

Наследование и Реализация (Имплементация)

Вы можете использовать ключевые слова extends и implements для содания связей наследования и реализации (имплементации).

*[Ref. [QA-2239](https://forum.plantuml.net/2239/is-multiple-inheritance-or-implementation-possible)]*
WARNING
 This translation need to be updated. 
WARNING

Изменение цвета и стиля связей или стрелок (синтаксис квадратных скобочек)

Есть два разных синтаксиса для изменения цвета и стиля связей и стрелок. Возможности этого синтаксиса квадратных скобочек несколько больше, чем возможности встраиваемого синтаксиса (подробнее о нем будет ниже), так как здесь можно полностю скрывать связи, а также задавать их толщину.

Стиль линий

Можно задавать следующие стили для связей: bold - жирный, dashed - штриховой, dotted - пунктирный, hidden - скрытый, plain - непрерывный:

[Adapted from QA-4181]

Цвет линий

Можно задавать цвет для связей:

Толщина линий

Можно задать толщину связей:

[Ref. QA-4949]

Смешивание различных парметров

Изменение цвета и стиля связей или стрелок (встраиваемый синтаксис)

Возможности этого синтаксиса немного меньше, чем синтаксиса квадратных скобочек, который был рассмотрен выше. В частности, здесь нельзя задавать толщину линий, а также нельзя полностью скрывать линии.

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

#color;line.[bold|dashed|dotted];text:color

где:

Пример установки одних и тех же параметров при помощи двух различных синтаксисов можно посмотреть на примере ниже:

[See similar feature on deployment]

Изменение цвета и стиля класса (встраиваемый синтаксис)

Вы можете изменить цвет или стиль индивидуально для каждой стрелочки используя следующие 2 варианта встраиваемого синтаксиса:

1. #color ##[style]color

где:

[Ref. QA-1487]

2. #[color|back:color];header:color;line:color;line.[bold|dashed|dotted];text:color

где:

Как уже упоминалось выше, можно задавать градиенты для фона, если указывать вместо одного цвета два разных цвета, разделяя их знаками \, |, / или - (они отвечают за разное направление градиента). Например: header:blue/red или back:DD0000-00FFFF.

Еще один пример:

[Ref. QA-3770]

Связи от/на члены класса

[Ref. QA-3636]

[Ref. QA-5261]

Группировка стрелок, ведущих к одному элементу

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

Установка параметра в значение 1 (без группировки)

Установка параметра в значение 2 (группировка если 2 и более)

Установка параметра в значение 3 (группировка если 3 и более)

Установка параметра в значение 4 (группировка если 4 и более)

[Ссылка на QA-3193, и дефект QA-13532]

Display JSON Data on Class or Object diagram

Simple example

[Ref. QA-15481]

For another example, see on JSON page.

Packages and Namespaces Enhancement

[From V1.2023.2+, and V1.2023.5]

[Ref. GH-1352]

Qualified associations

Minimal example

[Ref. QA-16397, GH-1467]

Another example

Change diagram orientation

You can change (whole) diagram orientation with:

Top to bottom (by default)

With Graphviz (layout engine by default)

The main rule is: Nested element first, then simple element.

With Smetana (internal layout engine)

The main rule is the opposite: Simple element first, then nested element.

Left to right

With Graphviz (layout engine by default)

With Smetana (internal layout engine)

Role label to associations

[Ref. GH-2536, GH-2537]