Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: Open Closed Principle, SOLID, extensibility, polymorphism, inheritance

Почему важно не изменять существующие реализации, а только расширять их?

Этот вопрос проверяет понимание принципа открытости/закрытости (Open/Closed Principle) из SOLID, который помогает создавать гибкий и устойчивый к изменениям код.

Короткий ответ

Принцип открытости/закрытости (OCP) гласит: классы должны быть открыты для расширения, но закрыты для изменения. Это значит, что новую функциональность нужно добавлять через наследование, композицию или интерфейсы, не трогая уже работающий код. Такой подход снижает риск внесения ошибок в проверенные модули и упрощает поддержку системы.

Длинный ответ

Что такое принцип открытости/закрытости?

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

Зачем это нужно?

Изменение уже работающего кода может привести к появлению ошибок в тех местах, которые раньше функционировали корректно. Если вы постоянно правите существующие классы, тестировать и поддерживать систему становится всё сложнее. OCP помогает строить архитектуру, в которой новые требования реализуются через добавление нового кода, а не через переписывание старого.

Как это реализовать на практике?

Основные способы соблюдения OCP:

  • Наследование и полиморфизм — создайте базовый класс или интерфейс, а затем наследуйте от него конкретные реализации.
  • Композиция — используйте внедрение зависимостей (Dependency Injection), чтобы подменять поведение без изменения класса.
  • Стратегия (Strategy) — вынесите изменяемое поведение в отдельные классы и передавайте их в основной объект.

Пример кода

Рассмотрим нарушение OCP: класс AreaCalculator вычисляет площадь фигур, но при добавлении новой фигуры приходится менять его код.

class AreaCalculator {
    public function calculate($shape) {
        if ($shape instanceof Circle) {
            return pi() * $shape->radius ** 2;
        } elseif ($shape instanceof Square) {
            return $shape->side ** 2;
        }
        // При добавлении Triangle нужно добавить новый elseif
    }
}

Соблюдение OCP: вводим интерфейс Shape с методом area(), и каждая фигура реализует его. Тогда AreaCalculator не нужно менять.

interface Shape {
    public function area(): float;
}

class Circle implements Shape {
    public function __construct(public float $radius) {}
    public function area(): float {
        return pi() * $this->radius ** 2;
    }
}

class Square implements Shape {
    public function __construct(public float $side) {}
    public function area(): float {
        return $this->side ** 2;
    }
}

class AreaCalculator {
    public function calculate(Shape $shape): float {
        return $shape->area();
    }
}

Теперь для добавления Triangle достаточно создать новый класс, реализующий Shape, — изменять AreaCalculator не требуется.

Вывод

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#Open Closed Principle

#SOLID

#extensibility

#polymorphism

#inheritance

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию