依存性注入
2020年4月10日 (金) 01:52時点におけるAdministrator (トーク | 投稿記録)による版 (ページの作成:「'''依存性注入'''(読み:いぞんせいちゅうにゅう、英語:Dependency Injection、通称: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内部の状態までは気にしなくてもよくなる。