Принцип подстановки Барбары Лисков (LSP).
Сложность в том, что нарушение LSP не всегда очевидно на первый взгляд и может выявиться только при использовании подклассов в контексте, где ожидается поведение базового класса. Это требует глубокого понимания предполагаемого поведения базового класса и тщательного тестирования.
Пример нарушения:
swift
Если использовать Square там, где ожидается Rectangle, поведение Square по изменению только одной стороны (ширины или высоты) приведет к непредсказуемым результатам, так как базовый класс Rectangle не имеет такого поведения.
Для предотвращения нарушений LSP часто приходится переосмысливать иерархии классов, использовать композицию вместо наследования или вводить более абстрактные интерфейсы/протоколы. Это может добавить сложности в проектирование на начальных этапах.
Таблица сравнения:
| Принцип SOLID | Краткое описание | Основная сложность применения LSP |
|---|---|---|
| S (SRP) | Один класс - одна причина для изменения | Нахождение "единственной причины" |
| O (OCP) | Открыт для расширения, закрыт для модификации | Правильное использование абстракций |
| L (LSP) | Подклассы должны быть заменяемы базовыми классами | Неочевидность нарушений, требование понимания контракта базового класса |
| I (ISP) | Клиенты не должны зависеть от неиспользуемых методов | Деление интерфейсов |
| D (DIP) | Зависимость от абстракций, а не от конкретных реализаций | Внедрение зависимостей |