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

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

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

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

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

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

🎉 Copied!

@startuml
abstract        abstract
abstract class  "abstract class"
annotation      annotation
circle          circle
()              circle_short_form
class           class
diamond         diamond
<>              diamond_short_form
entity          entity
enum            enum
interface       interface
protocol        protocol
struct          struct
@enduml

[Ссылка для protocol и struct: GH-1028]

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

WARNING
 This translation need to be updated. 
WARNING

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

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

Тип Символ Отображение
Наследование <|--
Композиция *--
Агрегация o--
Зависимость <..
Ассоциация <--
Реализация (Имплементация) <|..

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

  • есть два типа линий:
    • -- - рисует сплошную линию
    • .. - рисует штриховую линию

  • к любой стороне (или сразу к обоим сторонам) линии, соединяющей два элемента, можно добавить разные наконечники:
    • < - рисует заостренный наконечник стрелочки
    • <| или ^ - рисует наконечник стрелочки в виде треугольника
    • * - рисует неконечник стрелочки в виде сплошного ромба
    • o - рисует неконечник стрелочки в виде полого ромба
    • # - рисует неконечник стрелочки в виде полого квадратика
    • x - рисует неконечник стрелочки в виде крестика
    • } - рисует неконечник стрелочки в виде обратного треугольника
    • + - рисует неконечник стрелочки в виде кружочка с крестиком внутри

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

🎉 Copied!

@startuml
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
@enduml

🎉 Copied!

@startuml
Class11 <|.. Class12
Class13 --> Class14
Class15 ..> Class16
Class17 ..|> Class18
Class19 <--* Class20
@enduml

🎉 Copied!

@startuml
Class21 #-- Class22
Class23 x-- Class24
Class25 }-- Class26
Class27 +-- Class28
Class29 ^-- Class30
@enduml

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

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

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

🎉 Copied!

@startuml

Class01 "к одному" *-- "от многих" Class02 : композиция

Class03 o-- Class04 : агрегация

Class05 --> "1" Class06

@enduml

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

🎉 Copied!

@startuml
class Машина

Водитель - Машина: ведет >
Машина *- Колесо: имеет 4 >
Машина -- Персонаж: < владеет

@enduml

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

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

🎉 Copied!

@startuml
class "Это мой класс с\nпробелами в имени" as class1
class class2 as "Так это тоже работает"

class2 *-- "foo/dummy": тут тоже нужны кавычки,\nтак как есть символ ''/''

class1 *-- ИмяНаРусском: названия на русском языке\nне требуют использования кавычек\n если в них нет пробелов
@enduml

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

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

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

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

🎉 Copied!

@startuml
Object <|-- ArrayList

Object : equals()
ArrayList : Object[] elementData
ArrayList : size()

@enduml

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

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

🎉 Copied!

@startuml
class Dummy {
  String data
  void methods()
}

class Flight {
   flightNumber : Integer
   departureTime : Date
}
@enduml

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

🎉 Copied!

@startuml
class Dummy {
  {field} A field (despite parentheses)
  {method} Some method
}

@enduml

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

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

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

🎉 Copied!

@startuml

class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}

@enduml

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

🎉 Copied!

@startuml
skinparam classAttributeIconSize 0
class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}

@enduml

WARNING
 This translation need to be updated. 
WARNING

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

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

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

🎉 Copied!

@startuml
class Dummy {
  {static} String id
  {abstract} void methods()
}
@enduml

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

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

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

🎉 Copied!

@startuml
class Foo1 {
  Вы можете использовать
  несколько строчек
  ..
  и, если хотите,
  можете группировать их
  ==
  как Вам удобно.
  __
  Можно делать столько групп,
  сколько Вам нужно
  --
  End of class
}

class User {
  .. Simple Getter ..
  + getName()
  + getAddress()
  .. Some setter ..
  + setName()
  __ private data __
  int age
  -- encrypted --
  String password
}

