メインコンテンツまでスキップ

クリーンアーキテクチャ(TypeScript)45章 詳細アウトライン 🏛️✨

前提はずっと同じだよ🪟🧩

  • Windows / VS Code
  • TypeScript(2026年の最新前提)
  • Copilot / Codex系AI拡張が使える🤖✨
  • 題材:超ミニ Taskアプリ(Create / Complete / List)🗒️

Part 1:核をつかむ(1〜7)🧭

第1章:なぜクリーンアーキ?(ゴールを固定)🎯

  • ねらい:この講座の「勝ち筋」を最初に決める😊
  • 学ぶ:変更に強い=どこが強くなる?/テストが楽になる理由
  • つくる:設計ゴール1枚メモ(例:中心を汚さない、差し替えできる)
  • AI相棒🤖:「この講座のゴールを“初心者向けに3行”でまとめて」

第2章:4つの円(4層)の役割を短文で言えるようにする🟡🟠🔵⚫

  • ねらい:4層の責務を“迷わない言葉”にする
  • 学ぶ:Entities / Use Cases / Interface Adapters / Frameworks & Drivers
  • つくる:層ごとの「置くもの/置かないもの」一覧📌
  • AI相棒🤖:「各層に置くものを3つずつ、例で」

第3章:Dependency Rule(依存の向き)が全て⬅️💘

  • ねらい:内側が外側を知らない、を体に入れる
  • 学ぶ:importの向き=設計の崩壊ポイント/依存逆転の意味(クリーンアーキ文脈で)
  • つくる:OK依存✅/NG依存❌の判定表
  • AI相棒🤖:「この依存関係、違反を指摘して修正案も」

第4章:Boundary(境界)ってなに?🚧

  • ねらい:「混ぜない線」を自分で引けるようにする
  • 学ぶ:境界=責務の切れ目/境界で変換が起きる
  • つくる:今回の境界(UI↔UseCase↔DB)宣言📍
  • AI相棒🤖:「この境界定義、混ざってるところを指摘して」

第5章:“データの流れ”でクリーンアーキを理解する📦

  • ねらい:依存だけじゃなく、データの形も守る
  • 学ぶ:Request/Responseの設計/内側に便利な形で渡す感覚
  • つくる:CreateTaskの入出力スケッチ(文章+矢印)✍️
  • AI相棒🤖:「CreateTaskの入出力を“境界を意識して”整理して」

第6章:内側の言葉/外側の言葉を分ける📖

  • ねらい:HTTP/SQLの言葉を内側に持ち込まない
  • 学ぶ:命名の境界(内側=業務、外側=技術詳細)
  • つくる:内側用語ミニ辞書(Task/Completeなど)📝
  • AI相棒🤖:「この名前、内側向き?外側向き?改善案ちょうだい」

第7章:ユースケース一覧を確定(アプリの中心)🎬

  • ねらい:迷子防止!まずUse Caseを固定
  • 学ぶ:ユースケース=“目的”/粒度=最小でOK
  • つくる:Create / Complete / List を1行仕様で確定✅
  • AI相棒🤖:「この3ユースケース、粒度が適切か判定して」

Part 2:Entities(中心のルール)を作る(8〜13)❤️

第8章:Entities層の作り方(最小から)🌱

  • ねらい:中心を作る、でも作り込みすぎない
  • 学ぶ:Entityが持つべきもの(状態+ルール)だけに絞る
  • つくる:Taskの最小モデル(id/title/completed等)🧱
  • AI相棒🤖:「Taskに必要な属性を“最小”で提案して」

第9章:Entityの公開API設計(壊されない入口)🔒

  • ねらい:外側から雑に書き換えさせない
  • 学ぶ:生成・更新をメソッドに寄せる/直接代入を減らす
  • つくる:create() / complete() などのAPI設計案
  • AI相棒🤖:「外から壊されないEntity API設計にして」

第10章:ルール違反の表現(内側の失敗)⚠️

  • ねらい:失敗を“内側の言葉”で返す準備
  • 学ぶ:ドメイン的な失敗種類(例:InvalidTitle)
  • つくる:失敗型(ドメインエラー)定義📌
  • AI相棒🤖:「この仕様で起きる“内側の失敗”を列挙して」

