DI(Dependency Injection・依存性の注入)とは?

DIとはDependency Injectionの略で、日本語では「依存性の注入」と呼ばれます
依存関係にある処理を呼び出し元から渡してやる(注入する)事をDIと言います。

DIのサンプルコード

TypeScriptでDIを行うサンプルを示します。
以下の処理を行うExampleUseCaseというクラスがあるとします。
この段階ではまだDIは行っていません。

  • ①通信を行う(ビットコインの価格を取得する)
  • ②通信結果から文字列を組み立てて返す
class ExampleUseCase {
    async getBitcoinPrice() {
        // ①通信を行う(ビットコインの価格を取得する)
        const url = "https://api.binance.com/api/v3/trades?symbol=BTCUSDT";
        const response = await axios.get(url);
        const price = response.data[0].price;

        // ②通信結果から文字列を組み立てて返す
        return "Bitcoin Price: " + price;
    }
}

DIを行う形に書き換えると以下になります。
「①通信を行う」の処理をBitcoinPriceReaderという別のクラスに切り出し、コンストラクタで受け取るようにしています。

class ExampleUseCase {
    private bitcoinPriceReader: IBitcoinPriceReader;

    // コンストラクタ
    constructor(bitcoinPriceReader: IBitcoinPriceReader) {
        // BitcoinPriceReaderクラスのインスタンスを受け取り、プロパティに保持する
        this.bitcoinPriceReader = bitcoinPriceReader;
    }

    async getBitcoinPrice() {
        // ①通信を行う(ビットコインの価格を取得する)
        // プロパティに保持しているインスタンスから通信処理を呼び出す
        const price = await this.bitcoinPriceReader.getBitcoinPrice();

        // ②通信結果から文字列を組み立てて返す
        return "Bitcoin Price: " + price;
    }
}

これがDIの基本になります。

DIを行うメリット

上記の例で言えば、ExampleUseCaseクラスを利用する際に、通信部分を別の実装に置き換えられます。
例えばテストコードを作成する際に通信部分をモックに置き換えたり、複数の接続先がある場合、接続先に応じて実装を切り替えたりできます。

副作用を含む処理に対してテストコードを記述する際に、頻繁に活用するテクニックになりますので是非覚えておきましょう。

次に読むべき記事

プログラムにおける副作用(Side Effect)とは?
プログラムにおけるモックとは?

「DI(Dependency Injection・依存性の注入)とは?」への2件のフィードバック

コメントする