← Назад к вопросам

Что такое OCP?

1.3 Junior🔥 131 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое OCP (Open/Closed Principle)?

OCP — это второй принцип SOLID, который гласит: "Программные сущности должны быть открыты для расширения, но закрыты для модификации". Это означает, что вы должны иметь возможность добавлять новую функциональность без изменения существующего кода.

Концепция

Открыт для расширения — вы можете добавлять новое поведение

Закрыт для модификации — существующий код не должен изменяться

Это может звучать как противоречие, но на практике это достигается через абстракции — интерфейсы, базовые классы, стратегии, полиморфизм.

Почему это важно?

  1. Снижает риск регрессии — когда вы не трогаете существующий код, вероятность сломать что-то минимальна
  2. Упрощает тестирование — старые unit-тесты продолжают работать
  3. Масштабируемость — легко добавлять новые функции
  4. Поддерживаемость — кодовая база остаётся стабильной

Примеры нарушения OCP

// ПЛОХО: нарушение OCP
class PaymentProcessor {
  process(payment: any) {
    if (payment.type === 'credit_card') {
      console.log('Processing credit card');
    } else if (payment.type === 'paypal') {
      console.log('Processing PayPal');
    }
  }
}

Проблема: нужно модифицировать класс при каждом новом способе оплаты.

Правильная реализация OCP

// ХОРОШО: соответствие OCP
interface PaymentStrategy {
  process(amount: number): Promise<void>;
}

class CreditCardPayment implements PaymentStrategy {
  async process(amount: number) {
    console.log(`Processing: ${amount}`);
  }
}

class PaymentProcessor {
  constructor(private strategy: PaymentStrategy) {}
  async process(amount: number) {
    await this.strategy.process(amount);
  }
}

Техники реализации

1. Стратегический паттерн — определяем интерфейс, создаём реализации

2. Декоратор — оборачиваем базовый класс, добавляя функциональность

3. Template Method — базовый класс определяет структуру, подклассы переопределяют шаги

4. Полиморфизм — используем интерфейсы вместо конкретных классов

OCP в микросервисной архитектуре

В микросервисах OCP особенно ценен: новый микросервис = новая реализация интерфейса, старые сервисы без изменений, масштабирование через добавление, не через модификацию.

Вывод

OCP — это о создании гибкой архитектуры через абстракции. Когда вы хотите модифицировать код при добавлении функционала — это сигнал нарушения OCP. Хороший дизайн позволяет расширяться без изменений.