第24章:AIにレビューさせる(設計チェックリスト)🤖✅
(テーマ:I/O境界の分離が崩れてないかを、AIと一緒にサクッと見抜く✨)
24.1 この章でできるようになること 🎯💖
この章が終わると、こんなことができるようになります😊✨
- 「このコード、I/Oが中に混ざってない?」をチェックリストで即判定できる🔍
- Copilot/Codexに「境界の提案」を出させて、設計の改善案を高速に集められる⚡
- AIの提案を鵜呑みにせず、ちゃんと採用/却下できる判断軸を持てる🧠✨
24.2 2026年1月時点の“今どきAIレビュー”事情(超ざっくり)🗞️✨
- Visual Studio 2026 は 18.2.0 が 2026/1/13 にリリースされていて、更新も速いです📈 (Microsoft Learn)
- Visual Studio では Copilot Chat が使えて、IDE内から起動して会話できます💬 (Microsoft Learn)
- GitHub Copilot には IDE内のコードレビューや、PRに対するレビューなど「レビュー系」機能が整理されてます🧾 (GitHub Docs)
- OpenAI Codex は「リポジトリ上で作業してPR提案」みたいなエージェント方向にも進んでます🧑💻🤖 (OpenAI)
つまり:AIに“設計レビュー係”をやらせやすい時代になってます😆✨
24.3 まず手で見る!設計チェックリスト(I/O境界)🧾✅

