アクティビティ図(ベータ版)

アクティビティ図の古い構文には、メンテナンスが難しいなど、いくつかの制限と欠点がありました。

そのため、書式や構文をよりよく定義できるように、ベータ版として全く新しい構文と実装が提案されています(V7947 以降)。

この新しい実装には、(シーケンス図と同様に)Graphvizパッケージのインストールを必要としないという利点もあります。

将来的に古い構文は新しい構文に置換されるでしょう。しかし、上位互換性が確保され、古い構文もそのまま認識可能となる予定です。

新しい構文へ移行することが強く推奨されています。

単純なアクティビティ

アクティビティのラベルは:で開始し;で終了します。

テキストの書式設定は、Creole記法のWiki構文を使用して行うことができます。

それらは定義順に暗黙的にリンクされます。

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

開始/終了

図の開始と終了を示すために、キーワードstartstopを使用できます。

@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

条件文

図に条件分岐を追加したい場合は、キーワードifthenそしてelseを使用することができます。ラベルは括弧を使用することで与えることができます。

3種類の構文を使うことができます。
  • if (...) then (...)

@startuml

start

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

stop

@enduml

  • if (...) is (...) then

@startuml
if (color?) is (<color:red>red) then
:print red;
else 
:print not red;
@enduml

  • if (...) equals (...) then

@startuml
if (counter?) equals (5) then
:print 5;
else 
:print not 5;
@enduml

[Ref. QA-301]

複数条件(水平モード)

いくつもの条件分岐がある場合には、キーワード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

アクションの停止を伴う条件文 [kill, detach]

if 節内でアクションを停止できます。

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

ただし、明確なアクションで停止したい場合は、キーワード「kill」または「detach」を使用できます:

  • 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

WARNING
 This translation need to be updated. 
WARNING

繰り返し(後判定)

繰り返し処理(後判定)がある場合には、キーワードrepeatrepeat whileを使用できます。

@startuml

start

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

stop

@enduml

アクティビティをrepeatの戻り先にすることもできます。また、backwardキーワードを使用して、戻りのパスにアクティビティを挿入することもできます。

@startuml

start

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

stop

@enduml

repeat 節を中断する [break]

ループ内でアクションを中断することができます。

@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 "Sucess";
stop
@enduml

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

繰り返し(前判定)

繰り返し処理(前判定)がある場合には、キーワードwhileend 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

並列処理

並列処理を示すために、キーワードforkfork 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

splitsplit againend splitキーワードを使って、プロセスの分岐を表すことができます。

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

入力の分岐(複数開始)

入力の分岐を表現するには、hiddenで矢印を隠します。

@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]

出力の分岐(複数終了)

出力の分岐を表現するには、killまたはdetachを使用します。

@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表記のWiki構文を使用することで、テキストの書式設定ができます。

キーワード 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

戻り方向(backward)のアクティビティに注釈をつけることもできます。

@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

矢印

記号->を用いて、矢印にテキストを添えることができ、また、色を変えることもできます。

点線、破線、太線、または、矢印なし、もまた可能です。

@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;
endif
-[#gray,bold]->
:foo5;
@enduml

コネクタ

半角括弧を使用して、コネクタを記述することができます。

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

コネクタの色

コネクタにを設定することができます。

@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]

グループ化(パーティション)

partitionを定義して、複数のアクティビティをグループ化できます:

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

stop
@enduml

[Ref. QA-2793][Ref. QA-542]

WARNING
 This translation need to be updated. 
WARNING

スイムレーン

パイプ記号|を用いて、複数のスイムレーンを定義することができます。

さらに、スイムレーン毎にを変えることができます。

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

スイムレーンの中で、if条件文やrepeatwhileのループを使用できます。

@startuml
|#pink|Actor_For_red|
start
if (color?) is (red) then
#pink:**action red**;
:foo1;
else (not red)
|#lightgray|Actor_For_no_red|
#lightgray:**action not red**;
:foo2;
endif
|Next_Actor|
#lightblue:foo3;
:foo4;
|Final_Actor|
#palegreen:foo5;
stop
@enduml

[Ref. QA-2681]

WARNING
 This translation need to be updated. 
WARNING

矢印の除去(detach, kill)

キーワードdetachまたはkillを使用して、矢印を取り除くことができます。

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

  • kill

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

SDL図

終端記号;を置き換えることで、アクティビティの表現形式を変えることができます:
  • |
  • <
  • >
  • /
  • \\
  • ]
  • }

@startuml
:Ready;
:next(o)|
:Receiving;
split
 :nak(i)<
 :ack(o)>
split again
 :ack(i)<
 :next(o)
 on several lines|
 :i := i + 1]
 :ack(o)>
split again
 :err(i)<
 :nak(o)>
split again
 :foo/
split again
 :bar\\
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

条件のスタイル

insideスタイル(デフォルト)

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

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

diamondスタイル

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

InsideDiamond (またはfoo1)スタイル

@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]

条件終了のスタイル

diamondスタイル(デフォルト)

  • 分岐が1つの場合

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

  • 分岐が2つ(B1, B2)の場合

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

水平ライン(hline)スタイル

  • 分岐が1つの場合

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

  • 分岐が2つ(B1, B2)の場合

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

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