2015年3月16日月曜日

知らない人向け DI(Dependency Injection)の説明

DIについて調べたので簡単に説明します

DIとは

  • クラス同士の依存関係を設定する仕組みを作ること
具体的に説明すると
  • クラス内のメンバ変数(インスタンス)をセットするための注入関数を用意して、注入関数をクラス外部から呼び出すこと
です。

DIを利用するメリット

  1. 柔軟性が生まれる
  2. テストしやすくなる(テストコードが書きやすい)

実例を見せましょう。
Javaのソースコードで具体例を示します。説明のために細かいところは省きます。

DI が無いコード

public class Factory {
  public void run() {
    System.out.println("Factory run");
  }
}

public class Manager {
  private Factory factory;

  public Manager() {
    factory = new Factory();
  }
  public void runFactory() {
    factory.run();
  }
}

public class DITest {
  public static void main(String[] args) {
    Manager manager = new Manager();
    manager.runFactory();
  }
}
ManagerクラスがFactoryクラスのインスタンス変数をメンバとして保持しているので、ManagerとFactoryは依存関係にあることが分かります。
Factoryクラスのインスタンス変数はManagerクラス内部で生成されています。

DI があるコード

public interface Factory {
  void run();
}

public class PencilFactory implements Factory {
  public void run() {
    System.out.println("Pencil Factory run");
  }
}

public class Manager {
  private Factory factory;
  public void setFactory(Factory f) {
    factory = f;
  }
  public Manager() {
  }
  public void runFactory() {
    factory.run();
  }
}

public class DITest {
  public static void main(String[] args) {
    Manager manager = new Manager();
    manager.setFactory(new PencilFactory());
    manager.runFactory();
  }
}
インターフェースが利用され、変数をセットするためのsetFactory関数が実装されています。
Factoryのインスタンス変数は、Managerクラスの外部(DITest)からsetFactory関数を通じて設定されています。
これが依存性の注入(DI、Dependency Injection)です。


ここで、DIのメリットについてもう一度確認してみましょう。

DIを利用するメリット

  1. 柔軟性が生まれる
  2. テストしやすくなる(テストコードが書きやすい)

1については、インターフェースを利用することにより抽象的な実装が出来るようになりました。
クラス内変数を定義する際にインターフェースで定義することで、複数のクラスを受け入れる余裕が生まれました。

2については、インスタンスのモックアップを外部から設定することが出来るようになりました。
様々な条件に対するテストケースを作成するときに、インスタンス、つまり条件を外部から設定する機構が生まれました。

DIはデザインパターンにおける重要な概念です。
エンジニア初心者の方は、ぜひ覚えておきましょう。

0 件のコメント :

コメントを投稿