第11章:Entityのライフサイクル(作る→変える)🔁

  • ねらい:更新ルールの置き場を固定する
  • 学ぶ:完了処理の責務はEntity?UseCase?(境界の整理)
  • つくる:completeできる条件をEntity側に集約🛡️
  • AI相棒🤖:「completeの禁止条件、漏れを探して」

第12章:Entities層の“依存ゼロ”監査👀

  • ねらい:中心が外に寄りかからないことを保証
  • 学ぶ:Entitiesが参照していいもの(標準機能・型など)だけ
  • つくる:Entities層のimportルール表✅
  • AI相棒🤖:「このimport、Entitiesに置いてOK?」

第13章:Entitiesの最小テスト(中心の安心感)🧪

  • ねらい:中心ルールが壊れない状態を作る
  • 学ぶ:テストは速く小さく(中心のルールだけ)
  • つくる:生成・更新の基本テストケース✅
  • AI相棒🤖:「Entityテスト観点を5つ出して」

Part 3:Use Cases(アプリの方針)を作る(14〜23)🎬

第14章:Use Case Interactorの型を決める📐

  • ねらい:毎回迷わないテンプレを作る
  • 学ぶ:1目的=1UseCase/入力→処理→出力
  • つくる:Interactorの骨格(クラスでも関数でもOK)🧱
  • AI相棒🤖:「UseCaseのテンプレ構造を提案して」

第15章:Input Boundary:Requestモデル設計📥

  • ねらい:外側入力を内側に入れる“整形口”
  • 学ぶ:Requestは外側依存を持たない(HTTPを入れない)
  • つくる:CreateTaskRequest / CompleteTaskRequest など
  • AI相棒🤖:「Requestに必要な項目だけ抽出して」

第16章:Output Boundary:Response設計📤

  • ねらい:UseCaseが“表示都合”に縛られない
  • 学ぶ:Responseは内側基準(UI向けは後で整形)
  • つくる:CreateTaskResponse / ListTasksResponse 設計📦
  • AI相棒🤖:「Responseを“内側基準”で設計して」

第17章:UseCaseが依存するのはPortだけ🔌

  • ねらい:DB/HTTPを直接触らない徹底
  • 学ぶ:UseCaseはインターフェース(Port)にだけ話す
  • つくる:UseCaseが必要なPort一覧メモ📝
  • AI相棒🤖:「このUseCaseが必要なPortを列挙して」

第18章:CreateTaskを実装(中心の流れを固める)✅

  • ねらい:追加系UseCaseの基本形を完成させる
  • 学ぶ:入力→ルール→保存→出力
  • つくる:CreateTaskInteractor(Port前提)🧩
  • AI相棒🤖:「この手順で抜けてるチェックある?」

第19章:CompleteTaskを実装(更新系の基本形)🔁✅

  • ねらい:状態更新の責務分離を保ったまま作る
  • 学ぶ:取得→Entity更新→保存→出力
  • つくる:CompleteTaskInteractor(Port前提)
  • AI相棒🤖:「更新系UseCaseの落とし穴を指摘して」

第20章:ListTasksを実装(参照系の基本形)👀✅

  • ねらい:Query系の流れを確立する
  • 学ぶ:参照の結果を内側基準で返す
  • つくる:ListTasksInteractor(Port前提)
  • AI相棒🤖:「ListのResponseに必要な項目を提案して」

第21章:UseCaseの失敗を“境界で扱う”設計にする⚠️➡️🚧

  • ねらい:内側の失敗を外側表現に混ぜない
  • 学ぶ:ドメイン失敗と技術失敗を分けて扱う前提
  • つくる:UseCase戻り値の方針(成功/失敗の表現を統一)📌
  • AI相棒🤖:「成功/失敗を扱う戻り値の形を提案して」

第22章:UseCaseテスト:Port差し替えで検証🧪🎭

  • ねらい:外側なしで中心が検証できる!を体感
  • 学ぶ:Fake/StubでPortを置き換える
  • つくる:3UseCaseのテスト(成功+失敗)✅
  • AI相棒🤖:「Fake Repositoryを簡単に作って」