@enduml

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

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

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

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

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

🎉 Copied!

@startuml
class Object << general >>
Object <|--- ArrayList

note top of Object : In java, every class\nextends this one.

note "Это не привязанная\nни к чему заметка" as N1
note "Эта заметка привязана\nсразу к нескольким классам" as N2
Object .. N2
N2 .. ArrayList

class Foo
note left: Эта заметка будет\nпривязана к последнему\nопределенному классу

@enduml

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

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

  • <b>
  • <u>
  • <i>
  • <s>, <del>, <strike>
  • <font color="#AAAAAA"> or <font color="colorName">
  • <color:#AAAAAA> or <color:colorName>
  • <size:nn> to change font size
  • <img src="file"> or <img:file>: the file must be accessible by the filesystem

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

🎉 Copied!

@startuml

class Foo
note left: On last defined class

note top of Foo
  In java, <size:18>every</size> <u>class</u>
  <b>extends</b>
  <i>this</i> one.
end note

note as N1
  Эта заметка <u>также</u>
  <b><color:royalBlue>состоит из</color>
  <s>нескольких</s> строчек.
  And this is hosted by <img:sourceforge.jpg>
end note

@enduml

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

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

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

  • Нельзя использовать top или bottom (реализованы только left и right)
  • Нельзя использовать с разделителем пространства имён ::

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

🎉 Copied!

@startuml
class A {
{static} int counter
+void {abstract} start(int timeout)
}
note right of A::counter
  Это поле данных прокомментировано
end note
note right of A::start
  Этот метод теперь объясняется в UML заметке
end note
@enduml

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

🎉 Copied!

@startuml
class A {
{static} int counter
+void {abstract} start(int timeoutms)
+void {abstract} start(Duration timeout)
}
note left of A::counter
  Это поле данных прокомментировано
end note
note right of A::"start(int timeoutms)"
  Это метод с типом параметра int
end note
note right of A::"start(Duration timeout)"
  Это метод с типом параметра Duration
end note
@enduml

