完全なステップバイステップ教程:状態機械図の作成方法(初心者向け)

UML状態図 は、イベントへの応答としてシステムが異なる状態間をどのように遷移するかを示すことによって、システムの動的挙動をモデル化する強力な視覚的ツールです。オブジェクトやプロセスのライフサイクルを捉え、それが なる可能性がある であるか、何が変化を引き起こすか、そして状態変化中に何が起こるかを示すものであり、交通信号、自動販売機、ログインワークフロー、またはゲームキャラクターのような複雑なシステムを理解するのに最適です。状態(例:「赤」、「支払いを待機中」、「ジャンプ中」)、遷移(例:「タイマーが期限切れ」や「ボタンが押された」などのイベントによって駆動)、および条件(ガード)に注目することで、状態図は明確さを提供し、論理的な抜けを防ぎ、設計とコードの基礎となります。初心者としてシステムモデリングを学ぶ人、あるいは堅牢なソフトウェアを開発する開発者にとって、状態図を習得することは、システムの挙動を正確かつ明確に考え、設計し、伝える能力を身につけることを可能にします。

State Machines for Everyone — Part 1 Introduction | by Alex Dodge | Well  Red | Medium

💡 目的:状態機械を用いて現実世界のシステムをモデル化する方法を学ぶ——アイデアから洗練され、プロフェッショナルな外観の図まで。

🔑 まず理解しておくべき重要な概念

概念 意味するところ なぜ重要なのか
状態 システムが处于する状態や状況(例: コインを待機中) いつでも何が起こっているかを示す
イベント 変化を引き起こすもの(例: コインを投入タイマーが期限切れ) 状態間の移動を引き起こす
遷移 一つの状態から別の状態への矢印 イベントを通じて状態をリンクする
初期状態 開始点 (●) 必ず1つある
最終状態 プロセスの終了 (○) オプション — 必ずしも必要ではない
ガード [条件] 遷移が起こるためには真でなければならない条件 論理を追加する (例: お金が十分か?)
アクション / エントリ / 実行 状態に入ったり、途中で、または退出するときに起こること 状態に振る舞いを追加する

📌 考える:
「このシステムは X 状態にあることができる。
もし Y が起こると、 へ移動するZ.”
それが状態機械だ!


🛠 ステップ 0 – マインドセット:以下の質問を投げかける

何かを描く前に:

  • どのような 明確に異なる状況 この物事があり得るのか?

  • どのような イベント(ユーザーの操作、時間、エラー)が変化を引き起こすのか?

  • 同時に2つの状態になれるか?(いいえ → 基本的な状態機械は排他的である。)

👉 例:A電灯のスイッチはどちらか一方の状態であるONまたはOFF両方ではない。


🧩 ステップ1 – モデル化する一つの具体的なものを選ぶ

✅ 初心者向けの良い選択肢:

  • 回転式扉(ロック/ロック解除)

  • 信号機(赤/緑/黄)

  • 自動販売機

  • ログインシステム

  • 注文状態:作成済み → 支払い済み → 発送済み → 配送完了

❌ 避けるべきこと:

  • 「オンラインショップ全体」→ 過度に大きい

  • 「ユーザー体験」→ 過度に曖昧

✏️ シンプルに始めよう。まずは小さな例をマスターしよう。


📌 ステップ2 – 状態をリスト化する(名詞または現在分詞を使用)

書き出す4~8つの現実的な状態.

使用する形容詞または現在分詞状態のように見えるようにする:

  • 黄色

  • コインを待機中

  • 商品を発行中

  • 準備中

  • 支払いに失敗しました

✅ ヒント:10個以上の状態がある場合 → システムをより小さな部分に分割してください。


🖌 ステップ3 – 状態を角丸長方形で描く

使用する角丸長方形:

[ 赤 ]
[ 緑 ]
[ コインを待機中 ]

✅ ツール:

  • draw.io / diagrams.net(最良の無料選択)

  • Excalidraw(手描き風)

  • PlantUML(テキストベース → バージョン管理が簡単)

  • Lucidchart / Miro


🔷 ステップ4 – 初期状態を追加(黒い点)

描く塗りつぶされた黒い円矢印を最初の状態に向かって描く。

[*] --> 赤

この[*]は「初期状態」を意味します — これがスタート地点です。


➡️ ステップ5 – イベント付きの遷移を描く

各状態について、次のように尋ねる:

「ここですることで、この状態から脱出できるのは何ですか?」

矢印に次のようにラベルを付ける:

イベント [ガード] / アクション

🔹 単純に始めましょう:ただ イベント または イベント / アクション

一般的なイベント:

  • コインを投入

  • タイマーが期限切れ

  • 支払いに失敗

  • ボタンが押された

  • pedButton

  • タイムアウト


✅ ステップ6 – 最終状態の追加(オプション)

次のように使用する 太い枠線の円 を最終状態に使用する。

[配信済み] --> [●]

すべてのシステムに最終状態があるわけではない(例:永遠に動作し続ける信号機など)。


🔁 ステップ7 – 実際的な例外ケースの追加

