PlantUMLで状態マシン図を描く

状態マシン図の例_

' マーチン・ファウラー著 UMLモデリングのエッセンス 第3版 図10.1
@startuml{Fig10.1.png}
title 簡単な状態マシン図

' [*] が開始状態 or 終了状態を表す
' [*] が含まれているとPlantUMLが状態マシン図と判断する
[*] --> Wait

' PlantUMLの状態マシン図記法で遷移を書く場合は
' かならず --> の方向に遷移を書かなければならない。
Wait -right-> Lock : candle removed [door closed] / reveal lock
Lock -up-> Open : key turned [candle in] / open safe
Open --> Wait : safe closed
Lock --> [*] : key turned [candle out] / release killer rabbit
' [*] <-- Lock は記法として許されていない!

note right of Open
     PlantUMLでは状態を
     単なる角丸四角で表記できない。
end note
@enduml

内部アクティビティ_

' マーチン・ファウラー著 UMLモデリングのエッセンス 第3版 図10.2
@startuml{InternalActivity.png}
title 内部アクティビティ

' [*] が開始状態 or 終了状態を表す
' [*] が含まれているとPlantUMLが状態マシン図と判断する
' このため、本来の図10.2では開始状態と終了状態は含まれていないが追加している
[*] -> Typing
Typing -> [*]

' 状態の内部アクティビティ
Typing: entry / highlight all
Typing: exit / update field
Typing: character / handled character
Typing: help [verbose] / open help page
Typing: help [quit] / update status bar

note top of Typing
     entry と exit は特殊なアクティビティ。
     entryは、その状態に遷移したときに必ず実行されるアクティビティ。
     exitは、その状態から遷移するときに必ず実行されるアクティビティ。
     内部アクティビティと自己遷移の差は、entryとexitが毎回実行されるかどうか。
     内部アクティビティではentryとexitは毎回は実行されない。
end note

@enduml

自己遷移と比較してみる。

@startuml{SelfTransition.png}
title 自己遷移

' [*] が開始状態 or 終了状態を表す
' [*] が含まれているとPlantUMLが状態マシン図と判断する
[*] -> Typing
Typing --> [*]
Typing -> Typing : character / handled character\nhelp [verbose] / open help page\nhelp [quit] / update status bar

' 状態の内部アクティビティ
Typing: entry / highlight all
Typing: exit / update field

note top of Typing
     この場合、自己遷移が発生する度にentry と exitが実行される。
end note

@enduml

アクティビティ状態_

' マーチン・ファウラー著 UMLモデリングのエッセンス 第3版 図10.3
@startuml{ActivityState.png}
title アクティビティを伴う状態

' 長い状態名の場合
state "ハードウェアの\n更新ウィンドウ" as UW
state "新しいハードウェアの\n表示ウィンドウ" as NH

' [*] が開始状態 or 終了状態を表す
' [*] が含まれているとPlantUMLが状態マシン図と判断する
' このため、本来の図10.3では開始状態と終了状態は含まれていないが追加している
[*] -> UW
UW -right-> Searching : search
Searching --> UW : cancel
Searching --> NH
NH --> [*]

' 状態の内部アクティビティ
Searching: do / search for new hardware

@enduml

スーパー状態_

' マーチン・ファウラー著 UMLモデリングのエッセンス 第3版 図10.4
@startuml{SuperState.png}
title スーパー状態とその下のサブ状態

' 長い状態名の場合
state "Show Connections" as SC
state "Enter Connection Details" as ECD {
      state "Enter Phone\n Number" as EPN
      state "Choose Shared\n or Solo" as CSS
      state "Enter Name" as EN
      [*] -right-> EPN
      EPN -right-> CSS : next
      CSS -left-> EPN : back
      CSS -right-> EN : next
      EN -left-> CSS : back
      EN --> SC : save
}

SC -down-> ECD : new
ECD -up-> SC : cancel
SC -> [*]
@enduml

スーパー状態を使わない場合。

@startuml{WithoutSuperState.png}
title スーパー状態が無い場合

' 長い状態名の場合
state "Show Connections" as SC
state "Enter Phone\n Number" as EPN
state "Choose Shared\n or Solo" as CSS
state "Enter Name" as EN

[*] -> SC
SC -> [*]
SC -down-> EPN : new
EPN -up-> SC : cancel
CSS -up-> SC : cancel
EN -up-> SC : cancel

EPN -right-> CSS : next
CSS -left-> EPN : back
CSS -right-> EN : next
EN -left-> CSS : back
EN --up> SC : save

@enduml

並行状態_

' マーチン・ファウラー著 UMLモデリングのエッセンス 第3版 図10.5
@startuml{Parallel.png}
title 並行直交状態

state On {
      state "Display Current\n Time" as DCT
      state "Display Alarm\n Time" as DAT
      [*] --> DCT
      [*] --> DCT : time
      [*] --> DAT : alarm
      --
      state "Playing Radio" as PR
      state "Playing CD" as PCD
      [*] --> PR : <<history pesudostate>>
      [*] --> PR : Radio
      [*] --> PCD : CD
}

state Off

On --> Off : off
Off --> On : on 

note bottom of On
     PlantUMLには履歴擬似状態(history pesudostate)が容易されていない。
     このため、この例ではステレオタイプでそれを表現した。
     また、PlantUMLではサブ状態にスーパー状態から直接遷移できないので
     開始状態からトリガーイベントを変えて遷移させている。
end note

@enduml

戻る_