Mateusz Wajnberger

Open Close Principle

Zasada  mówiąca, że klasy powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje. Kod powinien być napisany w taki sposób, by w przypadku rozwoju systemu i pojawiających się kolejnych wymagań, nie trzeba było zmieniać istniejących już linijek kodu. 

Przykład 

Wyobraźmy sobie, że piszemy aplikację, która ma za zadanie obliczenie powierzchni, różnych kształtów. Tworzymy na początku klasę „Rectangle.

public class Rectangle  {

public Double length;
public Double width;
}

Następnie dodajemy klasę „AreaCalculator”, która oblicza powierzchnie. Wewnątrz klasy dodajemy metodę zwracającą powierzchnie prostokąta. 

public class AreaCalculator {

public Double calculateRectangleArea(Rectangle rectangle) {
return rectangle.length * rectangle.width;
}
}

Teraz dodajemy kolejną klasę „Circle”, a do klasy „AreaCalculator” dodajemy kolejną metodę zwracającą powierzchnię koła. 

public class Circle {

public Double radius;
}
public class AreaCalculator {

public Double calculateRectangleArea(Rectangle rectangle) {
return rectangle.length * rectangle.width;
}

public Double calculateArea() {
return 3.14 * circle.radius * circle.radius;
}
}

Zastosowanie Open Close Principle

Analizując powyższy kod widzimy, że dodając coraz to nowe kształty musielibyśmy edytować za każdym razem klasę „AreaCalculator”. Lepszym pomysłem jest dodanie interfejsu „Shape”, który będą implementować klasy „Circle” oraz „Rectangle”. Obie te klasy zapewniają własną nadpisaną implementacje metody „calculateArea”. Jeśli w przyszłości chcielibyśmy obliczyć pola innych kształtów, możemy zaimplementować interfejs „Shape” bez edycji żadnej z klas. 

public interface Shape {

public Double calculateArea();
}
public class Rectangle implements Shape {

Double length;
Double width;

@Override
public double calculateArea() {
return length * width;
}
}
public class Circle implements Shape {

public Double radius;

@Override
public Double calculateArea() {
return 3.14 * circle.radius * circle.radius;
}
}

Klasa „AreaCalculator” prezentowałaby się nastepująco. 

public class AreaCalculator {

public Double calculateShapeArea(Shape shape) {
return shape.calculateArea();
}
}

Podsumowanie

Zasada OCP zapewnia lepszą rozszerzalność kodu. Dzięki niej nasz kod jest mniej ze sobą powiązany przez co nie  uzyskujemy zależności pomiędzy elementami, co w przypadku potencjalnych zmian w kodzie nie spowoduje problemów w innej części kodu. 

mateusz.wajnberger@gmail.com