Zasada otwarte/zamknięte – Open/Closed Principle (OCP)

Klasy, moduły, funkcje czy komponenty powinny być otwarte na rozszerzanie, ale zamknięte na modyfikowanie.

Zasada otwarte/zamknięte (Open/Closed) zachęca do tego, by system był tak zaprojektowany, aby nowe funkcjonalności mogły być dodawane poprzez rozszerzenie kodu, a nie przez jego modyfikowanie. Oznacza to, że jeśli musisz dodać nową funkcję lub zmienić sposób działania istniejącej funkcjonalności, robisz to, tworząc nowe klasy, dziedzicząc po istniejących klasach lub implementując interfejsy, a nie edytując już istniejący kod.

Przykład z OCP:
//1. Interfejs Discount:

public interface Discount {
    double getDiscount();
}

//2. Klasy implementujące interfejs dla różnych typów klientów:

public class RegularDiscount implements Discount {
    @Override
    public double getDiscount() {
        return 0.05; // 5% dla regularnych klientów
    }
}

public class VipDiscount implements Discount {
    @Override
    public double getDiscount() {
        return 0.15; // 15% dla VIP-ów
    }
}

public class PremiumDiscount implements Discount {
    @Override
    public double getDiscount() {
        return 0.25; // 25% dla premium klientów
    }
}

//3. DiscountService, która korzysta z interfejsu:

public class DiscountService {
    public double getDiscount(Discount discount) {
        return discount.getDiscount();
    }
}

Użycie:
public class Main {
    public static void main(String[] args) {
        Discount regularDiscount = new RegularDiscount();
        Discount vipDiscount = new VipDiscount();
        Discount premiumDiscount = new PremiumDiscount();

        DiscountService discountService = new DiscountService();

        System.out.println("Rabat dla regularnych klientów: " + discountService.getDiscount(regularDiscount));
        System.out.println("Rabat dla VIP: " + discountService.getDiscount(vipDiscount));
        System.out.println("Rabat dla premium: " + discountService.getDiscount(premiumDiscount));
    }
}
Korzyści
Rozszerzalność: Jeśli w przyszłości będziemy chcieli dodać nowy typ klienta, np. „superVIP”, wystarczy dodać nową klasę implementującą interfejs Discount, bez konieczności modyfikowania istniejących klas.
Zamknięcie na modyfikacje: Kod, który już istnieje, nie musi być zmieniany, co zmniejsza ryzyko wprowadzenia nowych błędów.

Podsumowanie

Zasada Open/Closed Principle (OCP) chroni przed nadmiernym modyfikowaniem kodu, wprowadzając możliwość łatwego rozszerzania funkcjonalności poprzez dodawanie nowych klas, zamiast zmieniać już istniejące. Dzięki temu kod jest bardziej stabilny, elastyczny i gotowy na przyszłe zmiany.