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