依存関係ルール(Dependency Rule)TypeScript版:16章 詳細アウトライン📚🧭✨
第1章 依存ってなに?TSの依存はまず「import」から😱🔗
-
ゴール:依存=矢印➡️を体感する
-
学ぶこと
import/exportが増えると何が起きる?💥- 変更の波及/直しづらさ/把握コスト😵💫
-
ミニ演習👩💻
- 小さな関数を分割→import増加→影響範囲をメモ📝
-
AI🤖
- 「依存関係を箇条書き+簡易図で説明して」🗺️
第2章 Dependency Ruleのコア:「中心(方針)」を「外側(詳細)」から守る🧭🎯
-
ゴール:一言で説明できるようにする✨
-
学ぶこと
- 中心=業務ルール/外側=DB・HTTP・UI・SDK📦
- “変わりやすいもの”に支配されないのが正義💪
-
ミニ演習
- 例コードで「中心/外側」を色分け🎨
-
AI🤖
- 「中心と外側を分類して理由も」📌
第3章 “境界”の作り方入門①:まずはフォルダ境界でOK📁🧱
-
ゴール:迷わず始められる構造を作る😊
-
学ぶこと
src/domainsrc/appsrc/adaptersみたいな分け方🧅- 「境界=混ぜない約束」🤝
-
ミニ演習
- 空フォルダ+空ファイルで“地図だけ”作る🗺️
-
AI🤖
- 「この規模ならフォルダ構成どうする?」📦
第4章 “境界”の作り方入門②:パッケージ/monorepoはいつ必要?📦✨
-
ゴール:発展の選択肢を“怖くなく”知る🙂
-
学ぶこと
- workspace/monorepoのメリット(依存を物理的に切りやすい)✂️
- でも最初はやりすぎ注意(YAGNI)🐣
-
ミニ演習
- 「将来パッケージ化するとしたら分ける単位」を妄想メモ📝
-
AI🤖
- 「パッケージ化の判断基準をチェックリスト化して」✅
第5章 迷わない層モデル:Domain / Application / Adapters を決めよう🧅🗺️
-
ゴール:分類に迷う時間を減らす⏳
-
学ぶこと
- Domain=ルール、Application=手順、Adapters=外部I/O🚪
- 名前より「依存の向き」➡️が大事
-
ミニ演習
- 例:ToDoアプリの機能を3層に仕分け📝
-
AI🤖
- 「このクラスはどの層?理由つきで」💬
第6章 TypeScriptの武器:type/interfaceで“契約”を作る📜🧡
-
ゴール:中心は“実装”じゃなく“約束”を見る👀
-
学ぶこと
interface/typeで表す「欲しい能力」🧩- 契約の命名・粒度のコツ📛
-
ミニ演習
Clock/UserRepository/PaymentGatewayみたいな契約を作る✍️
-
AI🤖
- 「契約の名前候補を5つ出して」🪄
第7章 依存逆転(DIP)をTSで体験:中心→外側importを断つ🔄🚫
-
ゴール:中心が外側ライブラリに触らない状態を作る💪
-
学ぶこと
- 中心は契約だけ import
- 外側が実装して差し込む🧰
-
ミニ演習
- DB実装とインメモリ実装の差し替え🔁
-
AI🤖
- 「中心が外側importしてる箇所を指摘して修正案」🕵️♀️
第8章 Composition Root入門①:組み立て場所(entry)を決める🏗️📌
-
ゴール:「どこで実装を選ぶか」を固定する✨
-
学ぶこと
main.ts/server.tsに組み立てを集める- “中心は知らない”を徹底😌
-
ミニ演習
createApp()で依存をまとめて注入🧩
-
AI🤖
- 「entryのテンプレを作って」🧾
第9章 Composition Root入門②:DIコンテナ無しで回す設計パターン🧪🪶
-
ゴール:軽い依存注入の型を覚える😊
-
学ぶこと
- Factory関数/手動DI/設定で実装選択🔁
- テストで差し替えやすい形
-
ミニ演習
makeUseCases(deps)形式にしてテストでモック注入🧪
-
AI🤖
- 「手動DIのリファクタ案を出して」🔧
第10章 境界の設計①:DTO/変換をどこに置く?🚪📦
-
ゴール:層が混ざる事故を防ぐ🧼
-
学ぶこと
- API/DBの型とDomain型を分ける🫧
- 変換は境界(adapters)に置く🔁
-
ミニ演習
UserDto ↔ User変換を作って置き場所を固定📌
-
AI🤖
- 「変換関数の置き場所ルールを文章化」📜
第11章 境界の設計②:エラーも境界で翻訳しよう🧯🔁
-
ゴール:中心に“外側の例外”を漏らさない✨
-
学ぶこと
- 中心:ドメインエラー(Result型など)で表現🗣️
- 外側:HTTPステータスや例外に変換🌐
-
ミニ演習
Result<T, DomainError>を返すユースケースを作る🧪
-
AI🤖
- 「エラー分類と責任分界を提案して」✅
第12章 循環参照を倒す①:循環が起きる典型パターン🌀😵💫
-
ゴール:循環参照を“見抜ける”ようにする👀
-
学ぶこと
- 相互importの発生パターン
- 症状(初期化順、undefined、挙動が環境で変わる等)💥
-
ミニ演習
- 例で循環をわざと作って症状を観察🔬
-
AI🤖
- 「このimport関係、循環の可能性ある?」🕵️♀️
第13章 循環参照を倒す②:barrel(index.ts)と依存方向の整え方📦➡️
-
ゴール:循環を“構造で防ぐ”😊
-
学ぶこと
- barrel乱用で循環が増えやすい📦💥
- 解決の型:契約を切り出す/依存方向を揃える✂️➡️
-
ミニ演習
- barrelを減らして循環が解消するのを体験✨
-
AI🤖
- 「barrelを使う/使わない基準を作って」📏
第14章 shared/utils沼を回避①:共有していいもの・ダメなもの🕳️🐥
-
ゴール:sharedが“ゴミ箱化”しないようにする🧹
-
学ぶこと
- OK:純粋関数、薄い型、汎用的小道具
- NG:業務ルール寄せ集め、何でも屋サービス
-
ミニ演習
- shared候補をOK/NG/保留に分類⚖️
-
AI🤖
- 「このshared案、危険度と理由」🧠
第15章 shared/utils沼を回避②:契約(Contract)中心の共有にする📜🎯
-
ゴール:共有は“契約だけ”に寄せる🤝
-
学ぶこと
- 契約=他から参照されてもOKな“境界の言葉”
- “中心に置くべき共有”と“外側に閉じ込める共有”の違い🧭
-
ミニ演習
contracts/を作るなら何を置くか決める📦
-
AI🤖
- 「contractsに置くべきものリスト作って」📝
第16章 ルールを自動で守る:ESLint境界ルール+依存の見える化🛡️📈🏁
-
ゴール:お願いじゃなく仕組みで守る💪✨
-
学ぶこと
- Lintで「domain→adapters import禁止」みたいな強制🚫
- 依存を定期的に“見る”習慣(グラフ/チェック)👀
- CIに入れると未来の自分が助かる🤖
-
仕上げ演習🏁
-
ミニプロジェクト(ToDo等)を完成
-
チェックリスト✅
- 中心が外側をimportしてない?
- 契約は中心側?
- 変換/例外翻訳は境界?
- 循環とshared沼は防げてる?
- Lint/可視化で守れてる?
-
-
AI🤖
- PRテンプレ(レビュー観点)を作る💌
- ルール違反例と直し方を「教材用に」生成させる🪄
章構成の理由(やさしく)😊🌸
- つめこみやすい所(境界の選択、循環参照、Lint/運用)を分割して、 1章あたり“1テーマ”で消化できるようにしたよ📚✨