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.nowMath.randomfetchlocalStorageprocess.envconsole⏰🎲🌐 - ミニ課題:手元のコードで依存を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🤖:設計レビュー(責務/境界/依存の向き)テンプレで最終チェック✅