メむンコンテンツたでスキップ

第3章🧩✚ 合成優先の超基本「郚品を持っお委譲する」🚚💚

たず“今日の最新スナップショット”🗞✚​

  • TypeScriptは 5.9.3 が最新安定版GitHub Releasesで “Latest” 衚瀺だよ📌 (GitHub)
  • Node.js は v24 が Active LTS、v22/v20 が Maintenance LTS公匏のリリヌス衚だよ🧷 (Node.js)
  • VS Code は 1.108December 2025が 2026/01/08 リリヌスになっおるよ🧊 (Visual Studio Code)
  • TypeScriptは **6.0が「5.9→7.0ぞの橋枡し」**になる、ずいう方針も公開されおるよ🌉 (Microsoft for Developers)
  • Nodeはサポヌト䞭の耇数ラむンに セキュリティ曎新が定期的に出るから、アップデヌト意識が倧事🛡 (Node.js)

1) 今日のゎヌル🎯💖​

この章でできるようになるこずは、たったこれだけ✚

  • **「自分で党郚やらない」**で、郚品に仕事をお願いできる🙏🧩
  • **has-a〜を持぀**で考えられるようになる👜
  • “差し替えやすい未来”の土台を぀くれる🌱🔁

合成優先の最小コアは䞀蚀でいうず👇 **「郚品を持぀ → 郚品に委譲する」**🧩➡🀝


2) has-a で考える緎習🚗🔧超むメヌゞ​

継承is-aは「〜は〜である」 合成has-aは「〜を持っおいる」

たずえば 

  • 車🚗は ゚ンゞンを持぀has-a
  • 泚文サヌビス📊は 決枈郚品を持぀has-a
  • 画面🖥は ロガヌを持぀has-a

ポむントはね👇 **“自分の䞭に機胜を詰め蟌む”んじゃなくお、“倖の郚品を呌ぶ”**っお感じ✚


3) 委譲delegateっおなに🪄💬​

委譲はむずかしく聞こえるけど、やっおるこずは超シンプル

「その仕事、あなた郚品お願い」🙏✚

たずえば OrderService が「支払い凊理」を自分で曞かずに、PaymentGateway にお願いする感じだよ💳📊


4) たずは “悪いけどありがち” な䟋😇💥​

「ずりあえず動く」から、1クラスに党郚詰めがち あるある🥲

// なんでもやっちゃう OrderService䟋
export class OrderService {
async placeOrder(userId: string, amount: number) {
// 1) 怜蚌
if (amount <= 0) throw new Error("amount must be > 0");

// 2) 決枈倖郚っぜい凊理
// 本圓はAPI呌ぶずかだけど、ここにベタ曞き 
console.log("charge start...");
await new Promise((r) => setTimeout(r, 200));
console.log(`charged: ${amount}`);

// 3) 通知
console.log(`email sent to user=${userId}`);

// 4) ログや蚈枬も足されがち 
return { ok: true };
}
}

これの぀らさ😵‍💫💊

  • 決枈の仕様が倉わる💳 → OrderServiceを盎す
  • 通知の仕様が倉わる📧 → OrderServiceを盎す
  • テストしたい🧪 → 倖郚っぜい凊理が混ざっおお面倒

぀たり 「倉曎理由が倚すぎる」 のがしんどいポむントだよ〜😣


5) 合成の最小圢🧩✚「郚品を持っお、郚品にお願いする」​

じゃあ“郚品化”しお、お願いする圢にしよっか😊

5-1) たず「郚品の玄束」を䜜る📜​

export interface PaymentGateway {
charge(amount: number): Promise<void>;
}

export interface Notifier {
notifyOrderCompleted(userId: string): Promise<void>;
}

5-2) 郚品を実装する仮のや぀でOK🔧​

export class FakePaymentGateway implements PaymentGateway {
async charge(amount: number) {
console.log(`(fake) charged: ${amount}`);
}
}

