依存性逆転の原則と、Gofの本「実装ではなくインターフェースへのプログラム」に示されている有名なフレーズの違いがわかりません。DIPの定義には、次の原則が記載されています。
- 高レベルのモジュールは、低レベルのモジュールに依存するべきではありません。どちらも抽象化に依存する必要があります。
- 抽象化は詳細に依存するべきではありません。詳細は抽象化に依存する必要があります。
どちらの原則も同じことをしているようです。つまり、インターフェースを実装から切り離します。
依存性逆転の原則と、Gofの本「実装ではなくインターフェースへのプログラム」に示されている有名なフレーズの違いがわかりません。DIPの定義には、次の原則が記載されています。
どちらの原則も同じことをしているようです。つまり、インターフェースを実装から切り離します。
「実装ではなくインターフェースへのプログラム」は、OOPの一般的な意味での良いアドバイスです(あなたの言語がインターフェースの概念をサポートしていない場合でも)。メッセージを送信するオブジェクトは、一連のメッセージに応答できる(したがって、実行できる)限り、受信者の詳細(たとえば、どのクラスがインスタンスであるか、または特定の階層に属しているかどうか)を気にする必要はありません。一連の動作)。GoFのパターンを見ると、主な結論の1つは、インターフェイスに対してプログラムする限り、クライアントで何も変更せずにターゲットオブジェクトを別のオブジェクトに置き換えることができるということです。
依存性逆転の原則に関しては、前者の考え方を具体的に応用したものだと思います。柔軟性と再利用性を得るために、下位層を上位層から分離することを目的として、階層化アーキテクチャのコンテキストで具体的なクラスではなく、インターフェイスにプログラミングのアイデアを適用しています。
HTH
次のようにComputer
class
定義されているとします。
public class Computer
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //Hardware based property
public string OperatingSystem{get; set;} //Software based property
}
さて、Interface
上記のコードコメントに従って、ISoftwareComponents
とインターフェイスを作成し、それらのプロパティをそれぞれのインターフェイスに移動し、以下のようにクラスにIHardwareComponents
両方のインターフェイスを実装する必要があることを示すようにプログラミングします。Computer
public interface ISoftwareComponents
{
string OperatingSystem{get; set;}
}
public interface IHardwareComponents
{
int RAMCapacity{get; set;}
}
public class Computer : ISoftwareComponent, IHardwareComponents
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //IHardwareComponents property
public string OperatingSystem{get; set;} //ISoftwareComponents property
}
Computer
これで、クラスのクライアントコードは次のようなコードを使用できます。
Computer comp = new Computer();
//software requirements can use the below code:
string os = ((ISoftwareComponents)comp).OperatingSystem; // and, other variations by method calls
//hardware requirements can use the below code
int memory = ((IHardwareComponents)comp).RAMCapacity; //and, other variations
以下のように、コンピューターのソフトウェアとハードウェアのインターフェイス部分のみを他のクラスとメソッドに渡すこともできます。
public void SetHardware(IHardwareComponents comp)
{
comp.RAMCapacity = 512;
}
上記の例でさらに詳しく調べれば、もっと知ることができます。