web-dev-qa-db-ja.com

制御の反転は依存関係の反転とどのように関連していますか

Web上の多くの記事では、制御の反転と依存関係の反転の原則という用語が混同され、同義語として使用されているように見えます(さらに混乱は、「DIコンテナー」と「IoCコンテナー」と呼ばれるツールによって強制されます)。 Wikipediaの記事 IoCがDIと同じではないことを説明しようとする素晴らしい仕事をします:

制御の反転(IoC)は、コンピュータープログラムのカスタム記述部分が、汎用の再利用可能なライブラリから制御のフローを受け取る設計を表します

したがって、DIPは、モジュールを具体的な実装ではなく抽象化に依存させることです。

IoCは、プログラムフローを別のモジュールに制御することを目的としています。このモジュールで実行できることの1つは、実行時に依存関係を解決することです。

この違いは公平に思えますが、依存関係の解決以外のIoC原則の他のアプリケーションについて誰も言及していません。ウィキペディアの定義は非常に広範であり、その構成といくつかの内部ロジックに基づいてカスタムコードを呼び出すことができるモジュールを使用すると、さらに多くのことができるようです。

だから、ここではまだ理解できていないいくつかの質問があります:

  • IoCとDIPの実際の関係は何ですか? IoCは常にDIPを実装する手段として機能しますか?
  • 依存関係を解決するためのツールがDIコンテナーとIoCコンテナーの両方と呼ばれるのはなぜですか?これは、DIとIoCが同じものであることを意味します。

:この質問は DIとIoCの違いは何ですか の重複ではありません。後者は依存性注入について質問するためです。 、依存関係の逆転ではありません。

11
Andre Borges

Martin Fowlerのサイトには、 DIP、DI、IoCの違いに関する章 が掲載されたすばらしい記事があります。その要点(そのサイトからコピーされたもの)は

DIは、1つのオブジェクトが依存関係を取得する方法についてです。依存関係が外部から提供されている場合、システムはDIを使用しています。 IoCは、だれが通話を開始するかについてです。コードが呼び出しを開始する場合、それはIoCではありません。コンテナー/システム/ライブラリーが提供したコードにコールバックする場合、それはIoCです。

一方、DIPは、コードから、それが呼び出しているものに送信されるメッセージの抽象化レベルに関するものです。確かに、DIPでDIまたはIoCを使用することは、より表現力があり、強力でドメインに整合する傾向がありますが、全体的な問題では、異なる次元または力についてです。 DIは配線について、IoCは方向について、DIPは形状についてです。

6
JDT