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

О чем говорит принцип open/closed

1.0 Junior🔥 121 комментариев
#ООП и проектирование

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

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

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

Принцип Open/Closed (OCP)

Принцип Open/Closed (Открыт/Закрыт) — один из ключевых SOLID принципов, сформулированный Бертраном Мейером. Он гласит: "Программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации".

Что это означает?

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

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

Парадокс этого принципа решается через полиморфизм и абстракции.

Пример нарушения принципа

// ❌ Плохо — закрыт для расширения
class PaymentProcessor {
public:
    void process(const std::string& type, double amount) {
        if (type == "credit_card") {
            processCard(amount);
        } else if (type == "paypal") {
            processPayPal(amount);
        }
        // Каждый новый способ оплаты — модификация класса!
    }
};

При добавлении нового способа оплаты (например, Apple Pay) нужно менять класс — нарушение OCP.

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

// ✅ Хорошо — открыт для расширения
class PaymentProcessor {
public:
    virtual ~PaymentProcessor() = default;
    virtual void process(double amount) = 0;
};

class CreditCardProcessor : public PaymentProcessor {
public:
    void process(double amount) override {
        std::cout << "Processing credit card: " << amount << std::endl;
    }
};

class PayPalProcessor : public PaymentProcessor {
public:
    void process(double amount) override {
        std::cout << "Processing PayPal: " << amount << std::endl;
    }
};

class ApplePayProcessor : public PaymentProcessor {
public:
    void process(double amount) override {
        std::cout << "Processing Apple Pay: " << amount << std::endl;
    }
};

// Использование
void payment(PaymentProcessor* processor, double amount) {
    processor->process(amount);
}

Теперь мы можем добавлять новые способы оплаты без изменения исходного кода.

Преимущества OCP

  • Сниженный риск — минимизация изменений в существующем коде
  • Переиспользование кода — абстракции работают для новых типов
  • Гибкость — система легко расширяется без побочных эффектов
  • Тестируемость — каждая реализация тестируется отдельно

Как достичь OCP

  1. Используйте наследование и полиморфизм — создавайте базовые интерфейсы
  2. Композиция вместо условных операторов — избегайте длинных if-else цепочек
  3. Dependency Injection — передавайте зависимости через конструктор
  4. Шаблоны (Strategy, Template Method, Factory) — для гибкого проектирования

Принцип Open/Closed — это основа масштабируемого, поддерживаемого кода, особенно в больших C++ проектах.