Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: SOLID, Open Closed Principle, object oriented design, software architecture, code maintainability

В чем заключается принцип открытости-закрытости (Open/Closed Principle)?

Вопрос проверяет понимание принципа открытости-закрытости (OCP), одного из пяти принципов SOLID, который важен для создания гибкого и поддерживаемого кода.

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

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

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

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

Проблема без OCP

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

class AreaCalculator {
    calculateArea(shape) {
        if (shape.type === 'circle') {
            return Math.PI * shape.radius * shape.radius;
        } else if (shape.type === 'square') {
            return shape.side * shape.side;
        }
        // Добавление нового типа (например, 'triangle') требует изменения этого метода!
    }
}

Решение с использованием OCP

Чтобы следовать OCP, мы определяем абстракцию (интерфейс или абстрактный класс) для фигуры с методом calculateArea(). Каждая конкретная фигура реализует этот интерфейс самостоятельно.

// Абстракция (открыта для расширения)
interface Shape {
    calculateArea(): number;
}

// Конкретные реализации (новые фигуры добавляются как новые классы)
class Circle implements Shape {
    constructor(private radius: number) {}
    calculateArea() { return Math.PI * this.radius * this.radius; }
}

class Square implements Shape {
    constructor(private side: number) {}
    calculateArea() { return this.side * this.side; }
}

// Класс-калькулятор теперь закрыт для модификации
class AreaCalculator {
    calculateArea(shape: Shape) {
        return shape.calculateArea(); // Не зависит от конкретного типа фигуры
    }
}

Где и как применяется

OCP широко применяется в архитектуре плагинов, middleware-цепочках (например, в Express.js или Nest.js), стратегиях (паттерн Strategy) и любых системах, где требуется частое добавление новой функциональности. Он лежит в основе многих фреймворков, которые позволяют расширять свое ядро через пользовательские модули, не трогая исходный код фреймворка.

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Java

    Java

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

#SOLID

#Open Closed Principle

#object oriented design

#software architecture

#code maintainability

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