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