依存性注入
依存性注入(読み:いぞんせいちゅうにゅう、英語: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言語のグローバル変数より悲惨なことになりがちが「階層化の有害性」が低減される。
ツルッパゲ(インターフェース)になればどんなカツラ(依存性注入)もかぶれるぞ!