---
title: "Создание шаблонного метода"
type: "refactoring-technique"
slug: "form-template-method"
url: "http://localhost:3000/ru/form-template-method.md"
category: "Решение задач обобщения"
description: "Проблема: В подклассах реализованы алгоритмы, содержащие похожие шаги и одинаковый порядок выполнения этих шагов. Решение: Вынесите структуру алгоритма и одинаковые шаги в суперкласс, а в подклассах оставьте реализацию отличающихся шагов."
---
# Создание шаблонного метода

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

## Problem

В подклассах реализованы алгоритмы, содержащие похожие шаги и одинаковый порядок выполнения этих шагов.

## Solution

Вынесите структуру алгоритма и одинаковые шаги в суперкласс, а в подклассах оставьте реализацию отличающихся шагов.

## Why Refactor

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

## Benefits

* Когда мы говорим о дублировании кода, не всегда имеется в виду программирование методом копирования-вставки. Нередко дублирование возникает на более абстрактном уровне. Например, у вас есть метод сортировки чисел и метод сортировки коллекции объектов. При этом, единственное, чем они отличаются — это сравнение элементов. Создание шаблонного метода позволяет справиться с таким дублированием, объединив общие шаги алгоритма в суперклассе и оставив различия для подклассов.
* Создание шаблонного метода реализует _принцип открытости/закрытости_. При появлении новой версии алгоритма, вам нужно будет всего лишь создать новый подкласс, не меняя существующий код.

## How to Refactor

1. Разбейте алгоритмы в подклассах на составные части, описанные в отдельных методах. В этом может помочь [извлечение метода](/ru/extract-method).
2. Получившиеся методы, одинаковые для всех подклассов, можете смело перемещать в суперкласс, используя [подъём метода](/ru/pull-up-method).
3. Отличающиеся методы приведите к единым названиям с помощью [переименования метода](/ru/rename-method).
4. Поместите сигнатуры отличающихся методов в суперкласс как абстрактные с помощью [подъёма метода](/ru/pull-up-method). Их реализации оставьте в подклассах.
5. И наконец, поднимите основной метод алгоритма в суперкласс. Он теперь должен работать с методами-шагами, описанными в суперклассе — реальными или абстрактными.
## Relations

**Eliminates smells**

- [Дублирование кода](/ru/smells/duplicate-code.md)

