ヘキサゴナル(Ports & Adapters)35章 詳細アウトライン 🔷🔌✨
C#初級〜中級/設計超入門/ヘキサ初めて/Windows/Visual Studio中心(必要ならVS Code)/AI拡張(Copilot/Codex等)前提🤖✨
第1章 設計って何のため?(怖い変更を減らす)😵💫➡️😊
- 変更が怖い理由(影響範囲が読めない)
- “守りたいもの”=業務ルール(中心)という発想🛡️
- 今日のゴール:中心を守れる構造を作る💪
第2章 ヘキサゴナルを一言で!🔷✨
- 「中心(Core)を外側から守る設計」
- 六角形は図の都合、ポイントは“境界”📌
- どう嬉しい?:UI/DBを差し替えやすい🔁
第3章 登場人物:Core / Port / Adapter 👥🔌
- Core:業務ルール&手順(方針)
- Port:約束(interface)
- Adapter:変換してつなぐ実装🔌
第4章 よくある失敗:全部ぐちゃぐちゃ構造🍝😭
- Controllerに業務・DB・変換が混ざる問題
- 「ちょい修正で全体が壊れる」を体感する例
- 何を分ける?変更理由ごとに分ける(SoC)✂️
第5章 中心(Core)が主役な理由🏠❤️
- UIは流行が変わる、DBも変わる
- “変わりにくいルール”を中心に置く
- まず守るのはCoreだよ🛡️
第6章 Inboundの考え方(外→中)⬅️🚪
- 外がCoreを呼ぶ入口(API/画面/CLI)
- Inboundは「呼び出し」を整える係
- 入口を薄くするメリット😊
第7章 Outboundの考え方(中→外)➡️🗄️
- Coreが外部を使う出口(DB/外部API/時計)
- “使いたいこと”だけCoreに残す
- 実装は外側に逃がす✨
第8章 Portって何?(約束のinterface)📝🔌
- Port=「こう呼んでね」「こう提供してね」
- interfaceの役割:差し替えの接続口
- “型で約束”すると強い💪
第9章 Adapterって何?(変換係)🔁🔌
- Adapter=Portを実装して外とつなぐ
- 変換(DTO↔ドメイン)を押し込む場所
- 外部の都合をCoreに入れない🧼
第10章 依存の向き①:依存ってそもそも何?🧲🙂
- using参照/new/呼び出し…どれが依存?
- 依存が増えると何が困る?
- 図で理解する(矢印の意味)📈
第11章 依存の向き②:Coreが外を知らない設計🛡️🚫
- Core→DB参照しちゃダメな理由
- 「外は差し替え対象」だから
- “Coreは方針、外は詳細”✨
第12章 依存の向き③:Portで逆転する(DIPの超入門)🔁🧠
- 具体に依存しない=抽象に依存
- RepositoryやClientをinterfaceで受ける
- ここがヘキサの心臓部❤️
第13章 他アーキとの関係①:まずヘキサだけで覚えよう🔷📌
- 混ぜ物なしで「Port/Adapterだけ」で整理
- 迷ったら「それPort?Adapter?」で判断😊
第14章 他アーキとの関係②:レイヤード/クリーンとの“似てる所”🤝📚
- 似てる:中心を守る、境界を作る
- 違い:ヘキサは“ポート発想”が強い
- ※ここは復習用でもOK📌
第15章 ミニ題材決定:カフェ注文アプリ☕🧾
- 要件:注文作成/注文一覧
- まずはInMemoryで完成→後でDB差し替え🔁
- これで「強さ」を体験するよ😆
第16章 環境準備(Windows)🪟⚙️
- Visual Studioでソリューション作成
- テストプロジェクトも最初から作る🧪
- (必要なら)VS Code + dotnet CLIも紹介💻
第17章 フォルダ/プロジェクト構成(おすすめ)📦🏷️
- Core(Domain / Application)
- Adapters(Inbound / Outbound)
- 依存方向のルールを先に決める🚦
第18章 Domain入門①:Domainってなに?🏠🌱
- Domain=業務ルールの“言葉と制約”
- DBの都合と混ぜない
- “現実の名前”をコードに置く✨
第19章 Domain入門②:Entity(同一性)👤🪪
- IDで追う「同じもの」
- OrderはEntityっぽいよね、みたいな感覚
- どこで生成する?も軽く触れる
第20章 Domain入門③:ValueObject(値・不変)💎🔒
- 金額・数量・住所みたいな“値そのもの”
- 不変にするとバグ減る😊
- 型にして守る発想(超ライト版)🧠
第21章 UseCase入門:アプリの手順(Application層)🧭🛠️
- 「注文する」は手順のまとまり
- UI都合は入れない(画面項目のままにしない)
- 入力→処理→出力の形を作る📦
第22章 Inbound Port設計①:ユースケースの入口をinterface化🚪📝
- ICreateOrderUseCaseみたいな形
- “呼び方”を固定する
- ここはCore側に置く理由
第23章 Inbound Port設計②:DTO(入力/出力)を作る📦✨
- Domain型をそのまま外へ出さない
- 入力DTO/出力DTOの役割
- 変換はどこ?→Adapter側へ🔁
第24章 Inbound Adapter①:Controllerは薄く!🌐🙂
- Controllerの責務:受け取ってPort呼ぶだけ
- 変換・バリデーションの置き場所を整理✅
- “薄いほど偉い”の感覚😊
第25章 Outbound Port設計①:Repositoryの約束🗄️📝
- Coreが欲しいのは「保存できること」だけ
- IOrderRepository の形
- 具体DBは知らない🚫
第26章 Outbound Adapter①:InMemory実装でまず完成🧪📦
- まず動くを最優先(KISS)😊
- 差し替え可能な土台を作る
- テストもしやすい😆
第27章 Outbound Adapter②:DB実装に差し替え(考え方)🔁🗃️
- Portはそのまま、Adapterだけ入れ替える
- “Coreコードが変わらない”を確認🛡️
- 差し替えの手順のコツ
第28章 Outbound Adapter③:DB実装(最低限の実例)🗃️⚙️
- ORM/設定は“必要最低限”だけ
- 変換(DBモデル↔Domain)をAdapterに置く
- DB都合がCoreに漏れないように🧼
第29章 Outbound Adapter④:外部API/メールも同じ発想📡✉️
- HttpClientもPort越しに扱う
- DTO変換・リトライは外側で
- ここは発展の入口😊
第30章 DI入門①:DIって何?なぜ必要?🧠🔧
- newしないと何が嬉しい?
- テスト差し替えができる✨
- “配線は外で”の考え方🧩
第31章 DI入門②:.NETのDI基本(AddScoped等)🔧🧰
- どこに登録する?(Program.cs)
- ライフタイムの超入門(Transient/Scoped/Singleton)🕒
- 迷ったらどうする?の目安も😊
第32章 Composition Root:配線をここに集める📍🧩
- “依存の集中管理場所”という意味
- ここだけは外側の都合がOK🙆♀️
- 実装の差し替えポイントになる🔁
第33章 テスト設計①:Coreの単体テストが簡単になる🧪💖
- Fake/StubのAdapterを差してテスト
- DBなしでユースケース検証できる快感😆
- まずは1本書ければOK!
第34章 テスト設計②:Adapterのテストは別物🔍🧪
- DB Adapterは統合テスト寄り
- “CoreとAdapterでテストの目的が違う”を理解🎯
- どこまでやる?の現実的ライン📌
第35章 仕上げ:エラー・ログ・AI活用の“最低限セット”🎁✨
-
エラー:ドメイン失敗 vs 外部失敗を分ける🧯
-
ログ:重要イベントだけでも残す📝
-
AI:雛形は任せて、境界ルールは人が守る🚦🤖
-
最終チェックリスト✅
- Coreが外を参照してない?
- Port/Adapterが役割通り?
- InMemory↔DB差し替えできる? 🔁