Однако, если вы уверены, что принцип замены Лискова будет соблюдаться, то почему бы вам не допустить его отмены?
Например, потому что я хочу, чтобы каркасная реализация алгоритма была фиксированной, и позволяла (пере) определять только определенные части подклассами. Это широко известно как шаблонный метод (выделено мной ниже):
Таким образом, шаблонный метод управляет большей картиной семантики задач и более детализированными деталями реализации выбора и последовательности методов. Эта большая картина вызывает абстрактные и неабстрактные методы для поставленной задачи. Неабстрактные методы полностью контролируются шаблонным методом, но абстрактные методы, реализованные в подклассах, обеспечивают выразительную силу и степень свободы шаблона. Некоторые или все абстрактные методы могут быть специализированы для подкласса, что позволяет автору подкласса обеспечивать конкретное поведение с минимальными изменениями в большей семантике. Шаблонный метод (который не является абстрактным) остается неизменным в этом шаблоне, гарантируя, что подчиненные неабстрактные методы и абстрактные методы вызываются в первоначально предназначенной последовательности.
Обновить
Некоторые конкретные примеры проектов, над которыми я работал:
- общение с устаревшей системой мэйнфреймов через различные «экраны». Каждый экран имеет набор полей с фиксированным именем, положением и длиной, содержащих определенные биты данных. Запрос заполняет определенные поля конкретными данными. Ответ возвращает данные в одном или нескольких других полях. Каждая транзакция следует одной и той же базовой логике, но детали различны на каждом экране. Мы использовали шаблонный метод в нескольких различных проектах для реализации фиксированного каркаса логики обработки экрана, в то же время позволяя подклассам определять детали экрана.
- экспорт / импорт данных конфигурации в таблицах БД в / из файлов Excel. Опять же, базовая схема обработки файла Excel и вставки / обновления записей БД или выгрузки записей в Excel одинакова для каждой таблицы, но детали каждой таблицы различны. Поэтому Template Method является очень очевидным выбором для устранения дублирования кода и облегчения понимания и сопровождения кода.
- Генерация PDF документов. Каждый документ имеет одинаковую структуру, но его содержание каждый раз отличается в зависимости от множества факторов. Опять же, Template Method позволяет легко отделить фиксированный каркас алгоритма генерации от изменяемых деталей, зависящих от конкретного случая. По факту. здесь он применяется даже на нескольких уровнях, поскольку документ состоит из нескольких разделов , каждый из которых состоит из нуля или более полей . Шаблонный метод применяется на 3 различных уровнях здесь.
В первых двух случаях первоначальная унаследованная реализация использовала стратегию , в результате чего появилось много дублирующегося кода, который, разумеется, с годами увеличивал тонкие различия здесь и там, содержал множество дублированных или слегка отличающихся ошибок, и их было очень трудно поддерживать. Рефакторинг к Template Method (и некоторым другим улучшениям, таким как использование аннотаций Java) уменьшил размер кода примерно на 40-70%.
Это только самые последние примеры, которые приходят мне в голову. Я мог бы привести больше примеров из почти каждого проекта, над которым я до сих пор работал.