Design patterns
Zasada otwartego zamknięcia
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
}
}