Какой принцип SOLID обозначается буквой O?

«Какой принцип SOLID обозначается буквой O?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это принцип открытости/закрытости (Open/Closed Principle, OCP). Его суть в том, что классы должны быть открыты для расширения новой функциональности, но закрыты для модификации существующего кода. На практике в C++ это достигается через наследование и полиморфизм, а также с помощью шаблонов (стратегия, посетитель).

Пример из моего опыта: В проекте системы рендеринга у нас был базовый класс Drawable. Когда потребовалось добавить новый тип графического объекта (например, частицы), мы не стали изменять существующий код отрисовки, а создали новый класс ParticleSystem, унаследованный от Drawable.

class Drawable {
public:
    virtual ~Drawable() = default;
    virtual void render(const RenderContext& context) const = 0;
};

class Mesh : public Drawable {
    std::vector<Vertex> vertices;
public:
    void render(const RenderContext& context) const override {
        // Код отрисовки меша
    }
};

// НОВЫЙ ТИП - РАСШИРЕНИЕ БЕЗ ИЗМЕНЕНИЙ
class ParticleSystem : public Drawable {
    std::vector<Particle> particles;
public:
    void render(const RenderContext& context) const override {
        // Код отрисовки системы частиц
    }
};

// Функция отрисовки сцены осталась НЕИЗМЕННОЙ
void renderScene(const std::vector<std::unique_ptr<Drawable>>& objects) {
    for (const auto& obj : objects) {
        obj->render(currentContext);
    }
}

Таким образом, мы расширили функциональность, не затрагивая и не рискуя сломать уже работающий код.