Szukaj…


Wprowadzenie

Zasada Otwartego Zamknięcia stanowi, że projektowanie i pisanie kodu powinno odbywać się w taki sposób, aby nowa funkcjonalność była dodawana przy minimalnych zmianach w istniejącym kodzie. Projekt powinien być wykonany w sposób umożliwiający dodanie nowej funkcjonalności jako nowych klas, zachowując możliwie jak najwięcej istniejącego kodu bez zmian. Elementy oprogramowania, takie jak klasy, moduły i funkcje, powinny być otwarte dla rozszerzenia, ale zamknięte dla modyfikacji.

Uwagi

Jak każda zasada zasada otwartego zamknięcia jest tylko zasadą. Wykonanie elastycznego projektu wymaga dodatkowego czasu i wysiłku poświęconego mu na wprowadzenie nowego poziomu abstrakcji, zwiększając złożoność kodu. Tak więc zasada ta powinna być stosowana w obszarach, które najprawdopodobniej zostaną zmienione. Istnieje wiele wzorców projektowych, które pomagają nam rozszerzać kod bez jego zmiany, na przykład dekorator.

Naruszenie zasady otwartej zamkniętej

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

Obsługa Open Close Principle

/*
* 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow