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

Какой принцип SOLID под буквой О?

2.0 Middle🔥 111 комментариев
#ООП и проектирование

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

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

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

Open/Closed Principle (Принцип открытости/закрытости)

Принцип SOLID с буквой О — это Open/Closed Principle (Принцип открытости для расширения и закрытости для модификации). Этот принцип, сформулированный Бертраном Мейером, является фундаментальной идеей проектирования ПО.

Суть принципа

Принцип гласит: программные сущности (модули, классы, функции) должны быть открыты для расширения, но закрыты для модификации.

Это означает:

  • Вы должны иметь возможность добавить новую функциональность без изменения существующего кода
  • Изменения в одном месте не должны каскадировать на другие части системы
  • Код должен быть предсказуем и надежен

Практический пример на C++

❌ Нарушение принципа (закрыто для расширения)

enum PaymentType { CREDIT_CARD, PAYPAL, CRYPTO };

class PaymentProcessor {
public:
    void processPayment(PaymentType type, double amount) {
        if (type == CREDIT_CARD) {
            processCreditCard(amount);
        } else if (type == PAYPAL) {
            processPayPal(amount);
        } else if (type == CRYPTO) {
            processCrypto(amount);
        }
    }

private:
    void processCreditCard(double amount) { /* ... */ }
    void processPayPal(double amount) { /* ... */ }
    void processCrypto(double amount) { /* ... */ }
};

// Проблема: добавление нового способа оплаты требует изменения класса PaymentProcessor

✅ Соответствие принципу (открыто для расширения)

class PaymentMethod {
public:
    virtual ~PaymentMethod() = default;
    virtual void process(double amount) = 0;
};

class CreditCardPayment : public PaymentMethod {
public:
    void process(double amount) override {
        // Логика обработки кредитной карты
    }
};

class PayPalPayment : public PaymentMethod {
public:
    void process(double amount) override {
        // Логика обработки PayPal
    }
};

class CryptoPayment : public PaymentMethod {
public:
    void process(double amount) override {
        // Логика обработки крипто
    }
};

class PaymentProcessor {
private:
    std::vector<std::unique_ptr<PaymentMethod>> methods;

public:
    void registerMethod(std::unique_ptr<PaymentMethod> method) {
        methods.push_back(std::move(method));
    }

    void processPayment(PaymentMethod* method, double amount) {
        method->process(amount);
    }
};

// Расширение просто: создаем новый класс
class ApplePayPayment : public PaymentMethod {
public:
    void process(double amount) override {
        // Логика обработки Apple Pay
    }
};

// Класс PaymentProcessor не нужно менять!

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

  • Снижение риска: изменения локализованы, не влияют на остальной код
  • Переиспользуемость: компоненты более универсальны
  • Тестируемость: проще писать юнит-тесты для каждого компонента
  • Масштабируемость: система легче расширяется с новыми требованиями
  • Поддерживаемость: кодовая база остается чистой и понятной

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

  1. Абстракция через интерфейсы — используйте виртуальные методы и наследование
  2. Шаблоны проектирования — Strategy, Decorator, Observer, Factory
  3. Зависимость от абстракций — используйте абстрактные классы вместо конкретных реализаций
  4. Параметризация — шаблоны и полиморфизм позволяют параметризовать поведение

Связь с другими принципами SOLID

Открытость/закрытость часто реализуется через применение:

  • Liskov Substitution Principle — подстановка реализаций вместо базового типа
  • Dependency Inversion Principle — зависимость от абстракций

Этот принцип критически важен для создания гибких и maintainable систем в C++ и любом другом языке программирования.

Какой принцип SOLID под буквой О? | PrepBro