web-dev-qa-db-ja.com

「制御の反転」、「依存関係の反転」、「デカップリング」の違い

依存関係の逆転デカップリングについての理論を読んでいて、私はできます ' 2つの違いを確認してください。

依存関係の逆転は、より高いレベルのコンポーネントがより低いレベルのコンポーネントに依存しないように、機能コンポーネントの分離について説明します。

デカップリングは、同じこととそれを達成する方法について話します。しかし、さらに混乱を招くIoCコンテナがあります。なぜそれらはDependency Inversion Containersと呼ばれるのではなく、より良いDependency Injection Containers、独立したコンポーネントのランタイムカップリングを提供するためですか?

次にInversion of Controlがあります。基本的にはDependency Inversionと同じですよね?同じことを表す3つの用語があるのはなぜですか?または私は盲目ですか?

  1. 3つの違いは何ですか?
  2. IoCコンテナでIoCは何をする必要がありますか?
70
Robert Koritnik

デカップリングは、多くの分野で適用できる非常に一般的な原理です。 依存関係の逆転は特定の形式のデカップリングであり、ライブラリに分離してインターフェイスを使用することにより、システムの上位レベルを下位レベルから分離します。これにより、大幅な手直しをせずに、システムの下位レベルの部品を交換できます。

たとえば、システムの上位レベルの部分が下位レベルのクラスの具象インスタンスを作成する代わりに、IoCコンテナを使用して、オブジェクトの作成方法を切り離すことができます。

制御の反転は、フレームワークがアプリケーションから何らかの制御を取り戻すことを可能にするフレームワークライブラリによって使用される設計原則です。つまり、特定のユーザーインターフェイスイベントが発生すると、ウィンドウフレームワークがアプリケーションコードをコールバックすることがあります。 Martin FowlerはHollywood Principleという用語をのように使用します私たちに電話しないでください、私たちはあなたに電話します。デカップリングは、制御の反転の重要な部分です。

しかし、IoCコンテナーは、制御の反転と何をするのでしょうか。 Martin Fowlerを引用するには

制御の逆転は一般的すぎる用語なので、人々はそれを混乱させます。その結果、さまざまなIoC擁護者との多くの議論の結果、Dependency Injectionという名前を決めました。

(マーティンファウラーが依存関係の逆転ではなく依存関係の注入について話していることに注意してください。)

IoCコンテナーは、依存性注入の実装に役立ちます。おそらく、より適切な用語は、依存性注入コンテナーです。ただし、IoCコンテナー名は固執しているようです。依存関係のインジェクションは、依存関係の逆転において重要なコンポーネントですが、制御の逆転はより広範でより一般的な原則であるため、依存関係のインジェクションにIoCコンテナーを使用すると混乱を招く可能性があります。

命名はあまり一貫していないことを指摘しましたが、これらの用語は重複していても独自に発明され使用されているため、それほど驚くべきことではありません。

66

Dependency InjectionDecouplingを使用してInversion of Controlを実現します。

46
Boris Pavlović

私はmartinfowler.comの DIP in the Wild の記事から次の説明を簡単に理解できます(ここでDI =依存性注入、DIP =依存性逆転原理、IoC =制御の逆転)。

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

一方、DIPは、コードからそれが呼び出しているものに送信されるメッセージの抽象化レベルに関するものです。 (...)DIは配線、IoCは方向、DIPは[コードが依存するオブジェクトの]形状です。

16
hidro

依存関係の逆転:具体化ではなく、抽象化に依存します。

制御の反転:メインvs抽象化、およびメインがシステムの接着剤である方法。

DIP and IoC

これらはこれについて話すいくつかの良い記事です:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/