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; их перестановка не вызывает этот баг, но ухудшает сообщение об ошибке.