1

依存性逆転の原則と、Gofの本「実装ではなくインターフェースへのプログラム」に示されている有名なフレーズの違いがわかりません。DIPの定義には、次の原則が記載されています。

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

どちらの原則も同じことをしているようです。つまり、インターフェースを実装から切り離します。

4

2 に答える 2

2

「実装ではなくインターフェースへのプログラム」は、OOPの一般的な意味での良いアドバイスです(あなたの言語がインターフェースの概念をサポートしていない場合でも)。メッセージを送信するオブジェクトは、一連のメッセージに応答できる(したがって、実行できる)限り、受信者の詳細(たとえば、どのクラスがインスタンスであるか、または特定の階層に属しているかどうか)を気にする必要はありません。一連の動作)。GoFのパターンを見ると、主な結論の1つは、インターフェイスに対してプログラムする限り、クライアントで何も変更せずにターゲットオブジェクトを別のオブジェクトに置き換えることができるということです。

依存性逆転の原則に関しては、前者の考え方を具体的に応用したものだと思います。柔軟性と再利用性を得るために、下位層を上位層から分離することを目的として、階層化アーキテクチャのコンテキストで具体的なクラスではなく、インターフェイスにプログラミングのアイデアを適用しています。

HTH

于 2013-03-04T15:00:51.360 に答える
0

次のように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;
}

上記の例でさらに詳しく調べれば、もっと知ることができます。

于 2013-03-05T12:41:49.530 に答える