Вопрос проверяет понимание принципа открытости-закрытости (OCP), одного из пяти принципов SOLID, который важен для создания гибкого и поддерживаемого кода.
Принцип открытости-закрытости (Open/Closed Principle, OCP) — это второй принцип из набора SOLID, который направлен на создание устойчивых к изменениям систем. Его основная идея заключается в том, что поведение модуля можно расширять, не внося изменений в его исходный код. Это достигается через проектирование с использованием абстракций (интерфейсов или абстрактных классов) и делегирование конкретной реализации производным классам.
Рассмотрим типичный пример: система, которая рассчитывает площадь различных фигур. Без следования 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, мы определяем абстракцию (интерфейс или абстрактный класс) для фигуры с методом 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
Java
Ключевые слова
Подпишись на Java Developer в телеграм