Назад к вопросам
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 остается неизменным, соблюдая принцип закрытости для модификации.