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();
}
}