Нарушение LSP при реализации шаблона Template Method
https://refactoring.guru/ru/design-patterns/template-method
В этой статье в разделе "Преимущества и недостатки" в качестве недостатка указывается, что при реализации этого паттрена "Вы можете нарушить принцип подстановки Барбары Лисков, изменяя базовое поведение одного из шагов алгоритма через подкласс."
Определение этого принципа гласит:
Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) - это принцип объектно-ориентированного проектирования, который гласит, что объекты в программе могут быть заменены их наследниками без изменения свойств самой программы. Другими словами, если S является подтипом T, то объекты типа T могут быть заменены объектами типа S без изменения корректности программы. Этот принцип обеспечивает расширяемость и гибкость программного обеспечения, позволяет избежать дублирования кода и улучшает повторное использование кода.
Собственно, хотелось бы понять, где происходит нарушение паттерном Template Method принципа LSP?
UserEcho 的客户支持
Здраствуйте!
Спасибо за вопрос! Хочу подчеркнуть, что именно следование этому принципу обеспечивает расширяемость и гибкость программного обеспечения, позволяет избежать дублирования кода и улучшает повторное использование кода. Такое следование не получается само-собой автоматически при наследовании.
Например, один из шагов алгоритма подразумевает, скажем, что вы сохраняете файл (этим вы задаёте неявный инвариант метода - наличие нового файла - это один из пунктов в определении принципа Лисков), а следующий шаг с этим файлом что-то делает. Затем вы отнаследовали первый метод и убрали сохранение файла, а значит нарушили инвариант метода, а значит и LSP (ну и, вероятно, сломали работу класса).