PassFront
  1. PassFront
  2. База знаний
  3. Принципы S.O.L.I.D

Что такое принцип открытости и закрытости (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; но абстракцию вводят, когда вариация действительно повторилась, иначе закрываешься от изменений, которых не будет.

Другие вопросы раздела