- natalia.kaczynska.programista@gmail.com
Open Close Principle (OCP) (zasada otwarte-zamknięte)
Mówi ona, że nasz kod powinien być otwarty na rozszerzanie, ale zamknięty na modyfikacje. W praktyce oznacza to, że kiedy wprowadzamy nowe funkcjonalności, powinniśmy unikać ingerencji w istniejący kod, aby nie wprowadzać błędów i ułatwić utrzymanie systemu.
Poniżej zaprezentuję przykład programu – kalkulatora, który łamie wspomnianą zasadę.
public class Calculator {
public double calculate(String operation, double x, double y) {
switch(operation) {
case "add":
return x + y;
case "subtract":
return x - y;
default:
throw new IllegalArgumentException("Unknown operation: " + operation);
}
}
}
public class Demo {
public static void main(String[] args){
Calculator calc = new Calculator();
System.out.println(calc.calculate("add", 5, 3));
System.out.println(calc.calculate("subtract", 89, 34));
}
}
W powyższym przykładzie z czasem moglibyśmy chcieć dodać jakąś nową operację do funkcji switch, a wtedy jest to modyfikacja kodu (takie zachowanie także łamie tą zasadę).
Poniżej zaprezentuję poprawioną wersję przykładu zachowującą OCP:
Najpierw tworzymy wspólny interfejs:
public interface Operation {
double calculate(double x, double y);
}
public class Add implements Operation {
@Override
public double calculate(double x, double y) {
return x + y;
}
}
Analogiczną klasę implementujemy dla odejmowania.
Zmodyfikowana klasa Calculator:
import java.util.HashMap;
import java.util.Map;
public class Calculator {
private final Map operations = new HashMap();
public Calculator() {
operations.put("add", new Add());
operations.put("subtract", new Subtract());
}
public double calculate(String operation, double x, double y) {
if (operations.containsKey(operation)) {
return operations.get(operation).calculate(x, y);
}
throw new IllegalArgumentException("Unknown operation: " + operation);
}
}
Wniosek – za pomocą użycia polimorfizmu oraz interfejsu, jesteśmy w stanie zastosować zasadę OCP, dzięki czemu nie modyfikujemy istniejącego kodu, a jedynie go rozszerzamy.