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


32

依存性注入に関するウィキペディアのページの短所セクションに、次のことが記載されています。

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

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

依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。その結果、結合が減少するはずです。

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


2
誰が不利な点のリストを書いたのかはわかりませんが、私はそれを一粒で取ります。たとえば、DIは、大量の冗長なセットアップコードを排除することにより、コードベースのサイズを2/3削減するのを見てきました。
ロブ

@RobY私は主にファクトリを使用して依存関係を注入しましたが、私の経験では、コードサイズは増加しますが、テストは簡略化されます。
BЈовић

RegistryやContext Passingのような代替手段を使用してみてください;)または、オブジェクトをインスタンス化し、configからプロパティを取得するコード。主に、今と15年前の違いについて話しています。
ロブ14年

関連:stackoverflow.com/a/9503612/264697。Mark Seemannの答えは、依存性注入を使用して全体的な結合がどのように減少するかを説明しています。
スティーブン14年

回答:


42

だから、私は何が欠けていますか?

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

多くの場合、これは良いトレードオフです。クラスは、インターフェースを越えた依存関係の詳細を知らないようにし、特定のコードを結び付けるのはアプリケーションの責任であるべきです。


確かに、結合は一方向に減少し、もう一方向に増加します。
ポールドレイパー14年

しかし、消費者はそれを作成しません。それがむしろポイントです。
ケーシー14年

@emodendroket-え?制御の反転により、消費者はそれを作成できません。依存性注入はそれに直交しています。
テラスティン14年

通常、これらの用語は同じ意味で使用されているため、あなたは私がよく知らない区別をしています。
ケーシー14年

22

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

依存関係の注入では、を作成する方法を知識から削除するためSDとの間の結合が緩やかになります。使用方法を知る必要があります。全体的な結合が増加するのは、システムの他の部分が現在、それを作成する方法を知っている必要がある可能性があるためです。カップリングのこの増加の範囲は、依存性がどのように注入されるかに依存します。SDSDDS

  • コンストラクタ・インジェクションの作成者Sにニーズの依存関係Dを作成する方法の知識と可能性。
  • メソッドレベルの注入の方法の各発信者Sそこを通ってD注入されますニーズに依存Dし、おそらく知識がどのように作成します。

どちらの場合でも、依存するクラスの数はD増加Dし、システムのどこかにまだ作成するための知識が必要です。これにより、結合が全体的に増加します。


わかりました。コンストラクターとセッターの注入には意味があります。ただし、ファクトリーまたは戦略パターンを使用する場合、作成はそこに移動され、クラスは挿入されたオブジェクトのみを使用します。または、それは依存性注入ではありませんか(制御の反転のみ)?
BЈовић

ファクトリインジェクションを使用しても、の作成者はSのファクトリを提供する必要があります。Dつまり、そのS使用D(または少なくともそのインターフェイス)を知る必要があります。
イダンアリー14

7

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

依存関係の注入を行わないと、サブシステムと依存関係の具体的な実装との間に密結合が生じます。

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

消費者がサブシステムに必要な依存関係に密接に結合していることを示唆しているため、消費者とこのサブシステム間の結合を増加させるという議論は非常に疑問です。つまり、消費者と依存関係を結び付ける密結合コードを書いているということです。理想的には、すべてのコードが分離されています。

コンストラクター注入:

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

消費者は、サブシステムのコンストラクターがどのように見えるかを知る必要はありません。サブシステムの依存関係へのカップリングはありません。

メソッドインジェクション:

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

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

最良のケースは、すべてのシステムが疎結合になり、依存性注入が依存性注入コンテナーまたは工場を通じて制御されることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.