状態機械(State Machine)設計:30章詳細アウトライン
前提の開発環境(2026最新版・Windows)🪟✨
- Visual Studio 2026 + .NET 10 SDK + C# 14(想定)(Microsoft Learn)
- (補助)VS Code もOK(ただし基本はVisual Studioで進行)🛠️
- AI:GitHub Copilot / OpenAI Codex 等が使える前提🤖✨(毎章「AIの使いどころ」あり)
題材(全章で共通)🍙📱
- 「学食モバイル注文」 状態例:Draft(下書き)→ Submitted(注文)→ Paid(支払い)→ Cooking(調理中)→ Ready(受け取り可)→ PickedUp(受取済)/ Cancelled(キャンセル)/ Refunded(返金済)など✨
第1部:まず“状態機械の考え方”に慣れる(1〜4章)🌱😊
1章:この講座でできるようになること🎓✨
- ねらい:状態機械を「図・表・コード」で説明できるようにする
- 学ぶ:状態/イベント/遷移の超基本、学習の進め方
- 演習:題材の全体フローを一言で説明してみる🗣️
- AI活用:Copilotに「状態機械って何?」を“自分の言葉”で要約させる🤖📝
2章:開発環境セットアップ(Windows)🪟🛠️
- ねらい:迷わず動かせる土台を作る
- 学ぶ:Visual StudioでConsole/Library/Testの作り方、最低限のプロジェクト構成
- 演習:Consoleアプリで「状態を表示するだけ」を動かす✅
- AI活用:プロジェクト作成手順を箇条書きにしてもらう(手順書化)📋✨
3章:if文地獄を“わざと”体験😵💫🔥
- ねらい:状態機械が必要になる理由を体感する
- 学ぶ:フラグ乱立・条件漏れ・追加が怖い、の典型パターン
- 演習:注文フローをif/elseで書いて、破綻点を3つ探す🔎
- AI活用:AIに「どこがバグりやすい?」をレビューさせる🕵️♀️🤖
4章:用語の超入門(状態・イベント・遷移)📘✨
- ねらい:用語が怖くなくなる
- 学ぶ:State / Event / Transition、初学者が混乱しがちなポイント
- 演習:例を見て「これは状態?イベント?」クイズ🎯
- AI活用:AIに“例を10個”作らせて分類練習🧠✨
第2部:仕様を“表と図”で固める(5〜10章)🗺️📊
5章:要求から「状態」を抜き出すコツ🏷️😊
- ねらい:状態名がブレないようにする
- 学ぶ:画面ではなく“業務の段階”で状態を切る考え方
- 演習:学食注文の状態候補を洗い出す(7〜10個)📝
- AI活用:AIに「状態名の候補」と「説明1行」を作らせる🤖✨
6章:要求から「イベント」を抜き出すコツ📣✨
- ねらい:イベントが“操作”として自然になる
- 学ぶ:イベント=やりたい操作/起きた事実、命名のコツ
- 演習:状態を動かすイベントを列挙(支払い、受取など)💳📦
- AI活用:AIに「イベントに必要な入力(引数)」候補を出させる🧾🤖
7章:遷移表を作る(最重要)📊✨
- ねらい:網羅性を手に入れる(抜け漏れ防止)
- 学ぶ:現在状態×イベント→次状態、できる/できないを明確化✅❌
- 演習:遷移表の“空欄”を埋めていくゲーム🎮
- AI活用:AIに「遷移表の矛盾チェック」をさせる🔍🤖
8章:状態遷移図を描く(理解が爆速)🗺️✨
- ねらい:人に説明できる形にする
- 学ぶ:図の読み書き、粒度の調整、見やすくするコツ
- 演習:遷移表→図へ変換(ラフでOK)✏️😊
- AI活用:AIに「図の説明文章」を作らせてREADMEにする📝✨
9章:「禁止の遷移」を仕様として書く🚫🧾
- ねらい:バグと仕様を分ける
- 学ぶ:禁止の理由(業務ルール)/ユーザーへの伝え方
- 演習:禁止遷移ベスト10を決めて理由を書く🔟
- AI活用:AIに「ユーザー向けメッセージ案」を複数出させる💬🤖
10章:ガード条件(条件つき遷移)🛡️✨
- ねらい:「同じイベントでも条件で分かれる」を扱える
- 学ぶ:Guardの置き方(状態の中?遷移の中?)
- 演習:例:Cancelは“調理開始前のみOK”など条件を追加🍳
- AI活用:AIに「条件のテストケース」を自動列挙させる🧪🤖
第3部:副作用を整理して“設計っぽく”する(11〜14章)🧹✨
11章:アクション(Entry/Exit/Transition)入門🎬😊
- ねらい:状態が変わる時に“何をするか”を整理する
- 学ぶ:Entry/Exit/Transitionの違い、よくある置き場
- 演習:「Paidになったらレシート発行」などをどこでやるか判断🧾
- AI活用:AIに「アクション候補」を洗い出させる🤖✨
12章:副作用の分離(ロジック vs I/O)🚪📤
- ねらい:テストしやすく、事故りにくくする
- 学ぶ:「遷移の判断」は純粋に/通知・DB・外部APIは外へ
- 演習:アクションを「純粋」「I/O」に仕分けする🧺
- AI活用:AIに「副作用が混ざってる匂い」を指摘させる👃🤖
13章:不変条件(Invariants)を決める🔒✨
- ねらい:“壊れない状態”を入口で守る
- 学ぶ:例:Paidなら支払日時が必須、などのルール
- 演習:状態ごとの必須項目チェック表を作る🧾
- AI活用:AIに「不変条件の候補」と「破ると困る理由」を出させる🤖
14章:状態機械を“仕様書”として整える📘✨
- ねらい:図・表・文章が一致する状態にする
- 学ぶ:仕様の粒度、用語統一、例外ケースの書き方
- 演習:READMEに「状態一覧」「イベント一覧」「禁止ルール」をまとめる📝
- AI活用:AIに「仕様の言い回しをやさしく」整形してもらう👩🎓💖
第4部:まずは動かす(実装v1)→賢くする(15〜18章)🔧🚀
15章:実装v1(enum + switchで最小実装)🧱✨
- ねらい:最短で“動く状態機械”を作る
- 学ぶ:状態をenumで持つ、イベント処理をswitchで書く
- 演習:Submit/Pay/Cancelだけ先に動かす✅
- AI活用:Copilotに「switchの雛形」を作ってもらう🤖🛠️
16章:switch実装の限界を知る(痛みの観察)👀💥
- ねらい:なぜ設計が必要か腹落ちする
- 学ぶ:分岐増殖、漏れ、テスト難、修正怖い
- 演習:状態を2つ増やして「しんどい点」をメモする📝
- AI活用:AIに「改善案を3パターン」提案させる💡🤖
17章:テーブル駆動(辞書で遷移を表す)📚✨
- ねらい:遷移表→コードの距離を縮める
- 学ぶ:キー(状態,イベント)→次状態のマップ化、禁止はデータで表現
- 演習:遷移表の一部を辞書で表して動かす🔁
- AI活用:AIに「遷移表からコードのマップを生成」させる🗺️🤖
18章:イベントを“型”にする(Command化)📦✨
- ねらい:イベントの入力を安全に扱う
- 学ぶ:Pay(Amount) みたいに引数を持つ、文字列イベント卒業🎓
- 演習:PayCommandに金額を持たせる💳
- AI活用:AIに「コマンド型一覧」を自動生成してもらう🤖🧾
第5部:失敗の扱い・ログ・テスト(19〜23章)🧪📜
19章:遷移の結果を整える(成功/失敗)✅❌
- ねらい:無効遷移を“事故”にしない
- 学ぶ:例外にする?Resultで返す?初学者向け落とし所
- 演習:禁止遷移時に「理由コード+メッセージ」を返す設計🧾
- AI活用:AIに「失敗理由の分類案」を出させる🗂️🤖
20章:UI/APIへ伝えるエラーメッセージ設計💬✨
- ねらい:ユーザーに優しい失敗になる
- 学ぶ:技術用語を出さない、次の行動が分かる文章
- 演習:禁止遷移10個のメッセージを改善する🫶
- AI活用:AIに“3段階の言い回し(短い/普通/丁寧)”を作らせる🤖
21章:ログ設計(遷移ログは宝物)📜💎
- ねらい:あとから原因が追える
- 学ぶ:旧状態→新状態、イベント名、理由、相関ID
- 演習:遷移ログを1行で出す(ConsoleでもOK)🖥️
- AI活用:AIに「ログ項目のチェックリスト」を作らせる✅🤖
22章:単体テスト①(遷移表ベースで作る)🧪✨
- ねらい:遷移表=テストケースになる体験
- 学ぶ:正常遷移テスト、禁止遷移テスト
- 演習:遷移表の行をテストに落とす(まず10ケース)🔟
- AI活用:AIに「テストケース自動列挙」させる🧠🤖
23章:単体テスト②(網羅の考え方)🎯🧪
- ねらい:全部テストできない時の優先順位が分かる
- 学ぶ:重要遷移・境界条件・事故りやすい箇所に集中
- 演習:優先度A/B/Cでテスト計画を作る📋
- AI活用:AIに「落ちやすい組み合わせ」を推測させる🔮🤖
第6部:実務の壁(async・並行・時間・保存)(24〜28章)🧱⚡
24章:非同期(async/await)と中間状態⏳⚡
- ねらい:支払いAPIなど“待ち”がある世界に対応
- 学ぶ:Processing状態、完了イベントで遷移する考え方
- 演習:Pay→Processing→Paid をイベントで表す💳⏳
- AI活用:AIに「中間状態が必要な場面」を挙げさせる🤖
25章:並行実行の事故(連打・二重処理)👆💥
- ねらい:現実の“連打”で壊れない設計へ
- 学ぶ:同時イベント、二重適用、排他の基本
- 演習:Payが2回来たらどうなる?を仕様で決める🧾
- AI活用:AIに「事故パターン集」を作らせる🧨🤖
26章:冪等性(Idempotency)入門🔁✨
- ねらい:リトライに強い状態機械へ
- 学ぶ:冪等キー、重複排除、同じイベントの再適用防止
- 演習:IdempotencyKeyをイベントに持たせる設計にする🔑
- AI活用:AIに「冪等性チェックの観点」をまとめさせる📝🤖
27章:時間で動く(Timeout・期限)⏰✨
- ねらい:期限切れ・自動キャンセルなどを扱う
- 学ぶ:スケジュールイベント、期限の表現、タイマーの粒度
- 演習:Submittedのまま30分でExpiredへ、みたいな設計🕒
- AI活用:AIに「期限がある業務例」を出させる🤖
28章:永続化(保存)①:現在状態をDBへ💾✨
- ねらい:再起動しても続きから動く
- 学ぶ:状態を保存するモデル、更新競合(楽なやり方から)
- 演習:状態をファイル/DB(どちらでも)に保存して復元🔁
- AI活用:AIに「保存すべき最小項目」を整理させる📦🤖
第7部:発展&実戦投入(29〜30章)🚀🎓
29章:永続化②:履歴(監査ログ)を残す📜✨
- ねらい:「なぜそうなった?」を後から説明できる
- 学ぶ:イベント履歴、誰がいつ何をしたか、復元の考え方
- 演習:遷移履歴を保存して「注文のタイムライン表示」🕰️
- AI活用:AIに「履歴テーブル/構造の案」を出させる🧠🤖
30章:卒業制作🎓🎉(ミニ実務アプリ完成)
-
ねらい:図・表・コード・テスト・ログまで一気通貫で完成✨
-
成果物(必須)📦
- 状態一覧/イベント一覧/遷移表/遷移図🗺️📊
- 実装(Console or Web API)+単体テスト+遷移ログ🧪📜
- README(使い方・仕様・禁止遷移の理由)📝
-
発展(選択)🌟
- 状態が増えたら「階層状態(サブ状態)」を導入して整理🌳
- ライブラリ(例:Stateless)導入で書き味を比較📚
- ASP.NET Core Web API化してHTTP結果(200/409など)にマッピング🌐
-
AI活用:
- 遷移表→テストケース生成🧪🤖
- README整形&レビュー(わかりやすさチェック)📝🤖
この30章で、初心者さんでも「状態機械=仕様を壊さず育てる道具」って感覚が持てるようにしてあるよ😊💖
次にやるなら、どっちがいい?✨
- A:この30章それぞれに「到達目標・演習の具体指示・想定つまずきポイント」を付けて、さらに授業っぽくする📘👩🏫
- B:卒業制作(30章)の題材を「学食注文」以外(ログイン、承認フロー、チケット管理)に差し替えて作りやすくする🎫✅