Диаграмма активности (бета)

Текущий синтаксис диаграммы активности имеет несколько ограничений и недостатков (например, её сложно поддерживать).

Таким образом, новый синтаксис и реализация предложены как бета версия пользователям (начиная с V7947), так что мы сможем определить новый формат и синтаксис.

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

Новый синтаксис заменит старый. Однако, по причине совместимости, старый синтаксис всё ещё будет распознаваться, чтобы обеспечивать восходящую совместимость.

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

Простая активность

Описания активностей начинаются с : и заканчиваются ;.

Форматировать текст возможно, используя синтаксис creole.

Активности косвенно связаны в порядке их определения.

@startuml
:Hello world;
:This is on defined on
several **lines**;
@enduml

Старт/Стоп

Вы можете использовать ключевые слова start и stop, чтобы обозначать начало и конец диаграммы.

@startuml
start
:Hello world;
:This is on defined on
several **lines**;
stop
@enduml

Вы также можете использовать ключевое слово end.

@startuml
start
:Hello world;
:This is on defined on
several **lines**;
end
@enduml

Условия

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

@startuml

start

if (Graphviz installed?) then (yes)
  :process all\ndiagrams;
else (no)
  :process only
  __sequence__ and __activity__ diagrams;
endif

stop

@enduml

Ряд проверок (горизонтальное отображение)

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

@startuml
start
if (condition A) then (yes)
  :Text 1;
elseif (condition B) then (yes)
  :Text 2;
  stop
elseif (condition C) then (yes)
  :Text 3;
elseif (condition D) then (yes)
  :Text 4;
else (nothing)
  :Text else;
endif
stop
@enduml

Ряд проверок (вертикальное отображение)

Используйте команду !pragma useVerticalIf on для отображения проверок в вертикальном режиме:

@startuml
!pragma useVerticalIf on
start
if (condition A) then (yes)
  :Text 1;
elseif (condition B) then (yes)
  :Text 2;
  stop
elseif (condition C) then (yes)
  :Text 3;
elseif (condition D) then (yes)
  :Text 4;
else (nothing)
  :Text else;
endif
stop
@enduml

[Ref. QA-3931]

Switch and case [switch, case, endswitch]

You can use switch, case and endswitch keywords to put switch in your diagram.

Labels can be provided using parentheses.

@startuml
start
switch (test?)
case ( condition A )
  :Text 1;
case ( condition B ) 
  :Text 2;
case ( condition C )
  :Text 3;
case ( condition D )
  :Text 4;
case ( condition E )
  :Text 5;
endswitch
stop
@enduml

Conditional with stop on an action [kill, detach]

You can stop action on a if loop.

@startuml
if (condition?) then
  :error;
  stop
endif
#palegreen:action;
@enduml

But if you want to stop at the precise action, you can use the kill or detach keyword:

  • kill

@startuml
if (condition?) then
  #pink:error;
  kill
endif
#palegreen:action;
@enduml

[Ref. QA-265]

  • detach

@startuml
if (condition?) then
  #pink:error;
  detach
endif
#palegreen:action;
@enduml

Повторяющийся цикл

Используйте ключевые слова repeat и repeatwhile для создания повторяющихся циклов.

@startuml

start

repeat
  :read data;
  :generate diagrams;
repeat while (more data?)

stop

@enduml

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

@startuml

start

repeat :foo as starting label;
  :read data;
  :generate diagrams;
backward:This is backward;
repeat while (more data?)

stop

@enduml

Break on a repeat loop [break]

You can break after an action on a loop.

@startuml
start
repeat
  :Test something;
    if (Something went wrong?) then (no)
      #palegreen:OK;
      break
    endif
    ->NOK;
    :Alert "Error with long text";
repeat while (Something went wrong with long text?) is (yes) not (no)
->//merged step//;
:Alert "Success";
stop
@enduml

[Ref. QA-6105]

Цикл while

Используйте ключевые слова while и end while для создания повторяющихся циклов.

@startuml

start

while (data available?)
  :read data;
  :generate diagrams;
endwhile

stop

@enduml