[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 для того, чтобы добавить заметку и спозиционировать её относительно последней определенной связи.

🎉 Copied!

@startuml

class Dummy
Dummy --> Foo : Одна связь
note on link #red: Помни, оно - красное!

Dummy --> Foo2 : Другая связь
note right on link #lightblue
Это моя заметка, чтобы
не забыть где правильная связь.
И еще, она - почти синяя
end note

@enduml

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

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

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

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

🎉 Copied!

@startuml

abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection

List <|-- AbstractList
Collection <|-- AbstractCollection

Collection <|- List
AbstractCollection <|- AbstractList
AbstractList <|-- ArrayList

class ArrayList {
  Object[] elementData
  size()
}

enum TimeUnit {
  DAYS
  HOURS
  MINUTES
}

annotation SuppressWarnings

annotation Annotation {
  annotation with members
  String foo()
  String bar()
}

@enduml

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

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

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

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

Вместо empty members можно использовать:
  • empty fields или empty attributes для пустых полей,
  • empty methods для пустых методов,
  • fields или attributes, которая скроет поля, даже если они описаны,
  • methods которая скроет методы, даже если они описаны,
  • members которая скроет поля иметоды, даже если они описаны,
  • circle для обведенного символа перед именем класса,
  • stereotype для стереотипа.

Вы также можете указать, сразу после ключевого слова hide или show :
  • class для всех классов,
  • interface для всех интерфейсов,
  • enum для всех перечислений,
  • <<foo1>> для классов, стереотип которых foo1,
  • существующее имя класса.

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

🎉 Copied!

@startuml

class Dummy1 {
  +myMethods()
}

class Dummy2 {
  +hiddenMethod()
}

class Dummy3 <<Serializable>> {
String name
}

hide members
hide <<Serializable>> circle
show Dummy1 methods
show <<Serializable>> fields

@enduml

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

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

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

🎉 Copied!

@startuml

class Foo1
class Foo2
class Foo3

Foo2 *-- Foo1
Foo3 *-- Foo1
Foo3 *-- Foo2

hide Foo1
hide Foo2

@enduml

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

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

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

🎉 Copied!

@startuml

class Foo1
class Foo2
class Foo3

Foo2 *-- Foo1
Foo3 *-- Foo1
Foo3 *-- Foo2

remove Foo1
remove Foo2

@enduml

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:

🎉 Copied!

@startuml
class C1 $tag13
enum E1
interface I1 $tag13
C1 -- I1
@enduml

But you can:
  • hide $tag13 components:

🎉 Copied!

@startuml
class C1 $tag13
enum E1
interface I1 $tag13
C1 -- I1

hide $tag13
@enduml

  • or remove $tag13 components:

🎉 Copied!

@startuml
class C1 $tag13
enum E1
interface I1 $tag13
C1 -- I1

remove $tag13
@enduml

  • or remove $tag13 and restore $tag1 components:

🎉 Copied!

@startuml
class C1 $tag13 $tag1
enum E1
interface I1 $tag13
C1 -- I1

remove $tag13
restore $tag1
@enduml

  • or remove * and restore $tag1 components:

🎉 Copied!

@startuml
class C1 $tag13 $tag1
enum E1
interface I1 $tag13
C1 -- I1

remove *
restore $tag1
@enduml

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

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

🎉 Copied!

@startuml
class C1
class C2
class C3
C1 -- C2
@enduml

Но вы можете:
  • скрывать классы без связей при помощи команды hide @unlinked:

🎉 Copied!

@startuml
class C1
class C2
class C3
C1 -- C2

hide @unlinked
@enduml

  • полностью удалять классы без связей при помощи команды remove @unlinked:

🎉 Copied!

@startuml
class C1
class C2
class C3
C1 -- C2

remove @unlinked
@enduml

[Adapted from QA-11052]

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

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

🎉 Copied!

@startuml

class Foo<? extends Element> {
  int size()
}
Foo *- Element

@enduml

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

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

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

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

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

🎉 Copied!

@startuml

class System << (S,#FF7700) Singleton >>
class Date << (D,orchid) >>
class Форма << (Ф,lightblue) >>
class Заголовок << (З,green) >>

@enduml

Пакеты

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

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

🎉 Copied!

@startuml

package "Classic Collections" #DDDDDD {
  Object <|-- ArrayList
}

package net.sourceforge.plantuml {
  Object <|-- Demo1
  Demo1 *- Demo2
}

@enduml

WARNING
 This translation need to be updated. 
WARNING

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

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

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

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

🎉 Copied!

@startuml
scale 750 width
package foo1 <<Node>> {
  class Class1
}

package foo2 <<Rectangle>> {
  class Class2
}

package foo3 <<Folder>> {
  class Class3
}

package foo4 <<Frame>> {
  class Class4
}

package foo5 <<Cloud>> {
  class Class5
}

package foo6 <<Database>> {
  class Class6
}

@enduml

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

🎉 Copied!

@startuml

skinparam packageStyle rectangle

package foo1.foo2 {
}

package foo1.foo2.foo3 {
  class Object
}

foo1.foo2 +-- foo1.foo2.foo3

@enduml

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

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

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

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

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

🎉 Copied!

@startuml

class Метрики

namespace Сеть.ожидание #DDDDDD {
    .Метрики <|-- Пользователь
    Встреча o-- Пользователь

    .Метрики <|- Встреча
}

namespace Сеть.действующий {
  Сеть.ожидание.Пользователь <|- Пользователь
  .Метрики <|-- Пользователь

  Сеть.ожидание.Встреча o-- Пользователь
}

Метрики <|-- Сеть.завершенный.Пользователь

@enduml

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

WARNING
 This translation need to be updated. 
WARNING

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

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

🎉 Copied!

@startuml

