О PlantUML

2020-10-26

Давным-давно я уже писал про PlantUML. Это совершенно шикарный инструмент для описания диаграмм текстом. В первую очередь UML диаграмм, но не только.

С тех пор ничего не изменилось. PlantUML остаётся моим основным инструментом создания диаграмм. Чаще всего в виде онлайн редактора planttext.com.

Вот некоторые хитрости использования PlantUML.

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

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

' вот так
component A
actor B

' а не так
[C]
:D:

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

component A
component B
component C
component D

диаграмма

Я сначала накидываю компоненты, а потом рисую связи. Порядок объявления компонент почти не влияет на порядок их расположения. А вот порядок объявления связей — влияет.

Стрелка с одним «минусом» (->, .>, ~>, =>) всегда старается нарисовать связь слева направо. И расположить компоненты соответствующим образом, в одном ряду.

component A
component B

A -> B

диаграмма

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

component A
component B
component C

A -> B
A -> C

диаграмма

Хоть в PlantUML и есть возможность указать направление стрелок, лучше на них не полагаться. Это лишь рекомендации. Лучше полагаться на изложенные здесь правила.

Поэтому, если нужна стрелка справа налево, поставьте компоненты в связи в соответствующем порядке

component A
component B
component C

A -> B
C <- A

диаграмма

Стрелка с двумя «минусами» (-->, ..>, ~~>, ==>) рисует вертикальную связь, сверху вниз, на один ряд вниз.

component A
component B

A --> B

диаграмма

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

component A
component B

A --> B
A <-- B

диаграмма

Стрелка с тремя «минусами» (--->, ...>, ~~~>, ===>) рисует вертикальную связь на два ряда вниз. Чем больше «минусов» тем на большее число рядов вниз.

component A
component B
component C
component D

A --> B
A ---> C
A ----> D

диаграмма

Поиграть с длиной стрелок, бывает, помогает, чтобы навести порядок на диаграмме. Или добавить беспорядок.

component A
component B
component C
component D

A --> B
B --> C
C --> D
A ---> C 
B ---> D
A ----> D

диаграмма

Для борьбы с беспорядком лучше объединить компоненты в группы. Все эти cloud, folder, frame, node, package, rectangle специально созданы, чтобы быть контейнером (смысловым) для других элементов. Хотя контейнером на диаграмме развёртывания может быть всё что угодно. Прекрасно, что контейнеры могут быть анонимными.

cloud {
    component A
    component B
    A -> B
}
node {
    component C
    component D
    C -> D
}

A --> C
B --> D

диаграмма

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

PlantUML по умолчанию генерирует картинки, пригодные для веба. Но для презентаций хочется картинку побольше/почётче. Достаточно добавить scale 2 в начало диаграммы. Или же взять изображение в SVG.

scale 2

component A
component B

A -> B

диаграмма

PlantUML написан на Java, а для генерации изображений по графам использует Graphviz. Не самый удобный стек, чтобы тащить его повсюду.

Но в PlantUML, в стандартном сервлете, очень интересно используются URL. Фактически в URL закодирован сам исходный текст диаграммы. Поэтому URL картинки с planttext.com вполне можно вставить в соответствующее поле на http://www.plantuml.com/plantuml/, и увидеть исходный текст.

Поэтому, если у вас уже есть где-то работающий PlantUML сервлет, легко добавить поддержку PlantUML диаграмм в любой вики-движок (или что там у вас). Например, в Redmine. Главное, правильно закодировать URL картинки.

Если хочется чего-то попроще и без Java, то есть альтернативная описывалка диаграмм на Python: diagrams.mingrammer.com.

Или на JavaScript (для встраивания в веб страницы): mermaid.

Но обе альтернативы всё же менее функциональны, чем PlantUML.

А очень продвинутый уровень использования PlantUML позволяет добавлять красивые иконки и делать диаграммы, непохожие на дефолтный PlantUML. Примеры и туториалы смотрите на The Hitchhiker’s Guide to PlantUML.

Спасибо Илье за ссылки.