尋ねる:

  • キャンセルできますか? → 追加 キャンセル → 戻る アイドル

  • 時間は切れますか? → タイムアウト → 戻る 待機中

  • 失敗する可能性がありますか? → 追加 エラー → スタートに戻る

  • 同じ状態にとどまることができますか? →自己遷移

例:自己遷移(追加のお金の投入):

[クレジットあり] -- コイン投入 --> [クレジットあり]

🚦 ステップ8 – スマートな論理にガードを使用する

あるとき同じイベントが引き起こすのは異なる結果、使用するガード.

例:

もし押すならpedButtonの間に、しかしまだ需要がない → あなたは進入する歩行者待機中の緑.

しかし需要がすでに設定されているなら → それは無視するだけです。

[車両緑] --> [車両緑] : pedButton / demandの設定 = true

これはアクション付きの自己遷移—— 新しい状態ではありません。


🎯 ステップ 9 – エントリ/ドゥ/エグジットアクションの追加(オプションだが強力)

アクションを記述できます状態ボックス内に:

[赤]
エントリ / 赤をONにする
エグジット / 赤をOFFにする
ドゥ / 30秒待機する

遷移を煩雑にすることなく、動作を明確にします。


✅ ステップ 10 – 最終チェックリスト(自分に尋ねてください)

✅ チェック なぜ重要なのか
初期状態が1つですか? どこかから始まる必要がある
すべての状態に外出り矢印がありますか(最終状態を除く)? 死胡同がない
到達できない状態がないですか? すべての状態に到達できるべきです
遷移がイベントでラベル付けされていますか? 明確な因果関係
矢印は「Xへ行く」とは言いません。矢印は方向を示します すっきりした
キャンセル/タイムアウト/エラー経路が含まれていますか? 現実のシステムは失敗する — その対策を講じてください
図が画面に収まっていますか? すっきりとしていて読みやすい

📋 クイックリファレンス:PlantUML構文(UML標準)

記号 意味
[*] 初期状態
[*] --> 状態 この状態から開始
状態 --> 状態 遷移
イベント [ガード] / アクション 矢印のラベル
状態 "名前" 名前付き状態(オプション)
状態 "X" として X 複雑な名前の別名
状態の右側にメモ コメントボックス

🎯 例1:シンプルな信号機(3状態サイクル)

初心者に最適です。

🧠 実際の用途:

  • 基本的な信号機のサイクル:赤 → 緑 → 黄色 → 赤

✅ 状態:

  • 黄色

🔄 イベント:

  • タイマーが期限切れ(30秒後、25秒後、5秒後)

🛠 PlantUML コード(コピー&ペースト可能):

@startuml
skinparam monochrome true
[*] --> 赤
赤 --> 緑 : 30秒後nタイマーが期限切れ
緑 --> 黄色 : 25秒後nタイマーが期限切れ
黄色 --> 赤   : 5秒後nタイマーが期限切れ

赤   : エントリ / 赤を点灯
緑 : エントリ / 緑を点灯
黄色: エントリ / 黄色を点灯

赤の右側にメモ
  車両は停止する必要あり
end note

緑の右側にメモ
  車両は進んでもよい
end note

黄色の右側にメモ
  停止の準備をせよ
end note
@enduml

✅ 使い方:
以下のサイトへ移動してhttps://www.plantuml.com/plantuml、コードを貼り付け、「生成」を押してください。

🖼️ 出力:洗練され、アニメーション風の状態機械図。


🎯 例2:歩行者による要求を考慮した現実的な信号機

その 最も教育的なバージョン — ガード、自己遷移、複雑な論理を導入。

🧠 実世界での利用:

  • 歩行者は渡るためボタンを押す。

  • 誰かが待っている場合、信号は長く待つ。

  • 緑色が終了後、黄色 → 赤 → 歩行可 → 警告の点滅 → 再び緑色へ。

📌 主要な状態:

  1. 車両緑色_需要なし – 緑色、歩行者が待機中でない

  2. 車両緑色_歩行者待機中 – 緑色、誰かがボタンを押した

  3. 車両黄色 – 黄色信号(歩行不可)

  4. 全赤色 – 安全バッファ(非常に短い)

  5. 歩行可 – 歩行可表示

  6. 歩行クリアランス – 点滅する「渡らないで」(クリアランス時間)


🧩 主要な遷移:

  • 歩行者ボタン → 待機中でない場合 → 需要を設定

  • タイマーが期限切れ → 黄色へ移行(緑色時間に達した場合)

  • 歩行者ボタン – 黄色/赤色の間 → 需要を記憶

  • タイマー歩行 → フラッシュする「歩行禁止」に移行

  • クリアランスタイマー → リセットして緑に復帰

🚨 注意:このバージョンはガードとセルフ遷移を使用、次のように示すステートマシンが強力な理由.


✅ PlantUMLコード(完全に動作し、すぐに使用可能):

@startuml
skinparam monochrome true
skinparam shadowing false
skinparam dpi 120

[*] --> VehicleGreen_NoDemand

