DIコンテナのキーは抽象化です。DIコンテナは、この設計上の問題を抽象化します。ご想像のとおり、コードに顕著な影響があり、多くの場合、より少ない数のコンストラクター、セッター、ファクトリー、およびビルダーに変換されます。結果として、それらはコードをより疎結合にし(基礎となるIoCにより)、よりクリーンでシンプルにします。費用なしではないが。
背景
何年も前、このような抽象化のために、さまざまな設定ファイルを書く必要がありました(宣言型プログラミング)。LOCの数が大幅に減少するのは素晴らしいことでしたが、LOCSは減少しましたが、構成ファイルの数はわずかに増加しました。中規模または小規模のプロジェクトではまったく問題ではありませんでしたが、大規模なプロジェクトでは、「コードのアセンブリ」をコードとXML記述子の間で50%分散させるのが苦痛になりました...それにもかかわらず、主な問題はパラダイム自体。記述子にはカスタマイズ用のスペースがほとんど残っていないため、非常に柔軟性がありませんでした。
パラダイムは、設定ファイルをアノテーションや属性と交換する設定よりも慣習に徐々に移行しました。コードをよりクリーンでシンプルに保ちながら、XMLにはない柔軟性を提供します。
おそらく、これはあなたが今まで働いていた方法に関して最も重要な違いです。より少ないコードとより多くの魔法。
欠点は...
構成に対する規約により、抽象化が非常に重くなり、その仕組みがほとんどわかりません。魔法のように思えることもありますが、もう1つ欠点があります。一度動作すると、多くの開発者はその動作を気にしません。
これは、DIコンテナーでDIを学んだ人にとってはハンディキャップです。彼らは、コンテナによって抽象化された設計パターン、優良事例、および原則の関連性を完全には理解していません。開発者にDIとその利点に精通しているかどうかを尋ね、次のように答えました。-はい、Spring IoCを使用しました -。(一体どういう意味?!?)
これらの「欠点」のそれぞれに同意することもしないこともできます。私の謙虚な意見では、プロジェクトで何が起こっているのかを知る必要があります。そうでなければ、それを完全に理解することはできません。また、DIの目的を理解し、DIを実装する方法の概念を考慮することもプラスです。
プラス面では...
一言で言えば生産性。フレームワークにより、本当に重要なことに集中できます。アプリケーションのビジネス。
コメントされた欠点にも関わらず、私たちの多くにとって(この仕事は期限と費用によって条件付けられています)、これらのツールは非常に貴重なリソースです。私の意見では、これはDIコンテナの実装を支持する主な議論であるはずです。生産性。
テスト中
純粋なDIまたはコンテナを実装する場合、テストは問題になりません。まったく逆です。同じコンテナは、多くの場合、箱から出して単体テストを行うためのモックを提供します。長年にわたり、私は自分のテストを温度計として使用してきました。コンテナ施設に大きく依存していたかどうかを教えてくれます。これは、これらのコンテナがセッターまたはコンストラクターなしでプライベート属性を初期化できるためです。彼らはほとんどすべての場所にコンポーネントを注入できます!
魅力的に聞こえますか?注意してください!trapに落ちないでください!!
提案
コンテナを実装することに決めた場合は、グッドプラクティスに従うことを強くお勧めします。コンストラクター、セッター、およびインターフェースの実装を続けます。フレームワーク/コンテナにそれらを使用するように強制します。別のフレームワークへの移行を容易にするか、実際のフレームワークを削除します。コンテナへの依存を大幅に減らすことができます。
この慣行に関して:
DIコンテナを使用する場合
私の答えは、主にDIコンテナを好む自身の経験によって偏っています(私がコメントしたように、私は生産性に重点を置いているので、純粋なDIの必要はありませんでした。まったく反対です)。
このテーマに関するMark Seemanの興味深い記事は、純粋なDIの実装方法に関する質問にも答えていると思います。
最後に、Javaについて話している場合は、まずJSR330-Dependency Injectionを確認することを検討します。
要約する
メリット:
- コスト削減と時間の節約。生産性。
- コンポーネントの数が少ない。
- コードはよりシンプルでクリーンになります。
欠点:
- DIはサードパーティのライブラリに委任されます。それらのトレードオフ、長所と短所を認識しておく必要があります。
- 学習曲線。
- 彼らはすぐにいくつかの良い習慣を忘れさせます。
- プロジェクトの依存関係の増加(より多くのライブラリ)
- リフレクションに基づくコンテナには、より多くのリソース(メモリ)が必要です。これは、リソースに制約されている場合に重要です。
純粋なDIとの違い:
- より少ないコードとより多くの構成ファイルまたは注釈。