Design patterns
Открыть Закрыть
Поиск…
Вступление
Принцип 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
}
}