Поиск и исправление дефектов в расчёте площадей фигур

В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.

Короткий ответ

Что ответить на собеседовании

В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.

Подробный разбор

Ответ с пояснениями

Условие

В этом задании нужно внимательно проанализировать представленный фрагмент кода, обнаружить в нём логические и синтаксические погрешности и предложить варианты их устранения. Особое внимание следует обратить на отсутствие нужного класса, неверное использование переменных и некорректный возврат результата. Предложите более надёжную реализацию, учитывающую принципы ООП и полиморфизм.

class Shape
{
    public $w;
    public $h;

    public function __construct($w, $h)
    {
        $this->w = $w;
        $this->h = $h;
    }
}

class Triangle
{
    public $r;

    public function __construct($r)
    {
        $this->r = $r;
    }
}
class AreaCalculator
{
    public
    function calculate($figures)
    {
        $areas = [];
        foreach ($figures as $figure) {
            if (is_a($figure, 'Square')) {
                $areas[] = $figure->w * $figure->h;
            } else if (is_a($figure, 'Triangle')) {
                $areas[] = $figure->r * $figure->r * pi();
            }
        }
        return array_sum($areas);
    }
}

Ответ

В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.

interface Shape { public function area(): float; }
final class Rectangle implements Shape {
    public function __construct(private float $w, private float $h) {
        if ($w < 0 || $h < 0) throw new InvalidArgumentException();
    }
    public function area(): float { return $this->w * $this->h; }
}
final class Circle implements Shape {
    public function __construct(private float $r) {
        if ($r < 0) throw new InvalidArgumentException();
    }
    public function area(): float { return pi() * $this->r ** 2; }
}
function totalArea(Shape ...$figures): float {
    return array_sum(array_map(fn(Shape $s) => $s->area(), $figures));
}

Если нужен именно треугольник, задайте основание и высоту, площадь — их произведение пополам. Перенос строки между public и function сам по себе синтаксической ошибкой не является.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее