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

依存関係ルール(Dependency Rule)TypeScript版:16章 詳細アウトライン📚🧭✨

第1章 依存ってなに?TSの依存はまず「import」から😱🔗

  • ゴール:依存=矢印➡️を体感する

  • 学ぶこと

    • import/export が増えると何が起きる?💥
    • 変更の波及/直しづらさ/把握コスト😵‍💫
  • ミニ演習👩‍💻

    • 小さな関数を分割→import増加→影響範囲をメモ📝
  • AI🤖

    • 「依存関係を箇条書き+簡易図で説明して」🗺️

第2章 Dependency Ruleのコア:「中心(方針)」を「外側(詳細)」から守る🧭🎯

  • ゴール:一言で説明できるようにする✨

  • 学ぶこと

    • 中心=業務ルール/外側=DB・HTTP・UI・SDK📦
    • “変わりやすいもの”に支配されないのが正義💪
  • ミニ演習

    • 例コードで「中心/外側」を色分け🎨
  • AI🤖

    • 「中心と外側を分類して理由も」📌

第3章 “境界”の作り方入門①:まずはフォルダ境界でOK📁🧱

  • ゴール:迷わず始められる構造を作る😊

  • 学ぶこと

    • src/domain src/app src/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テーマ”で消化できるようにしたよ📚✨