第25章:卒業🎓✨ テスタブル設計の最小まとめ&次の一歩 🚀💖
ここまで来たあなた、もう 「I/O境界の分離」できる人 です🥳💐 この章は「忘れないための最小まとめ」+「次に伸びる道」をギュッとまとめるよ〜😊🧡
0) この章のゴール 🎯✨
- 迷ったときに戻れる 最小の合言葉 を持つ📌🧠
- やりすぎ(抽象化しすぎ) を避けるコツを知る⚠️🙂
- 次に進むなら何を学べば強いか、道筋が見える🌈🚶♀️
1) 卒業の合言葉(最重要)📦➡️🌍

✅ I/Oは外へ、ルールは中へ
- 中:ビジネスルール・判断・計算(=ピュア寄り)🌿
- 外:DB/ファイル/HTTP/時刻/乱数/UI(=現実世界)🌍🔌
これを守ると…
- テストが 速い⚡
- 変更が 怖くない🛡️
- バグが 再現しやすい🎯
2) 3つの箱で考えると一生迷わない 📦📦📦✨
イメージはこれだけでOK😊
- ① ルール箱(ドメイン):純粋ロジック🌿
- ② 手順箱(ユースケース):「どう進める?」の組み立て🧩
- ③ 現実箱(I/Oアダプタ):DB/HTTP/ファイル等を実行🔌
ポイントはね👇
- ①②は 外の都合を知らない 🙅♀️🌍
- ③は 実行担当(ここは汚れてOK)🧤🧼
- つなぐのは 最後に1回だけ(Composition Root)🏗️✨
3) 卒業テンプレ(最小構成)🧰✨
「これだけ守れば勝ち」っていう型を置いておくね😊💕
📁 フォルダ例(超ざっくり)
Domain/(ルール)🌿Application/(ユースケース)🧩Ports/(I/Oの入り口=interface)🚪Adapters/(本物I/O実装)🔌Program.cs(全部つなぐ場所)🏗️
「つなぐ場所」だけは特別:Program.cs 🏗️✨
- ここに
newが集まるのが正解🙆♀️ - “本物を接続する” のはここだけに寄せる📍
(例:イメージだけの最小スケルトン)👇
// Program.cs(つなぐ場所のイメージ)
services.AddSingleton<IClock, SystemClock>();
services.AddSingleton<IRandom, SystemRandom>();
services.AddScoped<ICouponRepository, SqlCouponRepository>();
services.AddScoped<IssueCouponUseCase>();
4) 卒業チェックリスト ✅🎓(ここ全部YESなら超強い!)
✅ 設計チェック
- 重要ロジックの中に
DateTime.Now/Random/File/HttpClient/ DB直アクセスが 入ってない 🧼✨ - 重要ロジックは 引数が揃えば結果が決まる(ピュア寄り)🌿🎯
- 依存(I/O)は コンストラクタで受け取っている ✉️
newが散らばってなくて、だいたい 1箇所に寄ってる 🏗️
✅ テストチェック
- 単体テストが 速い(秒で終わる)⚡
- Fake/Stubで「外」を差し替えられる🎭
- テストが「たまに落ちる」みたいな 運ゲー じゃない🎲🙅♀️
5) よくある落とし穴(卒業後にハマりがち)⚠️😵💫
落とし穴①:抽象化しすぎ(インターフェース作りすぎ)🧩🧩🧩
- 何でも
IWhateverにすると、逆に読みづらい😇 回避: - 「外の世界(I/O)」だけ包む、から始めるのが安定👍✨
- 迷ったら “テストで差し替えたい?” で判断💡
落とし穴②:Mock地獄👻(呼ばれた回数テストばかり)
- “実装の形” をテストしてしまうと、リファクタで壊れやすい💥 回避:
- まずは Fake/Stub中心 🎭
- “結果” を見るテストを増やす🎯
落とし穴③:Repositoryが「なんでも屋」になる🗄️🍱
- 取得も保存も検索も集計も…全部突っ込むと肥大化🐘 回避:
- 「ユースケースが欲しい形」で小さく始める✂️
- 増えたら分割すればOK(最初から完璧にしない)😊
落とし穴④:例外がどこで握られてるか迷子🚨🌀
- ルール違反とI/O失敗が混ざるとつらい😵 回避:
- ルール違反:内側で判断(Resultっぽく返すなど)📦
- I/O失敗:外側で扱う(リトライ/ログ/ユーザー表示)🌍
6) 次の一歩 🌉✨(どれから行ってもOK!)
ここからは「伸び方」を3ルートに分けるね😊🛣️
ルートA:DIをちゃんと使えるようになる 💉✨
- ライフタイム(Singleton/Scoped/Transient)を体で覚える🧠
- 「設定」「ログ」「HTTPクライアント」の扱いが一気にラクになる🪄
ルートB:クリーン/ヘキサゴナルへの橋渡し 🏰🔁
- 今やってることはまさに Ports & Adapters の入口だよ✨
- 「内側(ルール)を守る」設計が、チーム開発でめちゃ効く🛡️
ルートC:テストを“現場レベル”に上げる 🧪🚀
- 単体:速くて大量に回す⚡
- 結合:本物DB/本物HTTPは 少なめ にする🤏
- CIで自動化:壊れたら即わかる🔔
7) 卒業課題(ミニアプリ案)🎮💖
「1〜2日で作れて、境界が気持ちよく分かれる」やつ✨
案①:クーポン発行システム 🎫🎲🕰️
- 期限:時刻I/O🕰️
- コード生成:乱数I/O🎲
- 保存:DB/ファイルI/O🗄️🗂️
- 発行ルール:内側📦✨
やること
- ルール(割引率、期限チェック)をピュアにする🌿
IClockとIRandomとIRepositoryを作る🚪- 単体テストは Fake で全部回す🎭🧪
- 最後に本物I/Oを繋いで動かす🏗️🚀
8) AI(Copilot/Codex)を卒業後にこう使う 🤖✅
「AIに丸投げ」じゃなくて、設計を守るための相棒 にする感じ😊🫶
使えるお願いテンプレ 📝✨
- 「このクラス、I/Oが混ざってない?混ざってたら境界案を出して」🔍
- 「このユースケースを単体テストしたい。Fake/Stub案とテストケースを列挙して」🧪
- 「newが散らばってる。Composition Rootに寄せるリファクタ手順を出して」🏗️
- 「Mockを減らしたい。結果を見るテストに置き換える案を出して」🎯
9) 最新の“土台”メモ(2026/01/16時点)🧾✨
- .NET 10 はLTSで、3年間サポート(〜2028年11月頃)として案内されています。(Microsoft for Developers)
- C# 14 が最新リリースで、.NET 10 上でサポートされています。(Microsoft Learn)
- Visual Studio 2022 は Current チャネルで 17.14.24(2026-01-13) が案内されています。(Microsoft Learn)
- Visual Studio 2026 も 2026年1月の更新(18.2.0 / 2026-01-13)が案内されています。(Microsoft Learn)
まとめ 🎓💖
- 迷ったらこれだけ:I/Oは外へ、ルールは中へ 📦➡️🌍
- やりすぎ注意:抽象化はI/Oから、Mockは増やしすぎない🎭⚠️
- 次は「DIの理解」「クリーン/ヘキサゴナル」「結合テスト&CI」のどれかへ🚀✨
ここまで積み上げたの、ほんとに強いよ〜🥳🎉 次は「卒業課題」みたいな小さいアプリを1本作ると、理解がガチで定着するよ🫶💖