Вы можете внести свой вклад на этой странице, нажав здесь  (Menu)

 

 

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

 

 

Отношения между классами

Отношения между классами определяются с помощью следующих символов:

Type Symbol Drawing
Extension <|--
Composition *--
Aggregation o--

Можно заменить - на .., чтобы создать пунктирную линию.

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

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

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

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

 

 

Метки на отношениях

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

Для указания количества элементов на каждой стороне отношения можно использовать двойные кавычки "".

@startuml

Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

Class05 --> "1" Class06

@enduml

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

@startuml
class Car

Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns

@enduml

 

 

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

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

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

@startuml
Object <|-- ArrayList

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

@enduml

Также можно группировать все поля и методы между фигурными скобками {}.

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

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

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

You can use {field} and {method} modifiers to override default behaviour of the parser about fields and methods.

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

@enduml

 

 

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

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

Character Icon for field Icon for method Visibility
- private
# protected
~ package private
+ public

@startuml

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

@enduml

Убрать значки можно командой skinparam classAttributeIconSize 0:

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

@enduml

 

 

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

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

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

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

 

 

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

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

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

@startuml
class Foo1 {
  You can use
  several lines
  ..
  as you want
  and group
  ==
  things together.
  __
  You can have as many groups
  as you want
  --
  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 легко создать заметку без привязи, а после, используя символ .., привязать её к другим объектам.

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

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

note "This is a floating note" as N1
note "This note is connected\nto several objects." as N2
Object .. N2
N2 .. ArrayList

class Foo
note left: On last defined class

@enduml

 

 

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

Также допускается использование некоторых HTML-тегов, таких как:

Заметка может быть из нескольких строк.

Можно определить заметку для класса, заданного последним, с помощью note left, note right, note top, note bottom.

@startuml

class Foo
note left: On last defined class

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

note as N1
  This note is <u>also</u>
  <b><color:royalBlue>on several</color>
  <s>words</s> lines
  And this is hosted by <img:sourceforge.jpg>
end note

@enduml

 

 

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

Возможно добавить заметку на связь, сразу после определения связи, используя note on link.

Вы также можете использовать note left on link, note right on link, note top on link, note bottom on link если вы хотите изменить относительную позицию заметки с надписью.

@startuml

class Dummy
Dummy --> Foo : A link
note on link #red: note that is red

Dummy --> Foo2 : Another link
note right on link #blue
	this is my note on right link
	and in blue
end note

@enduml

 

 

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

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

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

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

@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

@enduml

 

 

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

Если вы хотите использовать не буквенные символы в названии класса (или другого объекта), вы можете использовать 2 способа :

@startuml
class "This is my class" as class1
class class2 as "It works this way too"

class2 *-- "foo/dummy" : use
@enduml

 

 

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

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

Базовая команда это - hide empty members. Команда скроет атрибуты или методы, если они пусты.

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

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

Для определения большого набора, состоящего из правил и исключений, можно использовать несколько команд show/hide.

@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, чтобы скрывать классы.

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

@startuml

class Foo1
class Foo2

Foo2 *-- Foo1

hide Foo2

@enduml

 

 

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

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

@startuml

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

@enduml

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

 

 

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

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

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

@startuml

class System << (S,#FF7700) Singleton >>
class Date << (D,orchid) >>
@enduml

 

 

Пакеты

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

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

@startuml

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

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

@enduml

 

 

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

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

Можно задать стили по умолчанию с помощью команды: skinparam packageStyle, или применить шаблоны на пакет:

@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

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

@startuml

skinparam packageStyle rectangle

package foo1.foo2 {
}

package foo1.foo2.foo3 {
  class Object
}

foo1.foo2 +-- foo1.foo2.foo3

@enduml

 

 

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

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

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

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

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

@startuml

class BaseClass

namespace net.dummy #DDDDDD {
	.BaseClass <|-- Person
	Meeting o-- Person
	
	.BaseClass <|- Meeting
}

namespace net.foo {
  net.dummy.Person  <|- Person
  .BaseClass <|-- Person

  net.dummy.Meeting o-- Person
}

BaseClass <|-- net.unused.Person

@enduml

 

 

Автоматическое создание пространств имён

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

@startuml

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

@enduml

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

@startuml

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

@enduml

 

 

Lollipop интерфейс

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

@startuml
class foo
bar ()- foo
@enduml

 

 

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

По умолчанию, связи между классами имеют два тире --и вертикально ориентированны. Возможно создать горизонтальную связь, используя одно тире (or dot) вот так:

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

Вы можете изменить направление перевернув связь:

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

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

@startuml
foo -left-> dummyLeft 
foo -right-> dummyRight 
foo -up-> dummyUp 
foo -down-> dummyDown
@enduml

Вы можете укоротить запись, используя только первую букву направления (например, -d- вместо -down-) или две первые буквы (-do-).

Заметьте, что вам не стоит пользоваться этой функциональностью без особой надобности: Graphviz обычно предоставляет хорошие результаты без дополнительной настройки.

 

 

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

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

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

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

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

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

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

 

 

Skinparam

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

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

@startuml

skinparam class {
	BackgroundColor PaleGreen
	ArrowColor SeaGreen
	BorderColor SpringGreen
}
skinparam stereotypeCBackgroundColor YellowGreen

Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

@enduml

 

 

Шаблоны со Skinparam

Вы можете задать цвет или шрифт для шаблонов классов.

@startuml

skinparam class {
	BackgroundColor PaleGreen
	ArrowColor SeaGreen
	BorderColor SpringGreen
	BackgroundColor<<Foo>> Wheat
	BorderColor<<Foo>> Tomato
}
skinparam stereotypeCBackgroundColor YellowGreen
skinparam stereotypeCBackgroundColor<< Foo >> DimGray

Class01 <<Foo>>
Class03 <<Foo>>
Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

@enduml

 

 

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

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

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

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

в зависимости от направления градиента

Например так :

@startuml

skinparam backgroundcolor AntiqueWhite/Gold
skinparam classBackgroundColor Wheat|CornflowerBlue

class Foo #red-green
note left of Foo #blue\9932CC
  this is my
  note on this class
end note

package example #GreenYellow/LightGoldenRodYellow {
  class Dummy
}

@enduml

 

 

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

Sometimes, the default layout is not perfect...

You can use together keyword to group some classes together : the layout engine will try to group them (as if they were in the same package).

You can also use hidden links to force the layout.

@startuml

class Bar1
class Bar2
together {
  class Together1
  class Together2
  class Together3
}
Together1 - Together2
Together2 - Together3
Together2 -[hidden]--> Bar1
Bar1 -[hidden]> Bar2


@enduml

 

 

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

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

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

hpages - это задание числа горизонтальных страниц, и vpages - это задание числа вертикальных страниц..

Здесь также можно использовать специфику skinparam настроек как цвета разделённых страниц, так и их границы (смотри пример).

@startuml
' Split into 4 pages
page 2x2
skinparam pageMargin 10
skinparam pageExternalColor gray
skinparam pageBorderColor black

class BaseClass

namespace net.dummy #DDDDDD {
	.BaseClass <|-- Person
	Meeting o-- Person
	
	.BaseClass <|- Meeting

}

namespace net.foo {
  net.dummy.Person  <|- Person
  .BaseClass <|-- Person

  net.dummy.Meeting o-- Person
}

BaseClass <|-- net.unused.Person
@enduml