set namespaceSeparator ::
class X1::X2::foo {
  some info
}

@enduml

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

🎉 Copied!

@startuml

set namespaceSeparator none
class X1.X2.foo {
  some info
}

@enduml

WARNING
 This translation need to be updated. 
WARNING

Lollipop интерфейс

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

🎉 Copied!

@startuml
class foo
bar ()- foo
@enduml

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

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

🎉 Copied!

@startuml
Room o- Student
Room *-- Chair
@enduml

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

🎉 Copied!

@startuml
Student .o Room
Chair ..* Room
@enduml

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

🎉 Copied!

@startuml
Пользователь -left-> Лево
Пользователь -right-> Право
Пользователь -up-> Верх
Пользователь -down-> Низ
@enduml

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

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

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

🎉 Copied!

@startuml
left to right direction
Пользователь -left-> Лево
Пользователь -right-> Право
Пользователь -up-> Верх
Пользователь -down-> Низ
@enduml

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

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

🎉 Copied!

@startuml
class Student {
  Name
}
Student "0..*" - "1..*" Course
(Student, Course) .. Enrollment

class Enrollment {
  drop()
  cancel()
}
@enduml

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

🎉 Copied!

@startuml
class Student {
  Name
}
Student "0..*" -- "1..*" Course
(Student, Course) . Enrollment

class Enrollment {
  drop()
  cancel()
}
@enduml

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

🎉 Copied!

@startuml
class Station {
    +name: string
}

class StationCrossing {
    +cost: TimeInterval
}

<> diamond

StationCrossing . diamond
diamond - "from 0..*" Station
diamond - "to 0..* " Station
@enduml

[Ref. Incubation: Associations]

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

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

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

🎉 Copied!

@startuml

' задаем параметры для всех классов по умолчанию
skinparam class {
  ' задаем светлозеленый цвет для фона классов по умолчанию
  BackgroundColor LightGreen
  ' задаем синий цвет для связей классов по умолчанию
  ArrowColor      Blue
  ' задаем красный цвет для контуров классов по умолчанию
  BorderColor     Red
}

' задаем цвет кружочков внутри элементов по умолцанию
skinparam stereotypeCBackgroundColor Magenta

Class01 "к одному" *-- "от многих" Class02 : композиция

Class03 o-- Class04 : агрегация

@enduml

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

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

🎉 Copied!

@startuml

' задаем параметры для всех классов по умолчанию
skinparam class {
  ' задаем светлозеленый цвет для фона классов по умолчанию
  BackgroundColor LightGreen
  ' задаем синий цвет для связей классов по умолчанию
  ArrowColor      Blue
  ' задаем красный цвет для контуров классов по умолчанию
  BorderColor     Red
  ' задаем зеленый цвет для фона классов, для которых шаблоном является Foo
  BackgroundColor<<Foo>> Green
  ' задаем оранжевый цвет для контуров классов, для которых шаблоном является Foo
  BorderColor<<Foo>> Orange
}

' задаем розовый цвет кружочков внутри элементов по умолцанию
skinparam stereotypeCBackgroundColor Magenta
' задаем серый цвет кружочков внутри элементов, для которых шаблоном является Foo
skinparam stereotypeCBackgroundColor<< Foo >> Gray

Class01 <<Foo>>
Class03 <<Foo>>

Class01 "к одному" *-- "от многих" Class02 : композиция

Class03 o-- Class04 : агрегация

@enduml

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):
  • `BackgroundColor_<<Foo>> Wheat`
  • `skinparam stereotypeCBackgroundColor_<<Foo>> DimGray`
WARNING
 This translation need to be updated. 
WARNING

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

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

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

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

Для примера:

🎉 Copied!

@startuml

skinparam backgroundcolor AntiqueWhite/Gold
skinparam classBackgroundColor Wheat|CornflowerBlue

class Foo #red-lightgreen
note left of Foo #lightblue\9932CC
  это моя заметка
  об этом классе
