依存性注入は、複雑さを別のクラスに移動するだけではどうですか?


9

今週は、依存関係注入のためにTyphoonフレームワークを使用することを検討してきました。オブジェクトの構造を分離することは、単体テスト中に任意のコンポーネントをモックに置き換えるのに有益であることがわかりました。

しかし、何十ものヘッダーがインポートされた巨大なビューコントローラークラスがあった前に、何十ものヘッダーがインポートされた巨大なファクトリークラスができたと考えざるを得ません。大規模なファクトリークラスを避けるべきですか?


6
10年後、DIがシングルトンのバッシングリストを引き継ぐことを期待していますが、今回は正当な理由があります。これにはいくつかの良い使い方がありますが、影響の評価には非常に注意することをお勧めします。
Balog Pal 2013

5
依存関係の注入は複雑さを軽減する方法ではなく、明示的な依存関係(明示的なパラメーター/バインドされた変数の使用)を優先して暗黙的な依存関係(グローバルシンボル/自由変数の使用)を回避する方法だとは思いません。したがって、複雑さはまだ残っていますが、メソッド/コンストラクターのシグネチャで明示的にするため、それに対処する必要があります。
Giorgio

7
コードを編成するためのほとんどのシステムは、「複雑さを別の場所に移動するだけ」と表現できることに注意してください。それは、複雑さを最も論理的で有用な方法で整理するほど複雑さを取り除くことではありません。

1
50個のヘッダーをインポートする必要がある場合は、どこかにインポートする必要があります。DIは、コードをユニットテストする簡単な方法を支援します。
BЈовић

2
では、コントローラーが制御に焦点を当て、ヘッダーインポートファクトリがヘッダーインポートに焦点を当てているということですか。DIフレームワークを使用しているかどうかにかかわらず、それがどのように悪いことになるのでしょうか。
pdr 2013年

回答:


16

依存性注入は、あるオブジェクトが別の依存オブジェクトをどのように認識するかを定義するのに役立ちます。システム全体の複雑さを軽減するのには役立ちません。DIの前に数十のインポートが必要だった場合でも、後で数十のインポートが必要になります。違いは、これらのインポートがより意味のある場所(クラス)(工場、ビルダーなど)にあることです。

コンストラクターまたはメソッドを介して依存関係を提供できるようにすることで、異なるがまだ有効な依存オブジェクトをクラスに提供し、懸念事項を取り除くことによってそのクラスの結束力を高める柔軟性を自分で実現できます。

類似していて、一緒に使用されることが多いいくつかの原則があります。依存性注入(DI)、制御の反転(IoC)、および依存性反転の原則(DIP)

この記事から http://martinfowler.com/articles/dipInTheWild.html

DIは配線について、IoCは方向について、DIPは形状についてです


2
+1、最後の引用。これは、人々が誤解しがちなこれら3つの概念の最も明確な説明です。
ヘイレム2013年

上記のリンクされた記事は本当に優れています。十分に深く、非常に明確な説明。
DemetriKots

10

依存性注入は複雑さを軽減しませんが、関心事の分離と結合の減少により操作性を向上させます。

しかし、何十ものヘッダーがインポートされた巨大なビューコントローラークラスがあった前に、何十ものヘッダーがインポートされた巨大なファクトリークラスができたと考えざるを得ません。大規模なファクトリークラスを避けるべきですか?

「巨大な」クラス、期間は避けてください。したがって、View Controllerをより小さく、より保守しやすいクラスに分割するとします。現在、それらすべてが依存関係を把握する責任があります。DIは、この依存関係管理を、これらすべてのクラスから、依存関係管理のみを担当するファクトリー/構成クラスに移動するのに役立ちます。単一責任の原則を参照してください。また、元のビューコントローラーよりもはるかに「面倒」ではありませんが、大きくなりすぎた場合は、常に、アプリケーションのさまざまな部分を担当する小さな依存関係管理クラスに分割することができます。


2

素人の言葉で:

依存性注入は、複雑さを害の少ない場所に移動します。

@gnatの編集:DIは、複雑さを別のクラスに移動するだけでなく、害の少ない場所に移動します。


これは尋ねられた質問にどのように答えますか?
gnat

@gnatが編集を追加しました。私の回答では、DIが複雑さを別のクラスに移動するだけではないのかと私の意見で説明しています。
TulainsCórdova13年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.