PlantUMLで状態マシン図を描く
状態マシン図の例_
- Fig10.1.puml(テキストファイル)
' マーチン・ファウラー著 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
内部アクティビティ_
- InternalActivity.puml(テキストファイル)
' マーチン・ファウラー著 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
自己遷移と比較してみる。
- SelfTransition.puml(テキストファイル)
@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
アクティビティ状態_
- ActivityState.puml(テキストファイル)
' マーチン・ファウラー著 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
スーパー状態_
- SuperState.puml(テキストファイル)
' マーチン・ファウラー著 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
スーパー状態を使わない場合。
- WithoutSuperState.puml(テキストファイル)
@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
並行状態_
- Parallel.puml(テキストファイル)
' マーチン・ファウラー著 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