AIに頼む前に、まず自分でサッと確認できると強いです💪✨ (AIレビューは「二重チェック」にすると事故が減ります🛡️)
✅チェック1:I/Oが “内側(ルール)” に混ざってない?🔌🚧
次のどれかが、重要ロジックの中に直書きされてたら黄色信号です⚠️
DateTime.Now/ 時刻取得 🕰️Random/ 乱数 🎲File.*/ ファイル 🗂️- DBアクセス(ORM直叩き)🗄️
HttpClient直叩き 🌐- UI要素直参照(Console.ReadLine/WriteLine含む)🖥️
👉 方針:それらは “境界インターフェース” の向こう側へ🚪✨
✅チェック2:依存が “見える形” になってる?👓
- 重要ロジックのクラスが、内部で勝手に
newして依存を作ってない?😵 - コンストラクタ引数で受け取れてる?✉️
- 依存が多すぎて読めなくなってない?(多すぎも危険)🌀
👉 理想:依存が「見える=説明できる」状態がスッキリ💖
✅チェック3:単体テストが “爆速” で回る?⚡
- テストが遅い原因が I/O になってない?🐘
- テストが「環境に左右」されてない?(PC/ネット/時刻/DB)🌪️
- 1回のテスト実行がストレスになってない?😇
👉 目標:単体テストは、気軽に連打できる速さが正義✨
24.4 AIにレビューさせるときの“基本姿勢”🤖🧠
AIは便利だけど、得意不得意があります😉
AIが得意 💡
- 「I/O混ざりポイント」を機械的に列挙する🔍
- 「境界インターフェース案」を大量に出す🧩
- 「テストケース案」をAAAで整形する🧪
- 「リファクタ案」を複数パターン出す🔁
AIが苦手(事故りやすい)⚠️
- 抽象化しすぎ(インターフェース増殖祭り🎉→地獄👻)
- プロジェクト文脈無視で “正しそうな理想” に寄せる
- 命名・責務分割がズレる(それっぽいけど違う)
なので、チェックリストで人間が最終判定が鉄板です✅💖
24.5 Copilot/Codexに投げる「設計レビュー依頼」テンプレ集 📌💬
Copilotは「具体的な依頼」が強いです(細かく、分割して頼むのがコツ)📝✨ (GitHub Docs)
テンプレA:I/O混入チェック🔍
- 「このコードの I/O箇所 を全部列挙して。 それぞれ 境界インターフェース化 するとしたら、名前案も出して」
テンプレB:内側/外側の線引き🧱
- 「この処理を 純粋ロジック と I/O に分けたい。 どこを“内側”に残し、どこを“外側”に出すべき?理由付きで」
テンプレC:DI(コンストラクタ注入)案✉️
- 「このクラスが依存してるものを整理して、 コンストラクタ注入 に直す案を出して。テストのFake例も」
テンプレD:テスト設計(AAA)🧪
- 「このユースケースの単体テストを Arrange/Act/Assert で3〜5ケース提案して。 I/OはFake/Stubでやりたい」
テンプレE:過剰抽象化のブレーキ🛑
- 「提案する抽象(interface)ごとに、 “なぜ必要?” を1行で説明して。不要なら削って」
24.6 ミニ実演:AIレビューで“境界”を炙り出す🔥➡️🧊
例として、Consoleアプリでありがちな「I/O混ざり」を見ます😵💫
❌ダメ寄り例:ルールの中にI/Oが直撃してる💥
public class CouponService
{
public decimal ApplyCoupon(decimal price)
{
// I/O①:時刻
var now = DateTime.Now;
// I/O②:乱数(例:キャンペーン抽選)
var rnd = new Random();
var win = rnd.Next(0, 10) == 0;
if (now.DayOfWeek == DayOfWeek.Sunday || win)
return price * 0.8m;
return price;
}
}
🤖AIにこう聞く(テンプレA+B)💬
- 「このコードのI/O箇所を列挙して。内側/外側に分ける設計案も。 テストしやすい形にしたい」
✅改善例:I/Oを境界へ、ルールはピュアへ🌿✨
public interface IClock
{
DateTime Now { get; }
}
public interface IRandom
{
int Next(int minValue, int maxValue);
}
public class CouponRule
{
public decimal Apply(decimal price, DateTime now, bool isWinner)
{
if (now.DayOfWeek == DayOfWeek.Sunday || isWinner)
return price * 0.8m;
return price;
}
}
public class CouponService
{
private readonly IClock _clock;
private readonly IRandom _random;
private readonly CouponRule _rule = new();
public CouponService(IClock clock, IRandom random)
{
_clock = clock;
_random = random;
}
public decimal ApplyCoupon(decimal price)
{
var now = _clock.Now;
var win = _random.Next(0, 10) == 0;
return _rule.Apply(price, now, win);
}
}
ポイント🎉
- ルール(
CouponRule)は 入力だけで決まる → テスト爆速⚡ - I/O(時刻・乱数)は 境界(
IClock/IRandom)に隔離🚧 - Serviceは “組み立てて呼ぶ係” に寄せられる🧩
24.7 AIの提案を採用するかの判断ルール(超重要)🚦🧠
AIが「interfaceいっぱい作ろう!」って言い出したら、一旦これで止めます✋😆
✅採用してOKな提案
- テストが不安定になるI/Oを外に出してる🧊
- ルール(判断)がピュアになってる🌿
- 依存が読みやすく、増えすぎてない👀
❌採用しない寄りの提案
- 「将来のために」と言って抽象が増えすぎる(YAGNI警報)🚨
- 名前がフワフワして責務が不明(
IHelperとか)😇 - 重要ロジックが“薄くなりすぎて”追跡不能🕵️♀️
👉 コツ:AIに テンプレE を追加で投げて「必要性を言語化」させると良いです🗣️✨
24.8 章末課題(やってみよう)📝🎮
第23章で作った小さなアプリ(ConsoleでOK)を題材にします😊
ステップ1:セルフレビュー(チェックリスト)✅
- I/Oが内側に混ざってない?
newが重要ロジックに埋まってない?- 単体テストが速い構造?
ステップ2:AIレビュー(テンプレA〜D)🤖
- 「I/O箇所列挙」
- 「境界インターフェース案」
- 「AAAテストケース案」
ステップ3:採用/却下を“理由つき”で決める🧠✨
- 採用した改善:理由は?
- 却下した改善:なぜ不要?(YAGNI?過剰抽象?)
🎁おまけ:最後にAIへ
- 「この設計はテスト容易性の観点で何点?減点理由は?」 って聞くと、振り返りがめちゃ捗ります📈✨
24.9 まとめ 🎀😊
- チェックリスト(人間)+AIレビュー(第二の目) が最強コンボ🤝✨
- AIには「I/O列挙」「境界提案」「テスト案」をやらせると超速い⚡
- でも最後は、抽象化しすぎてない?責務は明確? を人間が決める🧠✅
次はいよいよ最終章🎓✨ 「最小まとめ&次の一歩」へ進もう〜!🚀💖