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
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.