Что такое принцип открытости и закрытости (OCP)
Принципы S.O.L.I.D
Принцип открытости/закрытости: поведение сущности расширяется без изменения её существующего кода — новые варианты добавляются новым кодом, а не правкой старого.
Пример нарушения
function discount(customer) {
if (customer.type === 'vip') {
return 0.2;
}
if (customer.type === 'new') {
return 0.1;
}
}Каждый новый тип клиента — правка функции и риск сломать работающие ветки.
Как открыть для расширения
Полиморфизм: интерфейс DiscountPolicy и по реализации на тип клиента; функция работает с абстракцией. Новый тип — новый класс, старый код не тронут. Альтернативы: стратегии, регистрация обработчиков, события.
Границы применимости
- Закрытость достижима только против предвиденных осей изменений: угадать все невозможно, попытка ведёт к лишним абстракциям.
- Первое изменение допустимо внести напрямую; абстракцию вводят, когда вариация реально повторилась — правило трёх ударов.
Коротко для собеседования
OCP — новый вариант поведения добавляется новым кодом, а не правкой проверенного. Типовые инструменты — Strategy, Decorator и реестр обработчиков вместо растущего if; но абстракцию вводят, когда вариация действительно повторилась, иначе закрываешься от изменений, которых не будет.