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

> Проблема: Поведение, реализованное в суперклассе, используется только одним или несколькими подклассами. Решение: Переместите это поведение в подклассы.

## Problem

Поведение, реализованное в суперклассе, используется только одним или несколькими подклассами.

## Solution

Переместите это поведение в подклассы.

## Why Refactor

Метод, который планировали сделать универсальным для всех классов, по факту используется только в одном подклассе. Такая ситуация может возникнуть, когда планируемые фичи так и не были реализованы.

Кроме того, такая ситуация может возникнуть после извлечения (или удаления) части функциональности из иерархии классов, после которого метод остался используемым только в одном подклассе.

Если вы видите, что метод необходим более чем одному подклассу (но не всем), возможно, стоит создать промежуточный подкласс и переместить метод в него. Это позволит избежать дублирования кода, которое возникло бы при спуске метода во все подклассы.

## Benefits

* Улучшает связность внутри классов. Метод находится там, где вы ожидаете его увидеть.

## How to Refactor

1. Объявите метод в подклассе и скопируйте его код из суперкласса.
2. Удалите метод из суперкласса.
3. Найдите все места, где используется метод, и убедитесь, что он вызывается из нужного подкласса.
## Relations

**Helps you do**

- [Извлечение подкласса](/ru/extract-subclass.md)

**Similar techniques**

- [Спуск поля](/ru/push-down-field.md)

**Opposite refactorings**

- [Подъём метода](/ru/pull-up-method.md)

**Eliminates smells**

- [Отказ от наследства](/ru/smells/refused-bequest.md)

