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

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

## Problem

Метод используется в другом классе больше, чем в собственном.

## Solution

Создайте новый метод в классе, который использует его больше других, и перенесите туда код из старого метода. Код оригинального метода превратите в обращение к новому методу в другом классе либо уберите его вообще.

## Why Refactor

1. Вы хотите переместить метод в класс, который содержит данные, с которыми, в основном, работает этот метод. Этим вы **увеличиваете связность внутри классов**.
2. Вы хотите переместить метод, чтобы убрать или уменьшить зависимость класса, вызывающего этот метод, от класса, в котором он находился. Это может быть полезно, если вызывающий класс уже имеет зависимость от класса, куда вы планируете перенести метод. Таким образом, вы **уменьшаете связанность между классами**.

## How to Refactor

1. Проверьте все фичи, используемые старым методом в его же классе. Возможно, их тоже следует переместить. Руководствуйтесь таким правилом — если фича используется только интересующим вас методом, её точно следует переносить. Если фича используется и другими методами, возможно, следует перенести и эти методы. Иногда гораздо проще перенести пачку методов, чем настраивать взаимодействие между ними в разных классах.
Проверьте, не определён ли метод в суперклассах и подклассах приемника. Если это так, вам придётся либо отказаться от идеи переноса, либо реализовать в классе-получателе подобие полиморфизма, чтобы обеспечить различную функциональность метода, которая была разнесена по классам-донорам.
2. Объявите новый метод в классе-приёмнике. Возможно, следует придумать для метода новое имя, которое в новом классе будет подходить ему больше.
3. Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект, но если нет, нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя.
Теперь у вас есть способ обратиться к объекту-получателю и новый метод в его классе. С этим всем вы уже можете превратить старый метод в обращение к новому методу.
4. Оцените, есть ли возможность удалить старый метод вообще? При этом нужно будет во всех местах, где используется этот метод, поставить обращение к новому.
## Relations

**Helps you do**

- [Извлечение класса](/ru/extract-class.md)
- [Встраивание класса](/ru/inline-class.md)
- [Замена параметров объектом](/ru/introduce-parameter-object.md)

**Similar techniques**

- [Извлечение метода](/ru/extract-method.md)
- [Перемещение поля](/ru/move-field.md)

**Eliminates smells**

- [Стрельба дробью](/ru/smells/shotgun-surgery.md)
- [Завистливые функции](/ru/smells/feature-envy.md)
- [Операторы switch](/ru/smells/switch-statements.md)
- [Параллельные иерархии наследования](/ru/smells/parallel-inheritance-hierarchies.md)
- [Цепочка вызовов](/ru/smells/message-chains.md)
- [Неуместная близость](/ru/smells/inappropriate-intimacy.md)
- [Класс данных](/ru/smells/data-class.md)

