Skip to content

状態マシン ― 新状態を追加したらどこが壊れる?

📖この章のキーワード
用語意味なぜ重要か
状態マシン「現在の状態」と「許可される遷移」を定義する設計パターン不正な状態変更を防ぐ
状態遷移ある状態から別の状態への変化Draft → Active → Paused → Archive
定数(Constant)変更されない固定値タイプミスや不正な値を防ぐ
マジックナンバーコード中に突然現れる意味不明な数値定数にすることで可読性が上がる

Phase 1: 観察

LIBOT のシナリオ(自動メッセージ配信フロー)は 4 つの状態を持ちます。

php
// Constant.php (excerpt)
// Label: exemplar

// シナリオの状態
const SCENARIO_STATUS_DRAFT   = 3702001;  // 下書き
const SCENARIO_STATUS_ACTIVE  = 3702002;  // 有効(実行中)
const SCENARIO_STATUS_PAUSED  = 3702003;  // 一時停止
const SCENARIO_STATUS_ARCHIVE = 3702004;  // アーカイブ
php
// Scenario.php
public function isActive(): bool
{
    return $this->status === Constant::SCENARIO_STATUS_ACTIVE;
}

状態遷移の想定フロー:

Draft → Active → Paused → Active(復帰可能)

                 Archive(終了)

Phase 2: 判断

AI禁止ゾーン

スケジュール待ち」(Scheduled)という 5 番目の状態を追加してほしい、と言われました。 Draft で作成し、指定日時に自動で Active になる状態です。

  • どこを変更する 必要がありますか? 全て挙げてください
  • 壊れる可能性がある 既存コードはどこですか?
  • 状態が文字列("active", "draft")ではなく数値定数なのは なぜ ですか?

AIに聞く前に、自分の頭で考えてみましょう。

テキストを入力すると有効になります