Обнаружьте и исправьте ошибки в реализации классов

Square нарушает контракт изменяемого Rectangle: изменение высоты неожиданно меняет ширину. Это нарушение подстановки; общим должен быть интерфейс площади, а не независимые сеттеры сторон.

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

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

Square нарушает контракт изменяемого Rectangle: изменение высоты неожиданно меняет ширину. Это нарушение подстановки; общим должен быть интерфейс площади, а не независимые сеттеры сторон.

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

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

Условие

Требуется проанализировать представленный код, выявить в нём нарушения и предложить корректные исправления.

class Rectangle
{
    protected int $width;
    protected int $height;

    public function setWidth(int $width): void {
        $this->width = $width;
    }

    public function setHeight(int $height): void {
        $this->height = $height;
    }

    public function calculateArea(): int
    {
        return $this->width * $this->height;
    }
}

class Square extends Rectangle
{
    public function setWidth(int $width): void {
        $this->width = $width;
        $this->height = $width;
    }

    public function setHeight(int $height): void {
        $this->width = $height;
        $this->height = $height;
    }
}

class RectangleTest extends TestCase
{
    public function testCalculateArea()
    {
        // $shape = new Rectangle();
        $shape = new Square();

        $shape->setWidth(10);
        $shape->setHeight(2);

        $this->assertEquals($shape->calculateArea(), 20); // FAILS - 4 != 20

        $shape->setWidth(5);
        $this->assertEquals($shape->calculateArea(), 10); // FAILS - 25 != 10
    }
}

Ответ

Square нарушает контракт изменяемого Rectangle: изменение высоты неожиданно меняет ширину. Это нарушение подстановки; общим должен быть интерфейс площади, а не независимые сеттеры сторон.

Разделите Rectangle(width, height) и Square(side), реализующие AreaShape::calculateArea(). Инициализируйте размеры конструктором и проверяйте допустимость значений. Тест прямоугольника ожидает независимость сторон, поэтому нельзя подставлять квадрат и просто менять ожидаемые числа. В PHPUnit аргументы assertEquals принято передавать как expected, actual; их перестановка не вызывает этот баг, но ухудшает сообщение об ошибке.

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

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

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

Подробнее