Что означает буква 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 помогает создавать более гибкие, расширяемые и поддерживаемые системы, предотвращая неожиданное поведение при использовании подтипов.