Добавить описание можно после ключевого слова endwhile или используя ключевое слово is.

@startuml
while (check filesize ?) is (not empty)
  :read file;
endwhile (empty)
:close file;
@enduml

Паралельная обработка

Используйте ключевые слова fork, fork again и end fork для определения параллельных процессов.

@startuml

start

if (multiprocessor?) then (yes)
  fork
    :Treatment 1;
  fork again
    :Treatment 2;
  end fork
else (monoproc)
  :Treatment 1;
  :Treatment 2;
endif

@enduml

WARNING
 This translation need to be updated. 
WARNING

Split processing

Split

You can use split, split again and end split keywords to denote split processing.

@startuml
start
split
   :A;
split again
   :B;
split again
   :C;
split again
   :a;
   :b;
end split
:D;
end
@enduml

Input split (multi-start)

You can use hidden arrows to make an input split (multi-start):

@startuml
split
   -[hidden]->
   :A;
split again
   -[hidden]->
   :B;
split again
   -[hidden]->
   :C;
end split
:D;
@enduml

@startuml
split
   -[hidden]->
   :A;
split again
   -[hidden]->
   :a;
   :b;
split again
   -[hidden]->
   (Z)
end split
:D;
@enduml

[Ref. QA-8662]

Output split (multi-end)

You can use kill or detach to make an output split (multi-end):

@startuml
start
split
   :A;
   kill
split again
   :B;
   detach
split again
   :C;
   kill
end split
@enduml

@startuml
start
split
   :A;
   kill
split again
   :b;
   :c;
   detach
split again
   (Z)
   detach
split again
   end
split again
   stop
end split
@enduml

Заметки

Форматирование текста может быть сделано с использованием синтаксиса creole.

Заметку можно сделать отсоединенной с помощью ключевого слова floating.

@startuml

start
:foo1;
floating note left: This is a note
:foo2;
note right
  This note is on several
  //lines// and can
  contain <b>HTML</b>
  ====
  * Calling the method ""foo()"" is prohibited
end note
stop

@enduml

Заметка также может быть добавлена к действию, входящему в обратный поток цикла.

@startuml
  start
    repeat :Enter data;
    :Submit;
    backward :Warning;
      note right: Note
    repeat while (Valid?) is (No) not (Yes)
  stop
@enduml

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

Цвета

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

@startuml

start
:starting progress;
#HotPink:reading configuration files
These files should edited at this point!;
#AAAAAA:ending of the process;

@enduml

Линии без стрелок

Используйте команду skinparam ArrowHeadColor none для соединения действий линиями без стрелок.

@startuml
  skinparam ArrowHeadColor none
  start
    :Hello world;
    :This is on defined on
     several **lines**;
  stop
@enduml

@startuml
  skinparam ArrowHeadColor none
  start
    repeat :Enter data;
    :Submit;
    backward :Warning;
    repeat while (Valid?) is (No) not (Yes)
  stop
@enduml

Стрелки

Используя нотацию ->, вы можете добавить текст к стрелке, aи поменять их цвет.

Так же можно сделать стрелки: из точек (dotted), из дефисов (dashed), жирные (bold) и скрытые (hidden).

