【いそんせいちゅうにゅう】

依存性注入(DI) とは?

最終更新:
💡 必要な部品は、自分で作らず外から受け取る

クラスなどが使う依存オブジェクトを、自分で生成する代わりに外部から受け取る設計。依存先の差し替えやテストをしやすくする。

📌 このページのポイント
依存性注入:部品を外から渡す中で作る場合注文の処理保存部品を自分で生成本物の保存部品生成処理と結び付く外から渡す場合本物/テスト用同じ役割の部品を選ぶ渡す注文の処理受け取った部品を使う外で組み立てて渡せば、コンテナなしでもDI
注文の処理が保存部品を使う例です。共通の役割に合う部品を外から渡すと、テスト用の代役にも差し替えやすくなります。
ひよこ ひよこ
「依存する部品」って、どういうこと?
ペンギン先生 ペンギン先生
たとえば注文を処理するクラスが、データを保存する部品を使うとするね。その保存の部品が依存先だよ。DIでは、注文クラスの中で保存の部品を作る代わりに、外で用意して渡すんだ。
ひよこ ひよこ
外から渡すと、何がうれしいの?
ペンギン先生 ペンギン先生
必要な役割をそろえた実装に差し替えやすくなるよ。テストでは本物のDBへ書く部品の代わりに、記録だけする代役を渡せる。インターフェースなどで役割を決めておくと、使う側が具体的な実装に依存しにくくなるんだ。
ひよこ ひよこ
どうやって部品を渡すの?
ペンギン先生 ペンギン先生
コンストラクタの引数として渡す方式や、セッターで設定する方式などがあるよ。Springでは必須の依存先にはコンストラクタ、任意の依存先にはセッターを使う考え方が示されている。どのクラスでも一つの方式が絶対に最適、というわけではないんだ。
ひよこ ひよこ
DIコンテナを使わないと、DIにならない?
ペンギン先生 ペンギン先生
自分で部品を作り、コンストラクタなどへ渡してもDIだよ。DIコンテナは、登録された設定からオブジェクトを作り、依存先を組み立てる道具。Springや.NETなどに仕組みがある。コンテナと設計の考え方は分けて覚えよう。
ひよこ ひよこ
全部の部品を差し替えられるようにすればいい?
ペンギン先生 ペンギン先生
必要な境界を考えて使おう。依存先が増えすぎると、クラスが多くの責任を持っていないか見直す手掛かりになる。コンテナを使う場合は、どこで登録したかだけでなく、部品をどのくらい共有し、いつ破棄するかも確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「依存性注入」って出てきたら「使う部品を外から渡してもらう設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Dependency Injection」 = 依存性注入
💬 Dependency(依存するもの)をInjection(注入する)。外から渡してもらう仕組みだよ

参考資料

← 用語集にもどる