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

TypeScript版「依存性注入(DI)/IoC」30章アウトライン(Windows / VS Code / AIあり)💉🧩🪟

TypeScript版は「型が実行時に消える」「関数DIが強い」「import/環境依存が地雷」あたりが主役になるので、そこに合わせて30章で“詰め込みなし”の詳細アウトラインにするね📚🌸 (Windows+VS Code前提、Copilot/Codex等AI導入済み🤖✨)

第1章 はじめに:DIで得することを先に知ろう🎁✨

  • 目標:DIのメリットを3つ言える😊
  • 中身:変更に強い/テストしやすい/差し替えできる🔄
  • ミニ課題:DIが役立ちそうな場面を3つメモ📝
  • AI🤖:説明文を「友達に話す口調」にしてもらう

第2章 “依存”ってなに?TSの依存あるあるで理解🔗

  • 目標:依存=「それがないと困る相手」と言える
  • 例:Date.now Math.random fetch localStorage process.env console⏰🎲🌐
  • ミニ課題:手元のコードで依存を3つ探す🔎

第3章 失敗例①:直接import&直叩きがつらい😣📦

  • 目標:差し替え不能が何を壊すか分かる
  • 中身:本番環境依存/テスト不能/変更が怖い💥
  • ミニ課題:依存箇所にコメントで「外部!」印を付ける🟥

第4章 失敗例②:new直書きの“固定化”問題🧱

  • 目標:newが散らばると何が困るか分かる
  • 中身:差し替え不能/構成変更が地獄
  • ミニ課題:newの場所を1か所に集める案を考える📍

第5章 まず最小のDI:引数で渡すだけでDI💉

  • 目標:DI=「外から渡す」だけ、と言える
  • 中身:依存を引数にする発想チェンジ🔁
  • ミニ課題:Date.now()clock.now() に置き換える設計案⏰

