2

なぜ構成は「拡張にオープンで、変更に近い」原則に従う必要があるのですか?

私は理解しています:クラスに機能を追加したい場合は、新しいコードを記述し、構成を使用してそのコードに到達するだけです。
しかし、コンポジションがあるコードを変更するだけですか?そのコードに構成を追加して、そのコードを変更するからです。

例:

以前は、これです:

public class Example{
public void Walk(){
    //walking
}
}

以降:

public class Example{

    RunClass r = new RunClass(); // I add this

public void Walk(){
    //walking
}

public void Run(){ // I also add this
    r.run();        
}
}

つまり、このクラスを変更したということです。

4

3 に答える 3

5

最初に定義を確認する必要があります。
コンポジションは単に「has a」の関係ですが、継承は「is a」の関係です。オープン クローズの原則とは、クラスのソース コードを変更せずに動作を変更することです。それ自体では OCP を保証しません。
設計パターンは、合成または継承を通じて原則に従います。たとえば、戦略設計パターンは構成を使用して実行時に動作を変更しますが、テンプレート メソッド パターンは継承を使用してコンパイル時に動作を変更します。したがって、構成では実行時に拡張が可能であり、継承ではコンパイル時に拡張が可能です。クラスを封印したい (サブクラス化できない) 場合、利用できる唯一のオプションは合成です。
設計が疎結合でない限り、OCP は構成によって保証されません。コンポジションは単なる「has a」関係であり、クラスにオブジェクトのインスタンスがあることを意味しますが、そのインスタンスを変更するためにコードを変更する必要がある場合、それは OCP に従いません。ただし、制御の反転 (IoC) を使用すると、その構成は疎結合になるため、クラスのコードを変更する必要はありません。次に例を示します。

OCPに従わない構成

  public class Bike {
    Wheel wheel = new LargeWheel();

    public void go(){
      wheel.go();
  }

OCPに従った構成(IoC経由)

  public class Bike {
    Wheel wheel;

    public setWheel(Wheel wheel){
      this.wheel = wheel;
    }

    public void go(){
      wheel.go();
  }

最初のケースでは、別のタイプのホイールが必要な場合はコードを変更する必要がありますが、2 番目のケースでは、必要なホイール インスタンスを「注入」します。

于 2012-04-29T18:20:19.493 に答える
2

OCP の方法でコンポジションを使用していません。

これは、OCP に従うものです。

public class Example2{

    Example e = new Example(); 
    RunClass r = new RunClass();

    public void Walk(){
        e.Walk()
    }

    public void Run(){ 
        r.run();        
    }
}

別の方法は、次をExample2継承することExampleです。

public class Example2 extends Example{

    RunClass r = new RunClass();

    public void Run(){ 
        r.run();        
    }
}

Example変化しませんが、 に合成されExample2ます。

于 2012-04-29T16:19:48.430 に答える
0

open-closed の要点は、ソース コードを持たないクラスに適用する場合は明らかです。依存関係として JAR に含まれているだけです。そのクラスは変更に対して積極的に閉じられています。そのまま使用することしかできません。オープンな部分とは、クラスの消費者がニーズに合わせて動作を拡張できるようにクラスを設計する必要があることを意味します。コンポジションは、そのクラスを使用して独自の動作を追加する 1 つの方法です。

于 2012-04-29T17:18:46.043 に答える