web-dev-qa-db-ja.com

依存関係の逆転の原則:他の人に「高レベルのポリシー」と「低レベルの詳細」を定義する方法は?

私は依存関係の逆転の原理を私の同僚(ほとんどが後輩)に説明しようとしています。ソフトウェアで「高レベルのポリシー」と「低レベルの詳細」のどちらを定義できるでしょうか。たとえば、ソフトウェアが複数のビジネスアプリケーションのワークフローを自動化する場合、ワークフローの自動化が高レベルのポリシーであり、ビジネスアプリケーションが詳細であると言うのはなぜですか?

13
Louis Rhys

注:これは以前の例から完全に書き直されています

電源ソケットについて考えてください。どの国でも、電源ソケットは常に同じであるという高水準のポリシーがあります。電気(石炭、ガス、原子力)の供給元は関係ありません。壁のソケットは、同じコネクタセットを介して常に同じ量の電力を出力する必要があります。

すべてのデバイスに共通のインターフェースである「プラグ」があるため、これで、任意のデバイスをそのソケットに接続できます。高レベルのポリシーでは、実装の詳細の一部を指示する必要はありません。何かを差し込むだけです。

AC電源を必要としないデバイスがある場合は、7Vで動作する可能性がありますDC回路-それでもその高レベルのポリシーを使用できますが、必要なのは電源とデバイス間のアダプタです。また、誰もが同じ高レベルのポリシーを持っているので、メーカーは高レベルのポリシーを変更することなく、それを実装に組み込むことができます。実装をポリシーに接続する人( 、あなたのラップトップを接続することは)本当にどちらかを理解する必要はありません。

さらに、メーカーが同じデバイスを別の国で販売したい場合は、別のアダプターを開発するだけで済みます。したがって、同じポリシーで複数の実装を実行しながら、同じ実装で複数のポリシーを処理できます。

これは、依存関係の逆転の完璧な例です。

しかし、ここで興味深いビットがあります。私が最初に言ったことに戻ります。 「どこから電力を得るかは問題ではありません。」これも実装の詳細です。ハイレベルなポリシーは、すべての電源ソケットが同じ形状であり、同じタイプの電力を放出することです。低レベルの実装の詳細は、電力がどこから得られ、何が実行されているかの両方です。

プログラミング用語では、これは、APIが提供し、アプリケーションが消費するインターフェース(言語がそれをサポートする場所。DIの別の形式はダックタイピングです)であることを意味し、低レベルの実装の詳細は両方ともそれを使用するアプリケーションとAPI自体。どちらもお互いを理解する必要はありません。

アダプターを使用して、同じ実装を異なるポリシーに適合させることができます。

11
pdr

ソフトウェアの再利用における古典的なアプローチは、何にも依存しないコンポーネント(つまり、それらを低レベルにするコンポーネント)を構築し、次に、低レベルのコンポーネントに依存する高レベルのコンポーネントを構築することです。 「高レベル」と「低レベル」は、具体的には依存関係の方向によって決定されます。これは、コンポーネントの機能に固有のものではなく、多くの場合、単なるアーキテクチャ上の決定です。

したがって、ワークフローの自動化に依存せずに単一のビジネスアプリケーションが構築されているが、ワークフローコントローラーがビジネスアプリケーションに直接依存している場合、ワークフローの自動化が「高レベルポリシー」であり、ビジネスアプリケーションが「低レベル」コンポーネント。この構造は必須ではないことに注意してください。ワークフロー自動化コンポーネントが一般的なフレームワークであり、特定のビジネスアプリケーションにも結合されていないが、異なるアプリケーションに対応するように構成できる場合は、DIPの適用を既に開始しています。この状況では、「高レベル」/「低レベル」の分離は、これら2つのものの間でもはや意味をなさない場合があります。

したがって、「依存関係の逆転」という名前は多少誤解を招く可能性があります。依存関係は「反転」されず、完全に削除されているためです(正確には、コンパイル時の依存関係から実行時の依存関係に変更されています)。

7
Doc Brown

簡単な画像を使ってDIPを説明します。ソフトウェア開発の古典的な見方は、各層がそれをサポートする下位層の上にある構築プロセスとしてです。依存関係逆転原理の使用は、モバイルの構築に似ています。 Hanging Mobile

下位層の上にある上位層ではなく、モバイルインターフェースの上位層は、それらを接続する文字列を介して下位層とインターフェイスします。ある意味で、下位層はそのインターフェイスに依存します(これらの文字列がなければ)。つまり、DIPです。

1
Michael Brown