end note

package Пример #GreenYellow/LightGoldenRodYellow {
  class Заглушка
}

@enduml

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

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

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

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

🎉 Copied!

@startuml

class Bar1
class Bar2
together {
  class Together1
  class Together2
  class Together3
}

Together2 -[hidden]--> Bar1
Bar1      -[hidden]>   Bar2

@enduml

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

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

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

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

🎉 Copied!

@startuml
' Разделение на 4 страницы
page 2x2
skinparam pageMargin 10
skinparam pageExternalColor gray
skinparam pageBorderColor black

class Метрики

namespace Сеть.ожидание #DDDDDD {
    .Метрики <|-- Пользователь
    Встреча o-- Пользователь

    .Метрики <|- Встреча
}

namespace Сеть.действующий {
  Сеть.ожидание.Пользователь <|- Пользователь
  .Метрики <|-- Пользователь

  Сеть.ожидание.Встреча o-- Пользователь
}

Метрики <|-- Сеть.завершенный.Пользователь

@enduml

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

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

🎉 Copied!

@startuml
class ArrayList implements List
class ArrayList extends AbstractList
@enduml

*[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 - непрерывный:

  • пример для каждого стиля без заметок на связях:

🎉 Copied!

@startuml
title Синтаксис квадратных скобочек без заметок
class foo
class bar
bar1 : [bold]  
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain] 

foo --> bar
foo -[bold]-> bar1
foo -[dashed]-> bar2
foo -[dotted]-> bar3
foo -[hidden]-> bar4
foo -[plain]-> bar5
@enduml

  • пример для каждого стиля с заметками на связях:

🎉 Copied!

@startuml
title Синтаксис квадратных скобочек с заметками
class foo
class bar
bar1 : [bold]  
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain] 

foo --> bar          : по умолчанию
foo -[bold]-> bar1   : [жирный]
foo -[dashed]-> bar2 : [штриховой]
foo -[dotted]-> bar3 : [пунктирный]
foo -[hidden]-> bar4 : [скрытый]
foo -[plain]-> bar5  : [непрерывный]

@enduml

[Adapted from QA-4181]

Цвет линий

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

🎉 Copied!

