差分

ナビゲーションに移動 検索に移動

依存性注入

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

依存性注入を積極的に使う[[プログラミング]]のスタイルを「[[コンポーネント指向]]」と呼ぶらしい。
==概要==
その[[オブジェクト]]内で利用している別の[[オブジェクト]]を明示的に限定せず、 [[インターフェース]]だけを定義しておき、 利用時に設定ファイルなどから察して動的に読み込む(注入)という記述スタイルである。
==実装例==
まずは依存性注入の例を見てみよう。
===DIを利用しない===
<source lang="csharp">
class Hair {
}

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

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

class Hage : IHair {
}

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

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

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

案内メニュー