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

「合成優先(継承よりComposition)」17章・詳細アウトライン📚🧩✨

第1章✨「合成優先」って何を目指すの?🤔🧩

  • この講座でできるようになること🎯

    • 継承で書いたコードを「部品の組み合わせ」に直せる🔧✨
    • 変更に強い形(差し替えやすい形)を作れる🔁
  • 今日から使う合言葉🪄

    • is-a(〜は〜である)より has-a(〜を持つ)
  • ざっくり比較🆚

    • 継承:親子関係👨‍👧
    • 合成:チーム編成🤝
  • VS Code準備(Windows前提)🪟💻

    • TypeScriptプロジェクトの最低限(実行できればOK)
    • AI拡張(Copilot/Codex等)は使える前提🤖✨

第2章:まずは敵を知る😇 継承で起きがちな事故あるある💥

  • “ちょい違い派生”が増えてツリーが爆発🌳💣
  • 親の変更が子に伝染して壊れる😱
  • 「Aの機能もBの機能も…」で詰む(組み合わせ問題)🧩🧩
  • ミニ例:UserAdminUserSuperAdminUser…みたいな地獄👻
  • ここでの学び📌:継承は「共通化」より「強い結びつき」が怖い

第3章🧩✨ 合成優先の超基本「部品を持って委譲する」🚚💨

  • has-a で考える練習🚗🔧(車はエンジンを“持つ”)

  • **委譲(delegate)**ってなに?🪄

    • 自分でやらずに、部品にお願いする🙏
  • 最小構成の例(概念)

    • OrderServicePaymentGateway を持って呼ぶ
  • チェックポイント✅

    • クラスが“全部やってない”?(責務の混ざりを検知)🕵️‍♀️

第4章:TypeScriptで合成するための道具箱① interface / type 📘✨

  • interfacetype の役割(初心者でも迷わない使い分け)🧠

  • 「差し替え可能」にする最低条件🔁

    • “同じメソッド名・同じ引数・同じ戻り値”の約束📜
  • ミニ演習✍️

    • Logger(console版/テスト版)を用意して差し替える📝

第5章:依存を「外から渡す」🚚💨(=差し替えできる設計の入口)🧩✨

  • newしちゃうと差し替えできない問題😵
  • コンストラクタで受け取る(基本形)📦
  • 例:Clockを渡して時間依存を外に出す⌚
  • “DIコンテナは今は使わない”でOK👌(必要になったら)

第6章:合成の第一歩🧩「小さな責務」に分けるコツ✂️✨

  • 責務ってなに?(変更理由の単位)🧠

  • 分割のコツ3つ🍀

    1. 名前が「and」を含んだら分割候補
    2. ifが増えたら分割候補
    3. テストが書きにくかったら分割候補
  • ミニ演習✍️

    • でかい関数を「検証」「計算」「保存」に割る✅🧮💾

第7章:合成の型① Strategy(戦略)で差し替える🧠🔁🚚✨

  • どんな時に使う?

    • 「やり方だけ変えたい」例:送料、割引、並び替え💡
  • 例題📦

    • ShippingStrategy(通常/速達/海外)を差し替える🚚✈️
  • 継承でやると何が起きる?😇

    • FastOrder OverseasOrder 乱立問題💣
  • 演習✍️

    • 既存のif分岐をStrategyに置き換える🔧

第8章:Strategyの設計ポイント✨「どこを差し替え点にする?」🎯🧩

  • 差し替え点が大きすぎると難しい🙃

  • 差し替え点が小さすぎるとバラバラになる😵‍💫

  • “入力と出力”を揃えると交換しやすい🔁

  • 演習✍️

    • Strategyのinterfaceを自分で決めてみる(答え合わせ付き)✅

第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_casecamelCaseに直す🐍➡️🐫
  • DTO変換の基本(mapping)🗺️

  • 演習✍️

    • 外部データ→自分の型へ変換するAdapterを書く

第14章✨ Adapter応用「境界を守る」感覚を育てる🧼🛡️

  • ドメイン(中心)を汚さないための置き場所🏠

  • 命名のコツ:XxxAdapter XxxClient XxxMapper など📝

  • “変換が増えたら”整理の仕方📦

  • 演習✍️

    • 複数の外部形式を同じ内部形式に統一する🔁

第15章:継承 vs 合成:実戦の判断基準🧭🙂✨

  • 継承が向く条件✅

    • is-a が自然/差分が小さい/置換できる(LSP的な感覚)
  • 合成が向く条件✅

    • 組み合わせが増える/差し替えたい/テストしたい
  • “迷ったらここを見る”チェック表📋

  • ミニ演習✍️

    • 例題を見て「継承 or 合成」を判定するクイズ形式🎮

第16章:AI拡張を味方にする🤖✨(プロンプト&レビュー観点)

  • Copilot/Codexに頼むと強いお願い例🗣️

    • 「この継承コードを合成にリファクタして」🔁
    • 「Strategyに分離して、interfaceも作って」🧩
    • 「Decoratorでログを追加して」🎀
  • でも丸投げは危険⚠️

    • チェック観点:責務/依存/命名/テストしやすさ👀✅
  • 演習✍️

    • AI出力をレビューして改善する(人間が仕上げる)🔧✨

第17章:総合課題🎓✨「継承地獄を合成に救出しよう!」🚑🧩

  • 課題ストーリー📖

    • “派生が増えすぎたサービス”を立て直す
  • ゴール🎯

    • Strategyで差し替え🔁
    • Decoratorで横断機能を外付け🎀
    • Adapterで外部を包む🎁
  • 仕上げチェック✅

    • 変更が怖くない?
    • テストしやすい?
    • 「部品の交換」ができる?
  • 発展(余裕ある人向け)🌟

    • DIコンテナ導入は“必要になったら”でOK👌