Принцип подстановки Барбары Лисков (LSP) гласит, что в программе объекты дочерних классов должны иметь возможность заменять объекты родительских классов, не нарушая при этом правильности выполнения программы.
Применение в Android-разработке:
Иерархии классов: При проектировании иерархий классов (например, наследующих от View, Fragment, Activity) LSP гарантирует, что использование экземпляра подкласса вместо суперкласса не приведет к неожиданному поведению.
Интерфейсы: Если класс реализует интерфейс, он должен это делать таким образом, чтобы его можно было использовать везде, где ожидается тип интерфейса, не нарушая ожиданий потребителя.
kotlin
Тестирование: Соблюдение LSP упрощает тестирование, так как можно подставлять моки или заглушки (которые являются подтипами) вместо реальных реализаций без изменения тестовой логики.
Контракты: LSP подчеркивает важность соблюдения контрактов методов — всех ожидаемых условий перед вызовом (предусловия), после вызова (постусловия) и инвариантов (состояния объекта). Подкласс не должен ослаблять предусловия или усиливать постусловия родительского класса.
| Условие | Родительский класс (Супертип) | Дочерний класс (Подтип) |
|---|---|---|
| Предусловие | Может быть ослаблено | Должно быть таким же или ослабленным |
| Постусловие | Может быть усилено | Должно быть таким же или усиленным |
| Инвариант | Должен соблюдаться | Должен соблюдаться так же или более строго |
| Исключения | Может быть выброшено X | Может быть выброшено X или подтип X |