第6章 超重要:TSは型が実行時に消える👻(ここがC#と違う!)

  • 目標:なぜTSで「型だけの自動解決」が難しいか分かる
  • 中身:interfaceは実行時に存在しない⚠️
  • ミニ課題:「型は消える」ことを一文で説明📝
  • AI🤖:例え話を3案出してもらう

第7章 関数DI①:依存をまとめて渡す(deps注入)👜

  • 目標:depsオブジェクト注入ができる
  • 中身:引数地獄を回避する基本形
  • ミニ課題:依存3つを deps にまとめて読みやすくする📖

第8章 関数DI②:カリー化DI(deps→入力→出力)🍛✨

  • 目標:テストしやすい関数構造が作れる
  • 中身:makeX(deps)(input) みたいな形
  • ミニ課題:乱数依存を引数化してテストを安定させる🎲✅

第9章 関数DI③:PureロジックとI/Oを切り分ける🍱

  • 目標:I/O境界の感覚をつかむ
  • 中身:中心は純粋、外側でI/O
  • ミニ課題:I/O行に「I/O」コメントを付けて分離案を書く✂️

第10章 クラスDI①:コンストラクタ注入(TSでも王道)🏗️💉

  • 目標:クラスでも安全に注入できる
  • 中身:必須依存はコンストラクタで固定📌
  • ミニ課題:サービスクラス1つをコンストラクタ注入にする

第11章 クラスDI②:メソッド注入(必要な時だけ)🧤

  • 目標:一時的依存の扱いが分かる
  • 中身:処理ごとに違うものだけ引数へ
  • ミニ課題:export時だけ必要なformatterを引数注入📄

第12章 クラスDI③:プロパティ注入の落とし穴🕳️⚠️

  • 目標:プロパティ注入を乱用しない判断ができる
  • 中身:未設定/undefined事故、必須が見えない🙈
  • ミニ課題:わざと事故→コンストラクタ注入に修正🔧

第13章 IoC入門:組み立ての主導権を外へ🌀

  • 目標:IoC=“組み立ては外側”を理解
  • 中身:作る場所と使う場所を分ける
  • ミニ課題:依存の生成場所を決める(どこ?)📍

第14章 Composition Root:newとimportの集中管理📍🧹

  • 目標:newを1か所に集められる
  • 中身:bootstrap()main()が起点
  • ミニ課題:起動フロー図(箱と矢印)📦➡️📦

第15章 Factoryパターン:TSの現実解🏭✨

  • 目標:手動DIを“キレイに保つ”方法が分かる
  • 中身:createX(deps) で生成を隠す
  • ミニ課題:Composition Rootを読みやすく分割📚

第16章 DIP入門:上位が下位に引きずられない設計🔁

  • 目標:DIとDIPを混同しない
  • 中身:“契約(型)”に依存する📜
  • ミニ課題:ApiClient型を用意して本物/ダミー差し替え🔄

第17章 SoC強化:I/Oアダプタを薄くする🚚✨

  • 目標:外部I/Oは端っこに押し出せる
  • 中身:fetch/Storage/Envはアダプタ側へ
  • ミニ課題:fetch直叩きを HttpClient 風に包む🌐

第18章 環境依存①:ブラウザ/Nodeの差をDIで吸収🪟🌐

  • 目標:環境が変わっても壊れにくい構造が分かる
  • 中身:localStorage と Node側の保存先を差し替え
  • ミニ課題:StorageAdapterを2実装にする🗄️🔄

第19章 環境依存②:設定(env)をDIで安全に扱う🎛️

  • 目標:process.env直読みを避けられる
  • 中身:Configオブジェクト化
  • ミニ課題:Config注入でテスト容易にする✅

第20章 import地獄対策①:境界ルールを1つ決める📦🚫

  • 目標:依存の向きのルールを持てる
  • 中身:例「domainはinfraをimportしない」
  • ミニ課題:違反importを1つ減らす✂️

第21章 import地獄対策②:フォルダを3層で整理🗂️

  • 目標:迷子にならない構成を作れる
  • 中身:domain / app / infra(または core / adapters / entry
  • ミニ課題:今のプロジェクトをこの形に当てはめる🧩

第22章 テスト①:Fakeで“安定テスト”を作る🧪💖

  • 目標:DIでテストが楽になるのを体感
  • 中身:Clock/RandomをFakeにする
  • ミニ課題:時間依存のテストを安定化⏰✅

第23章 テスト②:Spyで“呼ばれ方”を確認する🕵️‍♀️📞

  • 目標:相互作用テストができる
  • 中身:logger/apiが何回・何で呼ばれたか
  • ミニ課題:呼び出し回数&引数の検証を書く✅

第24章 テスト③:境界のテスト方針(何をMockにする?)🎯

  • 目標:Mock乱用を避ける判断ができる
  • 中身:中心はFake、外側だけMock、という方針🌿
  • ミニ課題:Mockにすべき対象を3つ分類🗂️

第25章 DIコンテナは必要?導入判断を身につける🎯🧰

  • 目標:導入条件を説明できる
  • 中身:手動で苦しい時だけでOK(YAGNI)
  • ミニ課題:導入する/しないの判断チェック表を作る📝

第26章 超軽量コンテナ自作:Mapで“仕組み”を理解🗺️✨

  • 目標:コンテナが怖くなくなる
  • 中身:token→factory登録→resolve
  • ミニ課題:3サービスを登録&解決して動かす🔁

第27章 token設計:文字列?Symbol?安全な選び方🔑

  • 目標:TSのコンテナで重要なtoken設計が分かる
  • 中身:衝突回避、見通しの良さ
  • ミニ課題:token命名ルールを決める📛

第28章 実用コンテナ:デコレータ無し流派で現実運用🧰😊

  • 目標:TSの現場で安全に使える形を知る
  • 中身:Factory登録中心/依存解決は外側で
  • ミニ課題:Composition Root+コンテナ併用例を作る📍

第29章 デコレータDI(Nest系)の世界:使うなら守ること✨⚠️

  • 目標:メタ情報系DIのメリデメを理解
  • 中身:設定や制約、ハマりポイントだけ紹介(深追いしない)
  • ミニ課題:採用するならルール3つを書く📜

第30章 アンチパターン総まとめ&総合演習🎀🏁

  • 目標:地雷を避けつつ、ミニアプリを完成させる

  • 地雷3つ:Service Locator化🕳️/グローバルSingleton乱用👑/循環import🌀

  • 総合演習:ToDo/学習記録/家計メモなどで

    • 依存は最大3つ(clock/logger/storage or api)に制限😊
    • DI→Composition Root→テスト1〜3本🧪
  • AI🤖:設計レビュー(責務/境界/依存の向き)テンプレで最終チェック✅