← Назад к вопросам

Что означает буква 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 этот принцип особенно важен при работе с интерфейсами, так как язык использует структурную типизацию.

Что означает буква L в SOLID? | PrepBro