Книга: Погружение в Паттерны Проектирования
Назад: O: Принцип открытости/закрытости
Дальше: I: Принцип разделения интерфейса
Принцип назван в честь Барбары Лисков, которая впервые сформулировала его 1987 году в работе Data abstraction and hierarchy:

iskov Substitution Principle

Подклассы должны дополнять, а не замещать поведение базового класса.

Стремитесь создавать подклассы таким образом, чтобы их объекты можно было бы подставлять вместо объектов базового класса, не ломая при этом функциональности клиентского кода.

Принцип подстановки — это ряд проверок, которые помогают предсказать, останется ли подкласс совместим с остальным кодом программы, который до этого успешно работал, используя объекты базового класса. Это особенно важно при разработке библиотек и фреймворков, когда ваши классы используются другими людьми, и вы не можете повлиять на чужой клиентский код, даже если бы хотели.

В отличие от других принципов, которые определены очень свободно и имеют массу трактовок, принцип подстановки имеет ряд формальных требований к подклассам, а точнее к переопределённым в них методах.

Пример

Чтобы закрыть тему принципа подстановки, давайте рассмотрим пример неудачной иерархии классов документов.

Нарушение принципа подстановки Лисков

ДО: подкласс «обнуляет» работу базового метода.

Метод сохранения в подклассе ReadOnlyDocuments выбросит исключение, если кто-то попытается вызвать его метод сохранения. Базовый метод не имеет такого ограничения. Из-за этого, клиентский код вынужден проверять тип документа при сохранении всех документов.

При этом нарушается ещё и принцип открытости/закрытости, так как клиентский код начинает зависеть от конкретного класса, который нельзя заменить на другой, не внося изменений в клиентский код.

Соблюдение принципа подстановки Лисков

ПОСЛЕ: подкласс расширяет базовый класс новым поведением.

Проблему можно решить, если перепроектировав иерархию классов. Базовый класс сможет только открывать документы, но не сохранять их. Подкласс, который теперь будет называться WritableDocument, расширит поведение родителя, позволив сохранять документ.

Назад: O: Принцип открытости/закрытости
Дальше: I: Принцип разделения интерфейса

asd
asdda