Назад к вопросам
Middle
104
questionbank
Какой принцип из SOLID позволяет соблюдать расширяемость и добавочные изменения в работе программного обеспечения?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Принцип открытости/закрытости (Open/Closed Principle).
Он гласит, что программные сущности (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что новое поведение можно добавлять, не изменяя существующий код.
Пример реализации с использованием интерфейса:
<?php
// Интерфейс для фигуры
interface Shape {
public function calculateArea(): float;
}
// Конкретная реализация - квадрат
class Square implements Shape {
private float $side;
public function __construct(float $side) {
$this->side = $side;
}
public function calculateArea(): float {
return $this->side * $this->side;
}
}
// Конкретная реализация - круг (добавлено для расширения)
class Circle implements Shape {
private float $radius;
public function __construct(float $radius) {
$this->radius = $radius;
}
public function calculateArea(): float {
return M_PI * $this->radius * $this->radius;
}
}
// Класс для расчета общей площади (закрыт для модификации, открыт для расширения)
class AreaCalculator {
public function calculateTotalArea(array $shapes): float {
$totalArea = 0;
foreach ($shapes as $shape) {
// Вызываем метод интерфейса, не зная конкретного типа Shape
$totalArea += $shape->calculateArea();
}
return $totalArea;
}
}
// Использование
$square = new Square(5);
$circle = new Circle(3);
$calculator = new AreaCalculator();
$shapes = [$square, $circle]; // Можно добавить другие фигуры без изменения AreaCalculator
echo "Total area: " . $calculator->calculateTotalArea($shapes); // Выводит общую площадь
В этом примере, если нужно добавить новый тип фигуры (например, треугольник), достаточно создать новый класс, реализующий интерфейс Shape. Класс AreaCalculator остается неизменным, соблюдая принцип закрытости для модификации.