🐣

DI(依存性注入)を小学生でもわかるように説明してみる🚗

2024/07/31に公開

概要

DI(依存性注入)は「高凝集・低依存で実現するために良い手段」ということは知っているが、DI(依存性注入)の仕組みについてわかるようでわからなかったのでまとめる。

DI(依存性注入)とは?

あるオブジェクトが他のオブジェクトに依存している時、その依存するオブジェクトを自分で作るのではなく他人に注入してもらう仕組みのこと。

小学生でもわかるように説明すると・・・👦

あなたが車を作るときに「タイヤ」が必要です🛞
あなたが「タイヤ」を作るのではなく、
友達が「タイヤ」を持っていて
それをあなたの車に取り付けてくれるのです🚗
これを、DI(依存性注入)といいます。

TypeScriptで表現してみる

typeScriptでの一例
// タイヤのインターフェース
interface Tire {
    getTireType(): string; // タイヤの種類を取得するメソッド
}

// タイヤの実装
class RubberTire implements Tire {
    getTireType(): string {
        return "ゴムのタイヤ"; // ゴムのタイヤの種類を返す
    }
}

// 車のクラス
class Car {
    private tire: Tire; // 車が持つタイヤの型

    //DI(依存性注入)
    constructor(tire: Tire){
        this.tire = tire; //外から注入されたタイヤを使う
    }
    drive() {
        console.log(`車が走ります。タイヤの種類: ${this.tire.getTireType()}`);
    }
}

// 使用例

// タイヤを作る
const myTire = new RubberTire();
// 車にタイヤを注入
const myCar = new Car(myTire);
// 結果 「車が走ります。タイヤの種類:ゴムのタイヤ」
myCar.drive();

なぜ「インターフェース」と「タイヤの実装」に分けるのか

  • 変更の容易性
    • 手段と、具体的な実装に分けることでRubberTireSportTireなどタイヤの種類を簡単に変えていくことができる

🙋インターフェースは「オートバックスなどのタイヤを取り付けしてくれる手段を提供してくれる場所」と捉えるとわかりやすい!その手段を決めておくことで、オートバックスで扱っている「ゴムのタイヤ」「冬用のタイヤ」「軽自動車用のタイヤ」を取り付ける(Tireインターフェースをimplementsしたクラスが取り扱いタイヤ商品の一覧となっていく)と考えるとわかりやすい。

DI(依存性注入)のメリットをまとめると

  1. 変更容易性:「ゴムのタイヤ」から「冬用のタイヤ」に変えたくなった時でも車自体を変える必要はなくなる
  2. テスト容易性:テストをする時に「ゴムのタイヤ」部分に「テスト用タイヤ」を注入することができるためテストが容易になる
  3. 安全性:注入されるクラスは、インターフェースを実装しているクラスであることが担保される

🙋3.を噛み砕いて説明をすると「オートバックス以外の手段でつけたタイヤは取り付けお断り」とタイヤの質が担保されるという意味だよ!

前述のコードの一部を抜粋
    // 「Tire」インターフェースを「tire」という名前で引数を受け取りクラスをオブジェクト化するよ!
    // つまり「Tire」インターフェースの型から作った以外のタイヤはお断りしているよ!
    constructor(tire: Tire){
        // Carクラスのインスタンス変数「this.tire」として、先ほどの「tire」を注入するよ!
        this.tire = tire;
    }

Discussion