0
Answered

Нарушение LSP при реализации шаблона Template Method

Dmitriy 1 month ago updated by Alexander Shvets 1 month ago 1

https://refactoring.guru/ru/design-patterns/template-method

В этой статье в разделе "Преимущества и недостатки" в качестве недостатка указывается, что при реализации этого паттрена "Вы можете нарушить принцип подстановки Барбары Лисков, изменяя базовое поведение одного из шагов алгоритма через подкласс."

Определение этого принципа гласит:

Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) - это принцип объектно-ориентированного проектирования, который гласит, что объекты в программе могут быть заменены их наследниками без изменения свойств самой программы. Другими словами, если S является подтипом T, то объекты типа T могут быть заменены объектами типа S без изменения корректности программы. Этот принцип обеспечивает расширяемость и гибкость программного обеспечения, позволяет избежать дублирования кода и улучшает повторное использование кода.

Собственно, хотелось бы понять, где происходит нарушение паттерном Template Method принципа LSP?

Answered

Здраствуйте!

Спасибо за вопрос! Хочу подчеркнуть, что именно следование этому принципу обеспечивает расширяемость и гибкость программного обеспечения, позволяет избежать дублирования кода и улучшает повторное использование кода. Такое следование не получается само-собой автоматически при наследовании.

Например, один из шагов алгоритма подразумевает, скажем, что вы сохраняете файл (этим вы задаёте неявный инвариант метода - наличие нового файла - это один из пунктов в определении принципа Лисков), а следующий шаг с этим файлом что-то делает. Затем вы отнаследовали первый метод и убрали сохранение файла, а значит нарушили инвариант метода, а значит и LSP (ну и, вероятно, сломали работу класса).