„Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.”
— Bertrand Meyer

Czym jest zasada OCP?

Zasada OCP (Open/Closed Principle) mówi, że nasze klasy i moduły powinny być:

  • otwarte na rozbudowę – możemy dodać nowe zachowanie,
  • zamknięte na modyfikację – nie musimy zmieniać istniejącego kodu.

Brzmi magicznie? W praktyce chodzi o to, aby nie grzebać w działającym kodzie, tylko go rozszerzać. Dzięki temu:

  • nie psujemy tego, co już działa,
  • kod jest bardziej odporny na zmiany,
  • nowe funkcjonalności łatwiej dodać niż napisać od nowa.

Przykład łamania OCP – instrukcja z if / switch

Wyobraź sobie klasę RaportGenerator, która generuje różne typy raportów: PDF, Excel, CSV.

public class RaportGenerator {
    public void generujRaport(String typ) {
        if (typ.equals("PDF")) {
            // generuj PDF
        } else if (typ.equals("EXCEL")) {
            // generuj Excel
        } else if (typ.equals("CSV")) {
            // generuj CSV
        }
    }
}

Problem? Każde dodanie nowego typu raportu wymusza modyfikację tej klasy. To łamie zasadę OCP. Kod działa, ale z każdym rozszerzeniem robi się coraz trudniejszy w utrzymaniu.

Lepsze podejście – polimorfizm

Zamiast modyfikować istniejącą klasę, pozwólmy ją rozszerzać przez interfejs:

public interface GeneratorRaportu {
    void generuj();
}
public class GeneratorPDF implements GeneratorRaportu {
    public void generuj() {
        // generuj PDF
    }
}

public class GeneratorExcel implements GeneratorRaportu {
    public void generuj() {
        // generuj Excel
    }
}

A następnie:

public class RaportGenerator {
    private GeneratorRaportu generator;

    public RaportGenerator(GeneratorRaportu generator) {
        this.generator = generator;
    }

    public void generujRaport() {
        generator.generuj();
    }
}

Teraz, aby dodać np. generowanie raportu do JSON, tworzysz nową klasę GeneratorJSON, a nie dotykasz starego kodu.

Korzyści z OCP

  • Bezpieczne zmiany – nie ruszasz sprawdzonego kodu, tylko dodajesz nowy.
  • Czysta architektura – każdy nowy przypadek to osobna klasa.
  • Łatwiejsze testowanie – testujesz konkretne klasy, nie całe if-else.
  • Przygotowanie pod wzorce projektowe – jak Strategy, Factory, Decorator.

Podsumowanie

OCP to zasada, która pozwala rozwijać projekt bez ryzyka rozwalenia tego, co już działa.
Jeśli widzisz w swoim kodzie rosnące if-else lub switch, pomyśl: „czy nie da się tego rozdzielić na klasy?”

Twoje klasy powinny być jak zestaw LEGO: coś można dobudować, nie niszcząc istniejącej konstrukcji.


Dodaj komentarz

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