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.

Przewijanie do góry