依存関係の逆転の原則:低レベルコンポーネントと高レベルコンポーネントの両方が抽象化にどのように依存するかを理解する


10

依存関係の逆転の原理について学習しています。それはそれを述べています:

高レベルのモジュールは、低レベルのモジュールに依存するべきではありません。どちらも抽象化に依存する必要があります。

しばらく、私はそれが高レベルのコンポーネントと低レベルのコンポーネントの両方が抽象に依存し、それらに依存していることの意味を理解しようとしました

どちらも同じ抽象化に何らかの形で依存する必要があると思います。これが間違っている場合は修正してください。

私はこれが何を意味するかについていくつかの結論に達しています。これが正しいかどうか確認してください。

ここに画像の説明を入力してください

高レベルのコンポーネントは抽象化に依存しています」-意味:

高レベルコンポーネントは、具体的な低レベルコンポーネントと直接通信するのではなく、低レベルコンポーネントと通信するためにインターフェースと通信します。低レベルのコンポーネントはこのインターフェースを実装します。

低レベルのコンポーネントは抽象化に依存しています」-意味:

低レベルのコンポーネントは、インターフェースの観点から定義および設計されています。それらはインターフェイス合うように設計されています。それらは、インターフェースがそれらの設計方法を定義する方法で、インターフェースに依存しています(多くの場合、低レベルのクラスがそのインターフェースを実装しています)。

このように、高レベルのコンポーネントと低レベルのコンポーネントはどちらも「抽象化に依存」していますが、方法は異なります。

これはよく理解していますか?


8
あなたはかなりのスポットです。パズルの最後のピースは、インターフェースがレベルのコンポーネントではなく高レベルのコンポーネントによって定義されることです。言い換えると、高レベルの懸念事項(ドメインモデルなど)は、低レベルコード(データアクセスコードなど)と対話するための最も便利な方法を選択する必要があり、準拠するのは低レベルコードの仕事ですそのインターフェースに。インターフェースが高レベルの振る舞いの一部であることを理解すると、「依存関係の逆転」という用語がより意味をなすようになります。
ベンジャミンホジソン

1
@BenjaminHodgsonなるほど。理解できたかどうか見てみましょう。当然、オブジェクトはインターフェースを定義できません。それはプログラマーの仕事です。したがって、「インターフェースは高レベルのコンポーネントによって定義される」とは、「プログラマが高レベルのコンポーネントが低レベルのコンポーネントと通信するための便利な方法としてインターフェースを定義する」という意味だと思います。確認しますか?
Aviv Cohn 2014

(低レベルのものは後でこのインターフェースを実装し、それに従って構築されるため)。
Aviv Cohn 2014

はい、明らかにすべてのコードはプログラマーによって書かれています。インターフェイスは概念的には高レベルの懸念の一部であるという考えを伝えようとしていました。高レベルのコードと同じパッケージに入れ、実装の詳細の変更に対応するのではなく、ビジネス要件に従って変更する必要があります。
Benjamin Hodgson

1
理想的ではありますが、高レベルのコンポーネントの要件が何であれ、低レベルのインターフェースを定義するという贅沢が常に与えられるわけではないという警告を付け加えておきます。たとえば、いくつかの便利な機能を提供する既存のライブラリをアプリに統合する場合、達成しようとしているビジネス機能を表す高レベルのコンポーネントがある可能性があります。彼らは実際に作業を行うために、その低レベルのライブラリ(おそらくiTextなど)を使用します。おそらく、iTextが何を必要としているかに関係なく、抽象化を定義する贅沢はありません。
Calphool 14

回答:


6

概念の理解は非常に正確です。

現在、例外、特別なケース、または哲学的な特徴を指摘することは、現在の明確な概念からあなたをそらすでしょう。

ただし、UMLシンボルを使用することをお勧めします。

ここに画像の説明を入力してください

  • オープンアロー:使用
  • 閉じた矢印:継承または実装
  • <<括弧内の名前>>:インターフェースまたは抽象クラス

0

はい、多くの人はソフトウェアの構築を建物の構築と同じように考えています。DBは、DALがその上に置く「基盤」であり、ビジネスレイヤーはDALの上にあり、UIはビジネスレイヤーの上にあります...

代わりに、それをぶら下がっている携帯電話と考えてください。「レイヤー」が共通のアンカーからぶら下がっている場所。UIとビジネスレイヤーはどちらもビジネスインターフェースからハングし、ビジネスレイヤーとDALはどちらもDALインターフェースからハングします。DALとデータベースはDBインターフェースを介して接続します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.