state "車両緑n(歩行者要求なし)" as VG_No
state "車両緑n(歩行者待機中)" as VG_Wait
state "車両黄色" as VYellow
state "全赤n(安全バッファ)" as AllRed
state "歩行者歩行" as PedWalk
state "歩行者クリアランスn(点滅する「歩行禁止」)" as PedClear

VG_No --> VG_Wait : pedButton / setPedDemand = true
VG_No --> VYellow : after(35s)nor (pedDemand && minGreenTimeMet)
VG_Wait --> VYellow : after(45s)n歩行者待機中は緑色を延長
VG_Wait --> VG_Wait : pedButton / 無視(すでに待機中)
VYellow --> AllRed : after(4s)
AllRed --> PedWalk : after(1s)
PedWalk --> PedClear : after(10s)n歩行時間終了
PedClear --> VG_No : after(5s)nクリアランス完了n/ resetPedDemand

note bottom of VG_No
  通常動作
  歩行者要求なし
end note

note right of PedClear
  歩行者が渡り終了
  フラッシュする「歩行禁止」表示
end note

note right of VG_Wait
  歩行者がボタンを押下
  緑色が最大10秒延長
end note

note right of VYellow
  停止準備
  車両信号が変化
end note

note right of PedWalk
  歩行者歩行表示が点灯
  歩行者が渡れる
end note
@enduml

💡 なぜこのバージョンの方がシンプルなバージョンより優れているのか?

  • 次を示す現実世界の複雑さ

  • 次を示すガード (pedDemandがtrueの場合)

  • 次を使用セルフ遷移 (VG_Wait --> VG_Wait)

  • 次をモデル化現実の動作:緑色を延長可能!

  • 次を明確に分離車両 と 歩行者 論理


🎓 推奨される演習問題(順番に実施してください)

# 時間 習得したスキル
1 電灯スイッチ(オン ↔ オフ) 5分 基本的な遷移
2 回転式ゲート(ロック済 ↔ ロック解除) 10分 イベント、ガード
3 信号機(3状態サイクル) 10分 タイマー、エントリーアクション
4 自動販売機(待機 → 支払い → 出荷) 15分 複数のイベント、お金のロジック
5 ログイン(空 → 入力中 → 提出 → 成功/失敗) 15分 エラー処理、最終状態
6 注文状態(6状態) 20分 現実のシステムモデリング

✅ まず紙またはdraw.ioで#1~3から始めましょう。その後、PlantUML残りの部分に使用します。


🧠 成功のための最終アドバイス

  • 小さな規模から始める— 一度にすべてを含めようとしないでください。

  • 実際の名前を使用する — コインの待機中、ではなくState1.

  • 遷移を明確にラベルする — ボタンが押されたタイムアウト支払い失敗.

  • まず手で描く— その後デジタル化する。

  • 心の中で検証する:「このシステムは詰まる可能性があるか?」→ はいの場合、遷移を追加する。


📌 まとめ:あなたの状態機械チェックリスト

✅ 1つ[*](初期状態)
✅ 状態のための丸みを帯びた長方形
✅ 遷移のための矢印
✅ 矢印上のイベント(30秒後(after(30s))歩行者ボタン(pedButton))
✅ 必要な場所にガードを設置([歩行者要求(pedDemand)])
✅ 繰り返しのアクションのための自己遷移
✅ 挙動のための入力/出力アクション
✅ 整然としたレイアウト、読みやすいフォント


🎯 最後の言葉:あなたはもう準備ができています!

あなたは今ちょうど学んだこと:

  • 何であるか 状態機械図 である

  • どのようにして 状態とイベントの観点で考える方法

  • どのようにして 描く そして 読む プロのようにそれらを読む方法

  • どのようにして 現実のシステムをモデル化する方法、たとえば信号機のように

  • どのようにして PlantUMLを使用する方法きれいで保守しやすい図を書く

🎉 UMLを学んでいるだけではなく、現実のシステムをモデル化する方法を学んでいる一つずつ状態を確認しながら。


📌 次のステップ(あなたの学習経路)

  1. 手で3状態の信号機を描く— ツールは不要、紙だけで。

  2. PlantUMLを試してみる上記のコードを使って—描画される様子を見てみましょう。

  3. 変更する:待機時間を変更する。『緊急オーバーライド』状態を追加する。

  4. 自動販売機を試してみる→ 同じ論理だが、お金の扱いがある。

  5. 自分だけの図を描く:ゲームキャラクター(歩行 → 跳躍 → 攻撃 → 死亡)。

💬 助けが必要?次のように試してみてください:「私は~をモデル化しようとしています。[あなたのシステム]— 状態機械を作ってくれませんか?」


🙌 最後の考え

🔄 変化するすべてのもの—電球、ログイン、注文など—は状態機械でモデル化できる。
プログラマーでなくても理解できる。ただ、次のように尋ねればよい。「この物がどのような状態にあり得るのか、そして何がその変化を引き起こすのか?」と尋ねる。


✅ 今や、初心者から自信を持ってモデル化できるプロフェッショナルな状態機械図の作成方法を知っている。

🎉 図を描きましょう!
印刷可能なPDF版、クイズ、またはスキルをテストするためのコーディングチャレンジが欲しい場合は教えてください。


コメントを残す