@startuml
:foo1;
-> You can put text on arrows;
if (test) then
  -[#blue]->
  :foo2;
  -[#green,dashed]-> The text can
  also be on several lines
  and **very** long...;
  :foo3;
else
  -[#black,dotted]->
  :foo4;
  -[hidden]->
  :foo4a;
endif
-[#gray,bold]->
:foo5;
@enduml

Connector

You can use parentheses to denote connector.

@startuml
start
:Some activity;
(A)
detach
(A)
:Other activity;
@enduml

Color on connector

You can add color on connector.

@startuml
start
:The connector below
wishes he was blue;
#blue:(B)
:This next connector
feels that she would
be better off green;
#green:(G)
stop
@enduml

[Ref. QA-10077]

Группирование

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

@startuml
start
partition Initialization {
    :read config file;
    :init internal variable;
}
partition Running {
    :wait for user interaction;
    :print information;
}

stop
@enduml

*[Ref. [QA-2793](https://forum.plantuml.net/2793/activity-beta-partition-name-more-than-one-word-does-not-work?show=2798#a2798)]* *[Ref. [QA-542](https://forum.plantuml.net/542/ability-to-define-hyperlink-on-diagram-elements?show=14003#c14003)]*
WARNING
 This translation need to be updated. 
WARNING

Дорожки

Используя символ |, вы можете определять плавающие линии.

Также возможно изменять цвет плавающих линий.

@startuml
|Swimlane1|
start
:foo1;
|#AntiqueWhite|Swimlane2|
:foo2;
:foo3;
|Swimlane1|
:foo4;
|Swimlane2|
:foo5;
stop
@enduml

*[Ref. [QA-2681](https://forum.plantuml.net/2681/possible-define-alias-swimlane-place-alias-everywhere-else?show=2685#a2685)]*
WARNING
 This translation need to be updated. 
WARNING

Отсоединение

Возможно убрать стрелку используя ключевое слово detach.

@startuml
 :start;
 fork
   :foo1;
   :foo2;
 fork again
   :foo3;
   detach
 endfork
 if (foo4) then
   :foo5;
   detach
 endif
 :foo6;
 detach
 :foo7;
 stop
@enduml

SDL

Изменяя последний разделитель ;, вы можете установить различный рендеринг для активности:
  • |
  • <
  • >
  • /
  • ]
  • }

@startuml
:Ready;
:next(o)|
:Receiving;
split
 :nak(i)<
 :ack(o)>
split again
 :ack(i)<
 :next(o)
 on several line|
 :i := i + 1]
 :ack(o)>
split again
 :err(i)<
 :nak(o)>
split again
 :foo/
split again
 :i > 5}
stop
end split
:finish;
@enduml

Полноценный пример

@startuml

start
:ClickServlet.handleRequest();
:new page;
if (Page.onSecurityCheck) then (true)
  :Page.onInit();
  if (isForward?) then (no)
    :Process controls;
    if (continue processing?) then (no)
      stop
    endif

    if (isPost?) then (yes)
      :Page.onPost();
    else (no)
      :Page.onGet();
    endif
    :Page.onRender();
  endif
else (false)
endif

if (do redirect?) then (yes)
  :redirect process;
else
  if (do forward?) then (yes)
    :Forward request;
  else (no)
    :Render page template;
  endif
endif

stop

@enduml

Condition Style

Inside style (by default)

@startuml
skinparam conditionStyle inside
start
repeat
  :act1;
  :act2;
repeatwhile (<b>end)
:act3;
@enduml

@startuml
start
repeat
  :act1;
  :act2;
repeatwhile (<b>end)
:act3;
@enduml

Diamond style

@startuml
skinparam conditionStyle diamond
start
repeat
  :act1;
  :act2;
repeatwhile (<b>end)
:act3;
@enduml

InsideDiamond (or Foo1) style

@startuml
skinparam conditionStyle InsideDiamond
start
repeat
  :act1;
  :act2;
repeatwhile (<b>end)
:act3;
@enduml

@startuml
skinparam conditionStyle foo1
start
repeat
  :act1;
  :act2;
repeatwhile (<b>end)
:act3;
@enduml

[Ref. QA-1290 and #400]

Condition End Style

Diamond style (by default)

  • With one branch

@startuml
skinparam ConditionEndStyle diamond
:A;
if (decision) then (yes)
    :B1;
else (no)
endif
:C;
@enduml

  • With two branches (B1, B2)

@startuml
skinparam ConditionEndStyle diamond
:A;
if (decision) then (yes)
    :B1;
else (no)
    :B2;
endif
:C;
@enduml
@enduml

Horizontal line (hline) style

  • With one branch

@startuml
skinparam ConditionEndStyle hline
:A;
if (decision) then (yes)
    :B1;
else (no)
endif
:C;
@enduml

  • With two branches (B1, B2)

@startuml
skinparam ConditionEndStyle hline
:A;
if (decision) then (yes)
    :B1;
else (no)
    :B2;
endif
:C;
@enduml
@enduml

[Ref. QA-4015]