メインメニューを開く

依存性注入(読み:いぞんせいちゅうにゅう、英語:Dependency Injection、通称:DI)とは、 オブジェクト指向プログラミングにおけるカプセル化の際に、C言語グローバル変数より悲惨なことになりがちが「階層化の有害性」を低減しようと試みるコーディングスタイルのことである。

依存性注入を積極的に使うプログラミングのスタイルを「コンポーネント指向」と呼ぶらしい。

目次

概要編集

そのオブジェクト内で利用している別のオブジェクトを明示的に限定せず、 インターフェースだけを定義しておき、 利用時に設定ファイルなどから察して動的に読み込む(注入)という記述スタイルである。

実装例編集

まずは依存性注入の例を見てみよう。

DIを利用しない編集

class Hair {
}

class Human {
    Hair hair;
}

Humanは常に「Hairの状態」がどうなっているのか気にしなければならない。実装によっては単体テストをする際にも「Hairの状態」に応じた全パターンを試さなければならないなど悲惨なことになる。

プロジェクトが肥大化すると「Aクラスで利用しているBクラスで利用しているCクラスで利用しているZフィールド変数の状態まで把握していないとAクラスは正常に動作しない」などという状態に陥り、いわゆるデスマーチが発生する原因となっている。

DIを利用する編集

interface IHair {
}

class Hage : IHair {
}

class Human {
    IHair hair;
    public Human() {
        // hairに依存性を注入(hageを注入)
        // このでは省略しているが「harに代入するのはHageクラス」というのは
        // 設定ファイルで切り替えれるようにしておく。
        hair = new Hage();
    }
}

HumanはIHairインターフェースだけをもつ。

依存性注入を利用することでIHairインターフェースにどんなメソッドがあるかだけは気にする必要があるが、Hair内部の状態までは気にしなくてもよくなる。

これによりクラスごとの独立性が高まり、C言語グローバル変数より悲惨なことになりがちが「階層化の有害性」が低減される。

ツルッパゲ(インターフェース)になればどんなカツラ(依存性注入)もかぶれるぞ!