サーチ…


前書き

オープン・クローズ・プリンシプル(Open Close Principle)によれば、コードの設計と記述は、既存のコードに最小限の変更を加えるだけで新しい機能を追加する必要があります。可能な限り多くの既存のコードを変更せずに新しいクラスとして新しい機能を追加できるように設計する必要があります。クラス、モジュール、関数などのソフトウェアエンティティは、拡張のために開かれていなければならないが、変更のために閉じられるべきである。

備考

すべての原則と同様に、原則は原則にすぎません。柔軟なデザインを作成するには、それに費やす時間と労力がかかります。新しいレベルの抽象化が導入され、コードの複雑さが増します。したがって、この原則は、変更される可能性が最も高い地域に適用する必要があります。デコレータなど、コードを変更せずにコードを拡張するために役立つ多くのデザインパターンがあります。

リストマニア

/* 
* This design have some major issues
* For each new shape added the unit testing
* of the GraphicEditor should be redone                      
* When a new type of shape is added the time
* for adding it will be high since the developer
* who add it should understand the logic
* of the GraphicEditor.
* Adding a new shape might affect the existing
* functionality in an undesired way, 
* even if the new shape works perfectly   
*/ 

class GraphicEditor {
    public void drawShape(Shape s) {
        if (s.m_type==1)
            drawRectangle(s);
        else if (s.m_type==2)
            drawCircle(s);
    }
    public void drawCircle(Circle r) {....}
    public void drawRectangle(Rectangle r) {....}
}

 class Shape {
     int m_type;
 }

 class Rectangle extends Shape {
     Rectangle() {
         super.m_type=1;
     }
 }

 class Circle extends Shape {
     Circle() {
         super.m_type=2;
     }
 }

リストマニア

/*
* For each new shape added the unit testing
* of the GraphicEditor should not be redone
* No need to understand the sourcecode
* from GraphicEditor.
* Since the drawing code is moved to the
* concrete shape classes, it's a reduced risk
* to affect old functionallity when new
* functionallity is added.
*/ 
class GraphicEditor {
     public void drawShape(Shape s) {
         s.draw();
     }
 }

 class Shape {
     abstract void draw();
 }

 class Rectangle extends Shape  {
     public void draw() {
         // draw the rectangle
     }
 } 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow