コンテンツにスキップ

ステートマシン(状態機械)入門

原文

A state machine is a model where computation is expressed as a set of discrete states and deterministic transitions between them. At any point in time, the system is in exactly one state. All...

この記事では以下について話します: - 状態機械の重要性 - HTTPサーバーとしての状態機械 - それらを設計するためのベストプラクティス - すべてが別の状態である方法 - メンタルモデル

要約

ステートマシン(有限状態機械)とは、「離散的な状態の集合」と「状態間の遷移」でシステムの振る舞いを記述するモデル。任意の時点でシステムは必ず1つの状態にある。HTTPサーバー、注文フロー、接続管理など、実用システムの多くがステートマシンとして表現できる。

解説

ステートマシンの基本要素

要素 説明
状態 (State) システムが取り得る離散的な条件(例: IDLE, RUNNING, ERROR)
遷移 (Transition) ある状態から別の状態への変化
イベント/トリガー 遷移を引き起こす入力
初期状態 システム起動時の状態
終了状態 処理が完了した状態

HTTPサーバーをステートマシンで考える

IDLE → [リクエスト受信] → READING_REQUEST
READING_REQUEST → [ヘッダー解析完了] → PROCESSING
PROCESSING → [レスポンス生成] → SENDING_RESPONSE
SENDING_RESPONSE → [送信完了] → IDLE
SENDING_RESPONSE → [エラー] → ERROR

実用例

システム 状態の例
注文管理 未払い → 支払い済み → 発送済み → 受取完了 → キャンセル
TCP接続 CLOSED → SYN_SENT → ESTABLISHED → FIN_WAIT → CLOSED
ユーザー認証 未認証 → 認証中 → 認証済み → セッション失効
バックグラウンドジョブ PENDING → RUNNING → COMPLETED / FAILED / RETRYING

ベストプラクティス

  • 明示的に状態を定義する: 暗黙の状態(フラグの組み合わせ等)はバグの温床
  • 不正な状態遷移をガードする: 「COMPLETED → RUNNING」のような遷移を型/コードで禁止
  • 状態図を先に書く: コードの前に図を描くと設計の抜け漏れが見える
  • Goでの実装例: type State int + const (IDLE State = iota; RUNNING; ...) + switch文

→ 関連: データ不整合10パターンバッチ処理解説

リンク