SOLID-L
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) является одним из пяти базовых принципов SOLID и описывает концепцию замены объектов на их подтипы без изменения корректности программы. Этот принцип определяет, каким образом подклассы (подтипы) должны вести себя в сравнении с их суперклассами (базовыми типами). Формулировка принципа звучит так:
"Если S является подтипом T, то объекты типа T могут быть заменены объектами типа S без нарушения правильности программы."
Или, иными словами, когда вы используете объект базового класса, то должны быть уверены, что можно заменить его на объект его подкласса, и программа будет работать корректно.
Для понимания этого принципа важно понять, что подтипы должны соблюдать контракт, определенный супертипом, и не должны изменять предусловия, постусловия и инварианты супертипа.
Допустим, у нас есть иерархия классов для фигур:
abstract class Shape {
abstract fun area(): Double
}
class Rectangle : Shape() {
var width: Double = 0.0
var height: Double = 0.0
override fun area(): Double {
return width * height
}
}
class Square : Shape() {
var side: Double = 0.0
override fun area(): Double {
return side * side
}
}
В данном случае, принцип LSP нарушается, так как предполагается, что метод area()
должен возвращать площадь фигуры, однако для квадрата он возвращает квадрат его стороны, что не соответствует ожидаемому поведению для прямоугольника.
Пример соблюдения принципа LSP:
abstract class Shape {
abstract fun area(): Double
}
class Rectangle : Shape() {
var width: Double = 0.0
var height: Double = 0.0
override fun area(): Double {
return width * height
}
}
class Square : Shape() {
var side: Double = 0.0
override fun area(): Double {
return side * side
}
}
// Дополнительный пример, не связанный с геометрическими фигурами
class Circle : Shape() {
var radius: Double = 0.0
override fun area(): Double {
return Math.PI * radius * radius
}
}
В этом примере, каждый подтип (Rectangle, Square, Circle) соблюдает контракт супертипа Shape и возвращает площадь, что соответствует ожиданиям и не нарушает принцип LSP.
Соблюдение принципа подстановки Барбары Лисков ведет к созданию более гибких и легко расширяемых систем, поскольку позволяет заменять объекты базовых классов на их подтипы без необходимости изменения кода, использующего эти объекты.