「合成優先(継承よりComposition)」17章・詳細アウトライン📚🧩✨
第1章✨「合成優先」って何を目指すの?🤔🧩
-
この講座でできるようになること🎯
- 継承で書いたコードを「部品の組み合わせ」に直せる🔧✨
- 変更に強い形(差し替えやすい形)を作れる🔁
-
今日から使う合言葉🪄
- is-a(〜は〜である)より has-a(〜を持つ)
-
ざっくり比較🆚
- 継承:親子関係👨👧
- 合成:チーム編成🤝
-
VS Code準備(Windows前提)🪟💻
- TypeScriptプロジェクトの最低限(実行できればOK)
- AI拡張(Copilot/Codex等)は使える前提🤖✨
第2章:まずは敵を知る😇 継承で起きがちな事故あるある💥
- “ちょい違い派生”が増えてツリーが爆発🌳💣
- 親の変更が子に伝染して壊れる😱
- 「Aの機能もBの機能も…」で詰む(組み合わせ問題)🧩🧩
- ミニ例:
User→AdminUser→SuperAdminUser…みたいな地獄👻 - ここでの学び📌:継承は「共通化」より「強い結びつき」が怖い
第3章🧩✨ 合成優先の超基本「部品を持って委譲する」🚚💨
-
has-a で考える練習🚗🔧(車はエンジンを“持つ”)
-
**委譲(delegate)**ってなに?🪄
- 自分でやらずに、部品にお願いする🙏
-
最小構成の例(概念)
OrderServiceがPaymentGatewayを持って呼ぶ
-
チェックポイント✅
- クラスが“全部やってない”?(責務の混ざりを検知)🕵️♀️
第4章:TypeScriptで合成するための道具箱① interface / type 📘✨
-
interfaceとtypeの役割(初心者でも迷わない使い分け)🧠 -
「差し替え可能」にする最低条件🔁
- “同じメソッド名・同じ引数・同じ戻り値”の約束📜
-
ミニ演習✍️
Logger(console版/テスト版)を用意して差し替える📝
第5章:依存を「外から渡す」🚚💨(=差し替えできる設計の入口)🧩✨
- newしちゃうと差し替えできない問題😵
- コンストラクタで受け取る(基本形)📦
- 例:
Clockを渡して時間依存を外に出す⌚ - “DIコンテナは今は使わない”でOK👌(必要になったら)
第6章:合成の第一歩🧩「小さな責務」に分けるコツ✂️✨
-
責務ってなに?(変更理由の単位)🧠
-
分割のコツ3つ🍀
- 名前が「and」を含んだら分割候補
- ifが増えたら分割候補
- テストが書きにくかったら分割候補
-
ミニ演習✍️
- でかい関数を「検証」「計算」「保存」に割る✅🧮💾
第7章:合成の型① Strategy(戦略)で差し替える🧠🔁🚚✨
-
どんな時に使う?
- 「やり方だけ変えたい」例:送料、割引、並び替え💡
-
例題📦
ShippingStrategy(通常/速達/海外)を差し替える🚚✈️
-
継承でやると何が起きる?😇
FastOrderOverseasOrder乱立問題💣
-
演習✍️
- 既存のif分岐をStrategyに置き換える🔧
第8章:Strategyの設計ポイント✨「どこを差し替え点にする?」🎯🧩
-
差し替え点が大きすぎると難しい🙃
-
差し替え点が小さすぎるとバラバラになる😵💫
-
“入力と出力”を揃えると交換しやすい🔁
-
演習✍️
- Strategyの
interfaceを自分で決めてみる(答え合わせ付き)✅
- Strategyの
第9章:TypeScriptらしい合成① 関数をStrategyにする🎛️✨
-
TSは関数でやると軽い!🪶
-
type Discount = (price) => numberみたいな感じ😎 -
例題🛒
- 割引ロジックを関数で差し替え
-
演習✍️
- 「関数版」と「class版」を両方作って違いを体感する🔍
第10章:合成の型② Decorator入門🎀➕(まずはログだけ!)📝✨
-
目的:元の処理は変えずに、機能を外付けする✨
-
まずは1個だけ:ログ追加📝
-
ラップ構造を図で理解🧠(呼び出しの流れ)
-
演習✍️
ServiceにログDecoratorをかける
第11章:Decorator応用⏱️📈🔁(計測・リトライの“考え方”)
-
計測(処理時間)を追加する⏱️
-
リトライの注意点(無限リトライ怖い😱)
-
ここでの超重要ポイント📌
- Decoratorは「横断的関心ごと」を外に出すのに強い✨
-
演習✍️
- ログ+計測を“重ねる”🧁🎀
第12章:Decorator設計の落とし穴回避🕳️🛑🎀
-
どこまでDecoratorでやる?(やりすぎ注意)⚠️
-
例:ビジネスルールまでDecoratorに入れると事故る😇
-
“責務の境界”チェックリスト✅
- これは本当に横断?
- 本体の責務は増えてない?
-
演習✍️
- 悪い例を直して良い形にする🔧✨
第13章:合成の型③ Adapter入門🎁🔌(型を合わせるだけ)
-
目的:外部の形をそのまま中に入れない🚧
-
超シンプル例:
- 外部APIの
snake_caseをcamelCaseに直す🐍➡️🐫
- 外部APIの
-
DTO変換の基本(mapping)🗺️
-
演習✍️
- 外部データ→自分の型へ変換するAdapterを書く
第14章✨ Adapter応用「境界を守る」感覚を育てる🧼🛡️
-
ドメイン(中心)を汚さないための置き場所🏠
-
命名のコツ:
XxxAdapterXxxClientXxxMapperなど📝 -
“変換が増えたら”整理の仕方📦
-
演習✍️
- 複数の外部形式を同じ内部形式に統一する🔁
第15章:継承 vs 合成:実戦の判断基準🧭🙂✨
-
継承が向く条件✅
- is-a が自然/差分が小さい/置換できる(LSP的な感覚)
-
合成が向く条件✅
- 組み合わせが増える/差し替えたい/テストしたい
-
“迷ったらここを見る”チェック表📋
-
ミニ演習✍️
- 例題を見て「継承 or 合成」を判定するクイズ形式🎮
第16章:AI拡張を味方にする🤖✨(プロンプト&レビュー観点)
-
Copilot/Codexに頼むと強いお願い例🗣️
- 「この継承コードを合成にリファクタして」🔁
- 「Strategyに分離して、interfaceも作って」🧩
- 「Decoratorでログを追加して」🎀
-
でも丸投げは危険⚠️
- チェック観点:責務/依存/命名/テストしやすさ👀✅
-
演習✍️
- AI出力をレビューして改善する(人間が仕上げる)🔧✨
第17章:総合課題🎓✨「継承地獄を合成に救出しよう!」🚑🧩
-
課題ストーリー📖
- “派生が増えすぎたサービス”を立て直す
-
ゴール🎯
- Strategyで差し替え🔁
- Decoratorで横断機能を外付け🎀
- Adapterで外部を包む🎁
-
仕上げチェック✅
- 変更が怖くない?
- テストしやすい?
- 「部品の交換」ができる?
-
発展(余裕ある人向け)🌟
- DIコンテナ導入は“必要になったら”でOK👌