Danyloff

L из SOLID с примерами на PHP


  • ·

· ·

Принцип подстановки Лисков (Liskov Substitution Principle, LSP) — это один из пяти принципов SOLID, который гласит, что объекты должны быть заменяемыми на экземпляры их подтипов без изменения корректности программы. Другими словами, если у нас есть класс A и класс B, который является подтипом класса A, то мы должны иметь возможность использовать объекты класса B везде, где ожидается объект класса A, не нарушая корректность программы.

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

Рассмотрим пример на PHP. Предположим, у нас есть класс Rectangle, который представляет прямоугольник, и класс Square, который представляет квадрат. Квадрат является подтипом прямоугольника, так как он также имеет ширину и высоту, но они всегда равны друг другу.

class Rectangle {
    protected $width;
    protected $height;

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

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

    public function getWidth() {
        return $this->width;
    }

    public function getHeight() {
        return $this->height;
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

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

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

Класс Square является подтипом класса Rectangle, так как он наследует все его свойства и методы. Однако, если мы попытаемся использовать объект класса Square везде, где ожидается объект класса Rectangle, то мы можем столкнуться с проблемами.

Например, если мы создадим объект класса Square и установим его ширину, то его высота также изменится, так как они всегда должны быть равными. Однако, если мы попытаемся установить высоту объекта класса Square, то его ширина также изменится, что не соответствует ожидаемому поведению объекта класса Rectangle.

function printArea(Rectangle $rectangle) {
    $rectangle->setWidth(5);
    $rectangle->setHeight(4);
    echo "Area: " . $rectangle->getArea() . "n";
}

$rectangle = new Rectangle();
printArea($rectangle); // Area: 20

$square = new Square();
printArea($square); // Area: 25

Чтобы исправить это, мы можем переопределить методы setWidth и setHeight в классе Square, чтобы они всегда устанавливали и ширину, и высоту равными переданному значению. Таким образом, объект класса Square будет корректно заменять объект класса Rectangle.

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

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

Теперь, если мы создадим объект класса Square и передадим его в функцию printArea, то мы получим ожидаемый результат.

$rectangle = new Rectangle();
printArea($rectangle); // Area: 20

$square = new Square();
printArea($square); // Area: 25

Заключение

Принцип подстановки Лисков (LSP) является очень важным принципом SOLID, который помогает создавать гибкие и расширяемые приложения. Он гласит, что объекты должны быть заменяемыми на экземпляры их подтипов без изменения корректности программы. Если мы не следуем этому принципу, то мы можем столкнуться с проблемами в будущем, когда мы захотим расширить наше приложение.


Так же интересно

Entity по Эвансу

Entity - это один из ключевых концептов в DDD, который представляет собой объект, который имеет уникальную идентичность и может изменять свое состояние. Entity...