Поиск…


Вступление

Принцип Open Close гласит, что дизайн и запись кода должны быть выполнены таким образом, чтобы добавлять новые функциональные возможности с минимальными изменениями в существующем коде. Дизайн должен быть выполнен таким образом, чтобы добавлять новые функциональные возможности в качестве новых классов, сохраняя как можно больше существующего кода без изменений. Программные объекты, такие как классы, модули и функции, должны быть открыты для расширения, но закрыты для модификаций.

замечания

Как и любой принцип Принцип Open Close Принцип - это только принцип. Создание гибкого дизайна предполагает дополнительное время и усилия, потраченные на него, и он вводит новый уровень абстракции, увеличивающий сложность кода. Поэтому этот принцип следует применять в тех областях, которые, скорее всего, будут изменены. Существует много шаблонов проектирования, которые помогают нам расширять код, не меняя его, например, декоратор.

Открыть Закрыть Принцип нарушения

/* 
* 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