2012-04-29 9 views
0

「拡張に近い、変更に近い」原則に従う必要があるのはなぜですか?なぜ組成はオープンクローズド原理に従うべきですか?

私が理解していること:クラスに機能を追加する場合は、新しいコードを作成して合成を使用してそのコードを取得するだけです。
しかし、あなたは構成を持っているコードを変更するだけですか?そのコードにコンポジションを追加して、そのコードを変更するからです。

例:

それがこれです、前に:

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();   
} 
} 

だからこれは私がこのクラスを変更を意味します。

答えて

2

あなたはOCPの方法で構成を使用していません。

これは、OCPを以下のものになるだろう:

public class Example2{ 

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

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

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

代替はExample2Exampleを継承していることである:

public class Example2 extends Example{ 

    RunClass r = new RunClass(); 

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

Exampleは変わりませんが、Example2に構成されています。

+0

「e」または「r」をコードを変更する必要がある別のインスタンスに変更する必要がある場合は、最初の例はOCP、bcの後にはないと思います。この場合、IoCを使用してクラス内にインスタンスを作成するのではなく、インスタンスを渡すための戦略パターンを使用できます – CCC

0

オープン・クローズの主なポイントは、ソース・コードを持たないクラスに適用すると明らかです。依存関係としてJARに入ってくるだけです。そのクラスは、修正のためにが閉じられたが積極的です。そのまま使用することができます。 開封の部分は、消費者があなたのニーズを満たすように行動を拡張できるように、クラスを設計する必要があることを意味します。コンポジションは、そのクラスを使用して独自のビヘイビアを追加するための1つの方法です。

0

最初に定義を調べる必要があります。
コンポジションは単なる "has a"の関係ですが、継承は "is a"の関係です。 オープンクローズの原則は、クラスのソースコードを変更せずに動作を変更することです。それだけで彼らはOCPを保証しません。
デザインパターンは、合成または/および継承によって原則に従います。例えば。ストラテジデザインパターンでは、実行時に変更を変更するためにcompositionを使用しますが、テンプレートメソッドパターンでは、継承を使用してコンパイル時に動作を変更します。したがって、コンポジションは実行時の拡張を許可し、継承はコンパイル時に可能にします。あなたのクラスを封印する(サブクラス化することはできません)場合は、唯一利用可能なオプションは合成です。
デザインが疎結合でない限り、OCPは合成によって保証されません。あなたのクラスにはオブジェクトのインスタンスがあると言っていますが、コードを変更してそのインスタンスを変更する必要がある場合は、OCPに従わないということを覚えておいてください。しかし、Inversion of Control(IoC)を使用すると、そのコンポジションは疎結合になります。そのため、クラス内のコードを変更する必要はありません。最初のケースではOCP(IOCを通じて)OCPを次の

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

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

作曲

public class Bike { 
    Wheel wheel; 

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

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

に従っていません

構成変更する必要があります。ここでは一例であり、あなたが必要とするホイールのインスタンスを "注入"することができます。

関連する問題