第23章:UseCases層の依存監査(外側参照ゼロ)🛡️

  • ねらい:長期的に崩れないための仕上げ
  • 学ぶ:UseCasesはEntitiesとPortsだけ参照
  • つくる:参照ルール(チェックリスト化)✅
  • AI相棒🤖:「UseCaseが外側参照してないか確認して」

Part 4:Ports(差し替え口)を最小で設計(24〜29)🔌

第24章:Portって何?(内側が欲しい“能力”)🎯

  • ねらい:外側都合じゃなく内側都合で決める
  • 学ぶ:能力の言語化(保存したい/取得したい)
  • つくる:Portの説明文(1Port=1能力)📝
  • AI相棒🤖:「この能力に合うPort名を10個」

第25章:Repository Port設計(最小メソッド主義)🗄️✨

  • ねらい:巨大Repository化を防ぐ
  • 学ぶ:UseCaseから逆算して必要分だけ
  • つくる:TaskRepositoryのAPI確定✅
  • AI相棒🤖:「このメソッド、要る?要らない?理由つきで」

第26章:副作用Port(Clock/Idなど)の最小抽象⏰🆔

  • ねらい:テストできる中心を守る
  • 学ぶ:時間・IDは“外側の都合”になりやすい
  • つくる:IdGenerator / Clock Port(必要分だけ)
  • AI相棒🤖:「Clock/IdをPort化する必要性を短く説明して」

第27章:Portの入出力モデル(内側基準で決める)📦

  • ねらい:DB都合の型をPortに流し込まない
  • 学ぶ:Portは“内側に都合の良い形”でやりとり
  • つくる:Repositoryが返す型の方針(Entity/専用DTO)決定
  • AI相棒🤖:「Portの入出力が外側都合になってないかチェックして」

第28章:Portの境界線チェック(命名・責務)🧼

  • ねらい:Portが“外側の技術用語”になってないか確認
  • 学ぶ:内側語彙で命名するコツ
  • つくる:Port命名・責務の再点検リスト✅
  • AI相棒🤖:「このPort名、技術寄り?業務寄り?直すなら?」

第29章:Portを増やしすぎない運用(必要になったら)🌱

  • ねらい:抽象の乱立を防ぐ
  • 学ぶ:追加の判断基準(差し替えが必要か?テストか?)
  • つくる:Port追加ルール(短文で)📌
  • AI相棒🤖:「今このPortを作るべきか、判断して」

Part 5:Interface Adapters(変換して繋ぐ)を作る(30〜38)🔁🌐

第30章:Inbound Adapter(Controller)は責務3つだけ🧻

  • ねらい:入口は薄く!
  • 学ぶ:受け取る→変換→UseCase呼ぶ
  • つくる:3ユースケース分のController骨格🚪
  • AI相棒🤖:「Controllerを薄くする改善案を出して」

第31章:入力変換(HTTP→Request)を閉じ込める📥➡️📦

  • ねらい:HTTPの癖を内側に持ち込まない
  • 学ぶ:バリデーションはどこで何をやるか(境界で整理)
  • つくる:変換関数(Request BuilderでもOK)
  • AI相棒🤖:「この入力をRequestに変換する関数を書いて」

第32章:Output Boundary:Presenter(出力変換口)を作る🎨

  • ねらい:UseCaseを表示形式から守る
  • 学ぶ:Response→表示向けの整形はAdapter側
  • つくる:Presenterの入口(関数/クラスどちらでも)✨
  • AI相棒🤖:「ResponseからViewModelを作る設計案ちょうだい」

第33章:ViewModel設計(画面向けの形を固定)📦✨

  • ねらい:UI変更が中心に波及しない
  • 学ぶ:ViewModelは外側都合OK(だからこそここに置く)
  • つくる:TaskViewModel(一覧向け)定義✅
  • AI相棒🤖:「一覧表示に必要なViewModel項目を提案して」

第34章:エラー変換(内側→外側の表現)⚠️➡️🌐

  • ねらい:失敗の見せ方を境界に固定
  • 学ぶ:ドメイン失敗→HTTPステータス/メッセージの対応
  • つくる:変換テーブル(コード or 表)🧾
  • AI相棒🤖:「このドメインエラーをHTTPに変換する表を作って」

