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


11

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

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

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

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

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

それで、私がまだまだ理解できないいくつかの質問があります:

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

:この質問はDIとIoCの違い何ですか。後者は依存関係のインバージョンではなく、依存関係の注入について質問するためです。



@gnat、いいえ、そうではありません。編集内容をご覧ください
Andre Borges

私は申し訳ありません逃し、同意
GNAT

2
IMO、単純な答えは「同じです」です。IoCは依存関係の逆転の別名であり、どちらも依存関係の注入を実現する方法です。「依存関係の逆転」は注入と混同されやすいため、あまり役に立たない用語と見なしています。したがって、DI(インジェクション)があり、IoCはインジェクションを介して依存関係/制御の反転を実現する方法です。
David Arno

回答:


6

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

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

一方、DIPは、コードから送信されるメッセージに送信されるメッセージの抽象化レベルに関するものです。確かに、DIPでDIまたはIoCを使用する方が表現力があり、強力で領域が揃っている傾向がありますが、全体的な問題では、次元や力が異なります。DIは配線について、IoCは方向について、DIPは形状についてです。


2
IoCとは、誰が通話を開始するか、誰が何に通話を開始するかです。私が書いた場合、それISomeInterface object = container.Resolve<ISomeInterface>()はIoCですか?
Andre Borges

1
あなたが書くのは、サービスロケーターパターンの実装です。これもIoCです。IoCはISomeInterfaceオブジェクトではありません= new MyClass()。つまり、意味のある呼び出しは「インスタンス化の呼び出し」(または「新規」を呼び出す呼び出し)です。
Sjoerd222888 2016

1
「一方、DIPは、コードからそれが呼び出しているものに送信されるメッセージの抽象化レベルに関するものです。」それは私にはナンセンスのように聞こえます。その反転はどこにありますか?彼は、反転ではなく依存関係の抽象化について説明しています。
David Arno

@DavidArno、マーティンファウラーのウェブサイトを信用できないと言っていませんか?
holdenmcgrohen 2016

@holdenmcgrohen、それは物事に関する彼の意見です。マーティン・ファウラーだからといって、それが事実であるとは限りません。彼は時々IMO、例えば「貧血データモデル」に関して間違っています。他の場合には、彼は非常に洞察力があります。今回は意味がないので彼も間違っていると思います。
David Arno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.