S.O.L.I.D. 2 – Open/Closed Principle (OCP)

Open/Closed Principle (OCP) – zasada otwarte-zamknięte mówi o tym, że:

Klasy (encje) powinny być otwarte na rozszerzenia i zamknięte na modyfikacje.

Co to dokładnie oznacza? W życiu zmiany są pewne. Co za tym idzie, gdy musimy dodać do aplikacji np. nową funkcjonalność, nie powinno się modyfikować kodu już istniejącego. Zamiast tego powinno się rozszerzać aplikację, a nie ją modyfikować np. poprzez dodanie nowej klasy, która będzie odpowiedzialna za nowy element. Do realizacji tej metody przydatne będzie używanie polimorfizmu i dziedziczenia.

Przykład: Zegarek sportowy (klasa SportWatch) posiada różne aktywności do wyboru. Na początku mamy trzy tryby do wyboru, które zostają włączone w zależności od podanej nazwy aktywności.

public class SportWatch {
    public void switchOnMode(String sportMode){
        switch (sportMode){
            case "running":
                System.out.println("Mode running is active");
                break;
            case "aerobic":
                System.out.println("Mode aerobic is active");
                break;
            case "swimming":
                System.out.println("Mode swimming is active");
                break;
        }
    }
}

Co jeżeli chcielibyśmy dodać kolejną aktywność? Trzeba by modyfikować istniejący kod o kolejne przypadki. Zamiast tego lepiej użyć wspólnego interfejsu Mode z zadeklarowaną metodą switchOnMode(), a dla poszczególnych trybów stworzyć oddzielne klasy, które będą implementowały interfejs Mode i zastępowały metodę switchOnMode(). W klasie SportWatchOCP wywołana zostanie metoda switchOnMode() na odpowiednim podanym trybie.

public class SportWatchOCP {
    private Mode mode;
    public void switchOnMode(Mode mode){
        mode.switchOnMode();
    }
}
public interface Mode {
    void switchOnMode();
}
public class RunningMode implements Mode{
    @Override
    public void switchOnMode() {
        System.out.println("Mode running is active");
    }
}
public class SwimmingMode implements Mode{
    @Override
    public void switchOnMode() {
        System.out.println("Mode swimming is active");
    }
public class AerobicMode implements Mode{
    @Override
    public void switchOnMode() {
        System.out.println("Mode aerobic is active");
    }
}
public class HikingMode implements Mode{
    @Override
    public void switchOnMode() {
        System.out.println("Mode hiking is active");
    }
}

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *