Вопрос проверяет понимание принципа открытости/закрытости (Open/Closed Principle) из SOLID, который является фундаментальным для создания гибкого и расширяемого кода.
Принцип открытости/закрытости (Open/Closed Principle, OCP) — это второй принцип SOLID, сформулированный Бертраном Мейером. Он утверждает, что программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации. Другими словами, вы должны иметь возможность добавлять новое поведение, не изменяя уже существующий, протестированный код.
Основная идея — использовать абстракции (интерфейсы или абстрактные классы) для определения контракта, а затем реализовывать конкретные варианты поведения. Это позволяет добавлять новые реализации без изменения кода, который зависит от абстракции.
Рассмотрим пример на JavaScript. Допустим, у нас есть класс для расчета площади фигур:
class AreaCalculator {
calculate(shape) {
if (shape.type === 'circle') {
return Math.PI * shape.radius ** 2;
} else if (shape.type === 'rectangle') {
return shape.width * shape.height;
}
}
}Этот код нарушает OCP, потому что для добавления новой фигуры (например, треугольника) нам придется изменить метод calculate. Вместо этого мы можем сделать так:
class Shape {
area() {
throw new Error('Method not implemented');
}
}
class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
area() {
return Math.PI * this.radius ** 2;
}
}
class Rectangle extends Shape {
constructor(width, height) {
super();
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
}
class AreaCalculator {
calculate(shape) {
return shape.area();
}
}Теперь для добавления треугольника мы просто создаем новый класс Triangle extends Shape с методом area(), и AreaCalculator не требует изменений.
OCP широко используется в паттернах проектирования, таких как Стратегия, Декоратор, Шаблонный метод. Он особенно полезен в больших проектах, где часто добавляются новые функции, и важно минимизировать риск поломки существующего кода.
Вывод: Принцип открытости/закрытости помогает создавать код, который легко расширять и поддерживать. Его стоит применять в любом проекте, где ожидается рост функциональности, особенно при работе с полиморфными структурами данных или плагинными архитектурами.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию