2009-03-20 5 views
3

私はIoCとDIについて多くのことを読んだことがありますが、ほとんどの状況でそれらを使用することで多くの利益を得られるとは私は確信していません。Inversion of Controlや依存性注入の値に関するハードデータはありますか?

プラグ可能なコンポーネントが必要なコードを作成している場合は、その値が表示されます。しかし、そうでない場合は、クラスからインターフェイスへの依存関係を変更することで、より多くの型付け以外に何かが得られるかどうか疑問に思う。

場合によっては、IoCとDIが嘲笑で助けてくれる場所がわかりますが、MockingやTDDを使用していない場合、値は何ですか?これはYAGNIのケースですか?

答えて

2

私はあなたがそれに何らかのハードデータを持っているのではないかと疑います。

まず、DI(または他のSOLIDの原則)を使用しないでください。これは、TDDを行うのに役立ちます。それ以外の方法では、TDDを使用します。これはデザインに役立ちます。通常は、そのような原則に従うコードを取得することを意味します。

なぜインターフェイスを使用するのかについては、別の問題です。https://stackoverflow.com/questions/667139/what-is-the-purpose-of-interfacesを参照してください。

あなたのクラスでさまざまなことを行うと、面倒なコードが発生することに同意したと思います。したがって、私はあなたが既にSRPに行くと仮定しています。

特定のことを行うクラスが異なるため、関連付ける方法が必要です。それらをクラス(つまりコンストラクタ)の内部に関連付けると、クラスの特定のバージョンを使用するコードがたくさん得られます。つまり、システムを変更するのは難しいでしょう。

システムを変更する必要があります。ソフトウェア開発の事実です。特定の追加機能を追加しないことについてYAGNIに電話することはできますが、システムを変更する必要はありません。私の場合、週刊スプリントを行うのと同じように、それは本当に重要なことです。

設定はコードで行われるDIフレームワークを使用します。本当に小さなコード構成では、たくさんの異なる関係を繋ぎます。だから、インターフェースとコンクリートのクラスについてのディスカッションを取り除くと、実際にはタイプミスを減らすことができます。また、具体的なクラスがコンストラクタ上にある場合、それはそれを自動的にフックします(私は構成する必要はありません)残りの関係を構築します。また、私はいくつかのオブジェクトの寿命を制御することができます、特に私はオブジェクトをシングルトンに構成することができ、それは常に1つのインスタンスを手渡します。

また、これらの方法を使用するだけでオーバーヘッドが増えるわけではありません。最初の時間にそれらを使用すると、オーバヘッドの原因は何か(学習プロセス+場合によってはマインドセットの変更のため)です。

ボトムライン:すべてのコンストラクターコールをすばやく実行する必要はありません。

1

DIからの最も大きな利得は、必ずしもインターフェイスの使用によるものではありません。依存関係注入の有益な効果を得るために、実際にインターフェイスを使う必要はありません。実装が1つしかない場合は、おそらくそれを直接注入することができ、クラスとインタフェースを混在させることができます。

あなたはまだ疎結合しており、かなりの数の開発環境では、必要に応じていくつかのキーを押してそのインターフェイスを導入することができます。

私が与えることのできない疎結合の価値に関するハード・データが、私が覚えている限り、教科書のビジョンであった。今は本当です。

DIフレームワークは、大きな構造の階層構造に関しても非常に驚くべき機能を提供します。最もまれなDIフレームワークを探すのではなく、フル機能のDIフレームワークを探すことをお勧めします。少なくてもは常にではありません。少なくともプログラミングの新しい方法について学ぶことになると、 その後、を減らすことができます。

0

テストとは別に、ゆるやかなカップリングも価値があります。

私は、起動後にオブジェクトの設定が固定されていた組み込みJavaシステムのコンポーネントを扱いました(ほぼ50種類のオブジェクトがほとんどです)。

最初のコンポーネントは、依存性注入のないレガシーコードで、サブオブジェクトはどこにでも作成されました。今度は、いくつかの変更があった場合、3つのコンストラクターしか利用できなかったオブジェクトと対話するためにいくつかのコードが必要になりました。だから何をすることができますが、コンストラクタに別のパラメータを追加して渡すか、後で継承するためにフィールドに格納することさえできます。長期的には、すでにどこよりも物事がさらに絡み合っていました。

私はゼロから開発し、依存性注入を使用しました(当時は分かりませんでした)。つまり、私はすべてのオブジェクトを構築し、基礎を知る必要性を注入した1つの工場を持っていました。別の依存関係を追加するのは簡単でした。単にそれをファクトリとオブジェクトコンストラクタに追加するだけです(またはループを回避するためにセッタを追加する)。無関係なコードに触れる必要はありません。