依存性注入

提供: MonoBook
2020年4月10日 (金) 01:55時点におけるAdministrator (トーク | 投稿記録)による版 (→‎DIを利用する)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

依存性注入(読み:いぞんせいちゅうにゅう、英語: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言語グローバル変数より悲惨なことになりがちが「階層化の有害性」が低減される。

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