Создание шаблонного метода
Проблема
В подклассах реализованы алгоритмы, содержащие похожие шаги и одинаковый порядок выполнения этих шагов.
Решение
Вынесите структуру алгоритма и одинаковые шаги в суперкласс, а в подклассах оставьте реализацию отличающихся шагов.
Причины рефакторинга
Подклассы развиваются параллельно. Иногда разными людьми, что приводит к дублированию кода и ошибок, а также к усложнению поддержки, так как каждое изменение приходится проводить во всех подклассах.
Достоинства
-
Когда мы говорим о дублировании кода, не всегда имеется в виду программирование методом копирования-вставки. Нередко дублирование возникает на более абстрактном уровне. Например, у вас есть метод сортировки чисел и метод сортировки коллекции объектов. При этом, единственное, чем они отличаются — это сравнение элементов. Создание шаблонного метода позволяет справиться с таким дублированием, объединив общие шаги алгоритма в суперклассе и оставив различия для подклассов.
-
Создание шаблонного метода реализует принцип открытости/закрытости. При появлении новой версии алгоритма, вам нужно будет всего лишь создать новый подкласс, не меняя существующий код.
Порядок рефакторинга
-
Разбейте алгоритмы в подклассах на составные части, описанные в отдельных методах. В этом может помочь извлечение метода.
-
Получившиеся методы, одинаковые для всех подклассов, можете смело перемещать в суперкласс, используя подъём метода.
-
Отличающиеся методы приведите к единым названиям с помощью переименования метода.
-
Поместите сигнатуры отличающихся методов в суперкласс как абстрактные с помощью подъёма метода. Их реализации оставьте в подклассах.
-
И наконец, поднимите основной метод алгоритма в суперкласс. Он теперь должен работать с методами-шагами, описанными в суперклассе — реальными или абстрактными.