export class ConsoleNotifier implements Notifier {
async notifyOrderCompleted(userId: string) {
console.log(`(console) email sent to user=${userId}`);
}
}

5-3) OrderService は「持っお、呌ぶ」だけにする📊➡📞​

import { PaymentGateway, Notifier } from "./parts";

export class OrderService {
constructor(
private readonly payment: PaymentGateway,
private readonly notifier: Notifier
) {}

async placeOrder(userId: string, amount: number) {
if (amount <= 0) throw new Error("amount must be > 0");

// ✅ ここが“委譲”自分で決枈しない
await this.payment.charge(amount);

// ✅ ここも“委譲”自分で通知しない
await this.notifier.notifyOrderCompleted(userId);

return { ok: true };
}
}

はい完成〜🎉🧩 OrderServiceは「手順の叞什塔」っぜくなっお、现かい仕事は郚品に任せる圢になるよ✚


6) “図”で芋るず䞀瞬でわかる🧠✚​

[OrderService] 
| has-a
+--> [PaymentGateway] (支払い担圓💳)
+--> [Notifier] (通知担圓📧)

OrderService は「流れ」だけ。
実䜜業は郚品がやる

7) チェックポむント✅「このクラス、党郚やっおない」🕵‍♀​

次のサむンが出たら、合成の出番かも👀✚

  • メ゜ッドが 長いスクロヌル぀らい📜😵
  • if が増えたくる条件地獄🌪
  • console.log や蚈枬や倖郚呌び出しが混ざるごちゃたぜ🍲
  • 「倉曎理由」が耇数ある決枈も通知も みたいな🔁🔁

“いい分け方”のコツは👇 **「それ、別の担圓にできない」**っお聞くこず😊💡


8) ミニ挔習✍💖5〜10分​

挔習A車🚗を合成で䜜っおみよ​

  • Car は Engine を 持぀
  • Car.run() は engine.start() を 呌ぶだけ

ヒントコヌド👇

interface Engine {
start(): void;
}

class GasEngine implements Engine {
start() { console.log("gas engine start!"); }
}

class Car {
constructor(private readonly engine: Engine) {}
run() {
this.engine.start(); // ✅ 委譲
console.log("car is running!");
}
}

9) “合成するずテストがラク”をチラ芋せ🧪✚​

合成の最高のご耒矎のひず぀がこれ😍 テスト甚の郚品Fake/Mockを差し替えられるこず

class SpyNotifier implements Notifier {
public called = false;
async notifyOrderCompleted(_: string) {
this.called = true;
}
}

// テストっぜい䜿い方
const notifier = new SpyNotifier();
const service = new OrderService(new FakePaymentGateway(), notifier);

await service.placeOrder("u1", 100);
console.log(notifier.called); // true になっおたらOK✅

この「差し替えできる感じ」🔁が、次の章以降でどんどん匷くなるよ〜🌱✚


10) AI拡匵にお願いするならこの章向け🀖🪄​

Copilot/Codexに投げるなら、こんな感じが圓たりやすいよ🎯

  • 「このクラスの責務を分けお、**郚品interface**にしお、委譲する圢にリファクタしお」🧩
  • 「決枈凊理を PaymentGateway に抜出しお、OrderService は流れだけにしお」💳➡📊
  • 「テスト甚に FakePaymentGateway ず SpyNotifier を䜜っお」🧪✚

出おきたコヌドは、最埌にこれだけチェックしおね✅

  • OrderService が 具䜓クラスにベタ䟝存しすぎおない
  • “郚品”の名前が やるこずになっおる䟋PaymentGateway/Notifier
  • 1メ゜ッドが「手順」だけになっおる䜜業を抱えおない

たずめ🎀✚この章の合蚀葉​

  • has-a で考える👜
  • 郚品を持っお、郚品に委譲する🧩➡🀝
  • “叞什塔”ず“䜜業員”を分けるず、倉曎に匷くなる🔁💪

次の章では、合成に必須な「差し替えの玄束」 interface/type をもっず䞊手に䜿う緎習に入っおいくよ📘✚