← Назад к вопросам
Что означает буква L в SOLID?
1.2 Junior🔥 121 комментариев
#Микросервисы и архитектура
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP)
Буква L в SOLID расшифровывается как Liskov Substitution Principle — один из пяти ключевых принципов объектно-ориентированного программирования. Этот принцип был сформулирован в 1994 году Барбарой Лисков и гласит:
«Объекты подклассов должны корректно заменять объекты их базовых классов»
Суть принципа
Если класс S является подтипом класса T, то объекты типа T в программе могут быть заменены объектами типа S без нарушения желаемых свойств этой программы.
Другими словами:
- Если функция работает с базовым типом, она должна корректно работать и с любым его подтипом
- Подтип не должен усиливать предусловия
- Подтип не должен ослаблять постусловия
- Инварианты базового класса должны сохраняться
Пример нарушения LSP на Go
type Bird interface {
Fly() string
}
type Eagle struct{}
func (e Eagle) Fly() string {
return "Eagle flies high"
}
type Penguin struct{}
func (p Penguin) Fly() string {
return "Penguin cannot fly!"
}
func MakeBirdFly(b Bird) {
println(b.Fly())
}
Пингвин — это птица, но не может летать. Если мы передадим Penguin в функцию MakeBirdFly, контракт нарушится.
Правильная реализация
type Bird interface {
Move() string
}
type FlyingBird interface {
Bird
Fly() string
}
type Eagle struct{}
func (e Eagle) Move() string { return "Eagle moving" }
func (e Eagle) Fly() string { return "Eagle flying" }
type Penguin struct{}
func (p Penguin) Move() string { return "Penguin swimming" }
func MakeBirdFly(b FlyingBird) {
println(b.Fly())
}
Практическое значение
LSP обеспечивает:
- Предсказуемость кода — знаем, как работает подтип
- Гибкость архитектуры — легко добавлять новые реализации
- Надёжность — избегаем неожиданного поведения
- Тестируемость — можно подменять реальные объекты на mock'и
В Go этот принцип особенно важен при работе с интерфейсами, так как язык использует структурную типизацию.