Назад к вопросам
Junior
70
questionbank

Что означает буква L в принципах SOLID?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

L означает Liskov Substitution Principle (Принцип подстановки Барбары Лисков).

Этот принцип гласит, что объекты базового класса должны быть заменяемыми объектами производного класса без нарушения корректности выполнения программы. Иными словами, если S является подтипом T, то объекты типа T могут быть заменены объектами типа S.

Пример нарушения:

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

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getArea() {
        return width * height;
    }
}

public class Square extends Rectangle {
    @Override
    public void setWidth(int width) {
        this.width = width;
        this.height = width; // Нарушение LSP
    }

    @Override
    public void setHeight(int height) {
        this.width = height; // Нарушение LSP
        this.height = height;
    }
}

В этом примере Square нарушает LSP, потому что метод setHeight в Square также изменяет width, что не ожидается от Rectangle. Код, написанный для работы с Rectangle, может некорректно работать с Square.

Пример соблюдения:

public interface Shape {
    int getArea();
}

public class RectangleWithLSP implements Shape {
    protected int width;
    protected int height;

    public RectangleWithLSP(int width, int height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public int getArea() {
        return width * height;
    }
}

public class SquareWithLSP implements Shape {
    protected int side;

    public SquareWithLSP(int side) {
        this.side = side;
    }

    @Override
    public int getArea() {
        return side * side;
    }
}

Здесь RectangleWithLSP и SquareWithLSP реализуют один и тот же интерфейс Shape, и их методы ведут себя ожидаемым образом, что соответствует LSP.

Соблюдение LSP помогает создавать более гибкие, расширяемые и поддерживаемые системы, предотвращая неожиданное поведение при использовании подтипов.