Диаграммы классов строятся с использованием синтаксиса, повторяющего синтаксис, традиционно используемый в языках программирования. Такое сходство создает привычную среду для разработчиков, что способствует более легкому и интуитивно понятному процессу создания диаграмм.
Такой подход к проектированию не только лаконичен, но и позволяет создавать представления, которые одновременно лаконичны и выразительны. Более того, он позволяет изображать отношения между классами с помощью синтаксиса, повторяющего синтаксис диаграмм последовательности, что открывает путь к плавному и глубокому изображению взаимодействия классов.
Помимо структурных и реляционных представлений, синтаксис диаграмм классов поддерживает такие дополнительные возможности, как включение примечаний и применение цветов, что позволяет пользователям создавать информативные и визуально привлекательные диаграммы.
Вы можете узнать больше о некоторых
общих командах 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
|
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:
🎉 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" для классов, используя следующий синтаксис:
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]
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.
[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]
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
|
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
|