web-dev-qa-db-ja.com

依存性注入はどのように結合を増加させるのですか?

ウィキペディアのページ 依存性注入、欠点セクション でこれがわかります:

依存性注入は、サブシステムのユーザーにそのサブシステムのニーズを提供することを要求することにより、結合を増やします。

依存性注入に対する記事 へのリンク付き。

依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。 カップリング が減少するはずです、いいえ?

何が欠けていますか?依存性注入はクラス間の結合をどのように増やしますか?

34
BЈовић

それで、私は何が欠けていますか?

依存性注入は、クラスとその依存性の間の結合を減らします。しかし、それはクラスとそのコンシューマー間の結合(コンシューマーがそれを作成するためにより多くの情報を必要とするため)と依存関係とそのコンシューマー(コンシューマーは使用する依存関係を知る必要があるため)を増やします。

多くの場合、これは適切なトレードオフです。クラスは、インターフェースを超えた依存関係の詳細を知っているべきではありません。コードの特定のビットを結び付けるのは、アプリケーションの責任ですすべき

45
Telastyn

データベース接続Sに依存するサブシステムDがあるとします。依存関係の注入がない場合、SDの使用方法と作成方法の両方を知っている必要があるため、SDの間には比較的緊密な結合があります。ただし、システムの残りの部分は、SDの間のこの依存関係に気付かないこともあります。

依存性注入を使用すると、SからDを作成する方法に関する知識を削除するため、SDの間の結合が緩くなります。 Sは、その使用方法を知っている必要があります。全体的な結合の増加は、システムのother部分がDと、場合によってはその作成方法を知る必要があるという事実から来ています。このカップリングの増加の程度は、Dへの依存関係がSにどのように注入されるかによって異なります。

  • コンストラクターインジェクションを使用する場合、Sの作成者はDへの依存関係、およびおそらく作成方法に関する知識が必要です。
  • メソッドレベルのインジェクションを使用すると、SがインジェクトされるDのメソッドの各呼び出し元は、Dへの依存関係、およびおそらくその作成方法に関する知識が必要です。

どちらの場合でも、Dに依存するクラスの数が増加し、Dを作成する方法に関する知識がシステムのどこかに存在する必要があります。これにより、全体的にカップリングが増加します。

それがカップリングを増加させることに強く反対します。

依存関係の注入がないと、サブシステムと依存関係の具体的な実装が密接に結合されます。

依存関係の注入により、サブシステムを依存関係の実装から切り離しました。

それが消費者とこのサブシステムの間のカップリングを増加させるという議論をすることは[〜#〜] very [〜#〜]それが意味するので疑わしいですこれで、コンシューマはサブシステムで必要な依存関係と密接に結びついています。つまり、コンシューマーを依存関係に結び付ける密結合コードを作成しているということです。理想的には[〜#〜] all [〜#〜]コードは分離されています。

コンストラクター注入:

依存関係の解決は、依存関係注入コンテナーまたはファクトリーによって処理されます。コンシューマは、依存関係注入コンテナまたはファクトリからサブシステムの具体的な実装を取得できます。

コンシューマーはサブシステムのコンストラクターがどのように見えるかさえ知る必要はありません。サブシステムの依存関係とは結合していません。

メソッド注入:

コンストラクターの注入と同じですが、コンシューマーはコンテナーまたはファクトリーから依存関係の具体的なインスタンスを取得し(または、メソッド/コンストラクターを注入する必要がある)、メソッドに注入する必要があります。繰り返しになりますが、消費者は依存関係の具体的な実装に結び付けられていません。

TL; DRサブシステムでの依存性注入の最悪のケースは、結合がコンシューマコードにシフトされることです。 ISカップリングの全体的な増加はありません。

最良のケースは、すべてのシステムが疎結合になり、依存性注入が依存性注入コンテナーまたはファクトリーを介して制御されるようになったことです。

7
Hawk