@startuml
title Задание цвета при помощи синтаксиса квадратных скобочек
class foo
class bar
bar1 : [#red]
bar2 : [#green]
bar3 : [#blue]

foo --> bar            : обычный
foo -[#red]-> bar1     : [красный]
foo -[#green]-> bar2   : [зеленый]
foo -[#blue]-> bar3    : [синий]
@enduml

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

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

🎉 Copied!

@startuml
title Задание толщины при помощи синтаксиса квадратных скобочек
class foo
class bar
bar1 : [thickness=1]
bar2 : [thickness=2]
bar3 : [thickness=4]
bar4 : [thickness=8]
bar5 : [thickness=16]

foo --> bar                 : обычный
foo -[thickness=1]-> bar1   : [1]
foo -[thickness=2]-> bar2   : [2]
foo -[thickness=4]-> bar3   : [4]
foo -[thickness=8]-> bar4   : [8]
foo -[thickness=16]-> bar5  : [16]

@enduml

[Ref. QA-4949]

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

🎉 Copied!

@startuml
title Смешивание параметров при использовании синтаксиса квадратных скобочек
class foo
class bar
bar1 : [#red,thickness=1]
bar2 : [#red,dashed,thickness=2]
bar3 : [#green,dashed,thickness=4]
bar4 : [#blue,dotted,thickness=8]
bar5 : [#lightblue,plain,thickness=16]

foo --> bar                                  : обычный
foo -[#red,thickness=1]-> bar1               : [#red,1]
foo -[#red,dashed,thickness=2]-> bar2        : [#red,dashed,2]
foo -[#green,dashed,thickness=4]-> bar3      : [#green,dashed,4]
foo -[#blue,dotted,thickness=8]-> bar4       : [blue,dotted,8]
foo -[#lightblue,plain,thickness=16]-> bar5  : [lightblue,plain,16]
@enduml

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

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

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

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

где:

  • # - начало режима конфигурирования,
  • color - цвет стрелки,
  • ; - разделитель между конфигурационными параметрами,
  • line.type - тип линии. type может принимать значения: bold - жирная, dashed - штриховая, dotted - пунктирная,
  • text:color - цвет текста заметки на линии.

🎉 Copied!

@startuml
class foo
foo --> bar : обычная
foo --> bar1 #line:red;line.bold;text:red  : красная, жирный
foo --> bar2 #green;line.dashed;text:green : зеленая, штриховой
foo --> bar3 #blue;line.dotted;text:blue   : синяя, пунктирный
@enduml

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

🎉 Copied!

@startuml

class foo1
class foo2

foo1 -[#red,bold]>      bar1
foo1 -[#blue,dashed]->  bar2  : синтаксис квадратных скобочек

foo2 ->  bar3  #red;line.bold
foo2 --> bar4  #blue;line.dashed  : встраиваемый синтаксис  

@enduml

[See similar feature on deployment]

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

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

1. #color ##[style]color

где:
  • #color - цвет фона элемента,
  • ##[style]color - стиль отображения и цвет линий элемента.

🎉 Copied!

@startuml
abstract   abstract
annotation annotation #pink ##[bold]red
class      class      #palegreen ##[dashed]green
interface  interface  #aliceblue ##[dotted]blue
@enduml

[Ref. QA-1487]

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

где:
  • # - начало режима конфигурирования,
  • color или back:color - основной цвет фона,
  • ; - разделитель между конфигурационными параметрами,
  • header:color - дополнительный цвет фона для заголовка,
  • line:color - цвет для контуров элемента,
  • line.[type] - тип линий, из которых состоит контур элемента (type может принимать значения: bold - жирный, dashed - штриховой, dotted - пунктирный),
  • text:color - цвет текста.

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

🎉 Copied!

@startuml
abstract   abstract
annotation annotation #pink;line:red;line.bold;text:red
class      class      #palegreen;header:red;line:green;line.dashed;text:green
interface  interface  #aliceblue;line:blue;line.dotted;text:blue
@enduml

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

🎉 Copied!

@startuml
class bar #line:green;back:lightblue
class bar2 #lightblue;line:green

class Foo1 #back:red;line:00FFFF
class FooDashed #line.dashed:blue
class FooDotted #line.dotted:blue
class FooBold #line.bold
class Demo1 #back:lightgreen|yellow;header:blue/red
@enduml

[Ref. QA-3770]

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

🎉 Copied!

@startuml
class Foo {
+ field1
+ field2
}

class Bar {
+ field3
+ field4
}

Foo::field1 --> Bar::field3 : foo
Foo::field2 --> Bar::field4 : bar
@enduml

[Ref. QA-3636]

🎉 Copied!

@startuml
left to right direction

class User {
  id : INTEGER
  ..
  other_id : INTEGER
}

class Email {
  id : INTEGER
  ..
  user_id : INTEGER
  address : INTEGER
}

User::id *-- Email::user_id
@enduml

[Ref. QA-5261]

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

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

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

🎉 Copied!

@startuml
skinparam groupInheritance 1

A1 <|-- B1

A2 <|-- B2
A2 <|-- C2

A3 <|-- B3
A3 <|-- C3
A3 <|-- D3

A4 <|-- B4
A4 <|-- C4
A4 <|-- D4
A4 <|-- E4
@enduml

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

🎉 Copied!

@startuml
skinparam groupInheritance 2

A1 <|-- B1

A2 <|-- B2
A2 <|-- C2

A3 <|-- B3
A3 <|-- C3
A3 <|-- D3

A4 <|-- B4
A4 <|-- C4
A4 <|-- D4
A4 <|-- E4
@enduml

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

🎉 Copied!

@startuml
skinparam groupInheritance 3

A1 <|-- B1

A2 <|-- B2
A2 <|-- C2

A3 <|-- B3
A3 <|-- C3
A3 <|-- D3

A4 <|-- B4
A4 <|-- C4
A4 <|-- D4
A4 <|-- E4
@enduml

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

🎉 Copied!

@startuml
skinparam groupInheritance 4

A1 <|-- B1

A2 <|-- B2
A2 <|-- C2

A3 <|-- B3
A3 <|-- C3
A3 <|-- D3

A4 <|-- B4
A4 <|-- C4
A4 <|-- D4
A4 <|-- E4
@enduml

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

Display JSON Data on Class or Object diagram

Simple example

🎉 Copied!

@startuml
class Class
object Object
json JSON {
   "fruit":"Apple",
   "size":"Large",
   "color": ["Red", "Green"]
}
@enduml

[Ref. QA-15481]

For another example, see on JSON page.

Packages and Namespaces Enhancement

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

🎉 Copied!

@startuml
class A.B.C.D.Z {
}
@enduml

🎉 Copied!

@startuml
set separator none
class A.B.C.D.Z {
}
@enduml

🎉 Copied!

@startuml
!pragma useIntermediatePackages false
class A.B.C.D.Z {
}
@enduml

🎉 Copied!

@startuml
set separator none
package A.B.C.D {
  class Z {
  }
}
@enduml

[Ref. GH-1352]

Qualified associations

Minimal example

🎉 Copied!

@startuml
class class1
class class2

class1 [Qualifier] - class2
@enduml

[Ref. QA-16397, GH-1467]

Another example

🎉 Copied!

@startuml
    interface Map<K,V>
    class HashMap<Long,Customer>

    Map <|.. HashMap
    Shop [customerId: long] ---> "customer\n1" Customer
    HashMap [id: Long] -r-> "value" Customer
@enduml

Change diagram orientation

You can change (whole) diagram orientation with:
  • top to bottom direction (by default)
  • left to right direction

Top to bottom (by default)

With Graphviz (layout engine by default)

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

🎉 Copied!

@startuml
class a
class b
package A {
  class a1
  class a2
  class a3
  class a4
  class a5
  package sub_a {
   class sa1
   class sa2
   class sa3
  }
}
  
package B {
  class b1
  class b2
  class b3
  class b4
  class b5
  package sub_b {
   class sb1
   class sb2
   class sb3
  }
}
@enduml

With Smetana (internal layout engine)

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

🎉 Copied!

@startuml
!pragma layout smetana
class a
class b
package A {
  class a1
  class a2
  class a3
  class a4
  class a5
  package sub_a {
   class sa1
   class sa2
   class sa3
  }
}
  
package B {
  class b1
  class b2
  class b3
  class b4
  class b5
  package sub_b {
   class sb1
   class sb2
   class sb3
  }
}
@enduml

Left to right

With Graphviz (layout engine by default)

🎉 Copied!

@startuml
left to right direction
class a
class b
package A {
  class a1
  class a2
  class a3
  class a4
  class a5
  package sub_a {
   class sa1
   class sa2
   class sa3
  }
}
  
package B {
  class b1
  class b2
  class b3
  class b4
  class b5
  package sub_b {
   class sb1
   class sb2
   class sb3
  }
}
@enduml

With Smetana (internal layout engine)

🎉 Copied!

@startuml
!pragma layout smetana
left to right direction
class a
class b
package A {
  class a1
  class a2
  class a3
  class a4
  class a5
  package sub_a {
   class sa1
   class sa2
   class sa3
  }
}
  
package B {
  class b1
  class b2
  class b3
  class b4
  class b5
  package sub_b {
   class sb1
   class sb2
   class sb3
  }
}
@enduml


Privacy Policy      Advertise