第35章:Outbound Adapter:InMemory Repository実装🧺✅

  • ねらい:差し替えの第一歩を最速で体感
  • 学ぶ:Portを満たす実装=Adapter
  • つくる:InMemoryTaskRepository
  • AI相棒🤖:「このinterfaceを満たす最小実装を書いて」

第36章:Outbound Adapter:永続化Repository(SQLite等)🗃️✅

  • ねらい:「外側だけ変更して動く」を実演できるようにする
  • 学ぶ:DBドライバの詳細は外側へ
  • つくる:SQLiteTaskRepository(または同等の永続化実装)
  • AI相棒🤖:「DB永続化実装の注意点(トランザクション/例外)を整理して」

第37章:Mapper:DBレコード↔内側モデル変換を隔離🔄🧹

  • ねらい:変換地獄を“ここだけ”に閉じ込める
  • 学ぶ:Record/RowとEntityのズレを吸収
  • つくる:TaskRecordMapper(命名自由)
  • AI相棒🤖:「Mapperの変換漏れが起きない設計にして」

第38章:Adapters層の依存監査(中心を汚さない)🛡️

  • ねらい:Adapterが勝手に中心ルールを持たないようにする
  • 学ぶ:Adapters→UseCases/Entities参照のルール
  • つくる:Adaptersの参照チェックリスト✅
  • AI相棒🤖:「このAdapter、中心に責務が漏れてないか診断して」

Part 6:Frameworks & Drivers(外側に押し出す)39〜42 ⚙️🌍

第39章:Webフレームワークは“外側”として置くだけ🧱

  • ねらい:フレームワーク依存を中心に入れない
  • 学ぶ:ルーティングやミドルウェアは外側
  • つくる:Web起動・ルート定義の配置ルール📁
  • AI相棒🤖:「フレームワーク依存が中心に漏れない配置案を出して」

第40章:DBドライバ/接続設定は外側に隔離🗄️➡️🌍

  • ねらい:DBの詳細を最後まで外に置く
  • 学ぶ:接続文字列・クライアント生成の置き場
  • つくる:DB接続の外側モジュール
  • AI相棒🤖:「接続設定が内側に漏れてないかチェックして」

第41章:設定(Config)の境界:どこで読み、どこへ渡す?🧾

  • ねらい:環境依存を内側に持ち込まない
  • 学ぶ:外側で読み、必要最小限だけ内側へ注入
  • つくる:Configオブジェクトの受け渡し設計📌
  • AI相棒🤖:「Configを内側に入れすぎない設計に直して」

第42章:外部サービス(通知など)もDriverとして外側へ📣

  • ねらい:外部APIをPort/Adapterで包む流れを完成させる
  • 学ぶ:Port定義→Adapter実装→注入
  • つくる:Notifier Adapter(ダミーでもOK)
  • AI相棒🤖:「外部サービス連携のAdapterを最小で作って」

Part 7:Composition Root(組み立て)で完成(43〜45)🏗️💉

第43章:Composition Rootとは(依存を一箇所で組む)🧩

  • ねらい:依存の迷子を終わらせる
  • 学ぶ:組み立て場所=外側/中心はnewしない
  • つくる:依存の組み立て手順書(図でもOK)🗺️
  • AI相棒🤖:「このプロジェクトの依存ツリーを整理して」

第44章:手動DIで組み立て(まずはコンテナ無し)💉✨

  • ねらい:依存が“見える状態”で理解を固める
  • 学ぶ:Repository/Clock/IdをUseCaseへ注入
  • つくる:起動コードで全結線(動くところまで)✅
  • AI相棒🤖:「組み立てコードを読みやすく整形して」

第45章:最終チェック:差し替え実演(外側を変えても中心が無傷)🎉🔁

  • ねらい:クリーンアーキの価値を体で理解して卒業!
  • 学ぶ:InMemory↔SQLite差し替えで中心が変わらない理由
  • つくる:差し替えデモ+テストが同じまま通る状態✅✨
  • AI相棒🤖:「差し替え手順と影響範囲を短くまとめて」

必要なら次は、この45章それぞれに

  • 🎯「到達目標(1文)」
  • ✅「理解チェック問題(1問)」
  • 📦「提出物(成果物)」
  • 🤖「AIプロンプトのテンプレ(コピペ用)」 を付けた“授業としてそのまま使える版”にもできるよ😊✨