DIとかDIコンテナとか(WIP)

 

DIとかDIコンテナとか正直全然わかってなかったので、調べてみた。

 

DIとは

デザインパターン(設計思想)の一つ。
Dependency Injectionの略。
依存性の注入とか言われてるが、実際にはオブジェクトの注入。
 

DIは三種類ある

・コンストラクタインジェクション
・セッターインジェクション
・フィールドインジェクション
 

下記はコンストラクタインジェクション

class  A{
    public a_method(){
        ~なんらかの処理~
    }
}

DIじゃない場合

class B {
    private A a;

    public B(){
    this.a = new A();
    } 

    public void do(){
        a.a_method();
    }
} 

DIの場合

class B {
 private A a;

    public B(A a){
    this.a = a
    }

    public void do(){
        a.a_method();
    }
}

 

DIじゃない時はAをnewしてる(BはAに依存している)けど、
DIの時は外部からAのオブジェクト(DIコンテナでnewしている)を注入している。


この場合依存というのは
「クラスA を動かすためにはクラスBが必要」
ということ。

また、もしAのコンストラクタが引数を持っていた場合、

 

DIの何がいいのか

 

 ・単体テストがしやすくなる。
DIをしていると(疎結合状態)、Bクラスの外からAのオブジェクトを注入できるので、Aクラスの実装がされてなくてもそこをモック化してテストが書ける。
DIをしていない場合(密結合)、Bクラスのテストを書くときはAクラスの実装もされていないと書けない。(書けるとおもう)

疎結合により柔軟性が高くなる
外部からオブジェクトを渡すので、環境によって設定値を変えたりできる。
また、DIをしていない場合、Bクラスの実装をいじってなくてもAクラスの実装をいじった際に、Bクラスのテストが壊れてしまう可能性が高い。
結合テストならいいけど、単体テストとしてはNG)

DIコンテナとは

DIを実現するためのフレームワークみたいなもの。
コンテナ内でオブジェクトを生成し(new)、それを注入していく。



疲れたのでここで一旦終わり。
わかったことがあったら随時更新していく。(するかな、、、笑)