---
title: "Mover Método"
type: "refactoring-technique"
slug: "move-method"
url: "http://localhost:3000/pt-br/move-method.md"
category: "Moving Features between Objects"
description: "Problema: um método é usado mais em outra classe do que na sua própria classe. Solução: crie um novo método na classe que mais usa o método e, em seguida, mova o código do método antigo para lá. Transforme o código do método original em uma referência ao novo método na outra classe ou então remova-o por completo."
---
# Mover Método

> Problema: um método é usado mais em outra classe do que na sua própria classe. Solução: crie um novo método na classe que mais usa o método e, em seguida, mova o código do método antigo para lá. Transforme o código do método original em uma referência ao novo método na outra classe ou então remova-o por completo.

## Problem

Um método é usado mais em outra classe do que na sua própria classe.

## Solution

Crie um novo método na classe que mais usa o método e, em seguida, mova o código do método antigo para lá. Transforme o código do método original em uma referência ao novo método na outra classe ou então remova-o por completo.

## Why Refactor

1. Você quer mover um método para uma classe que contém a maior parte dos dados usados pelo método. Isso torna as **classes mais coerentes internamente**.
2. Você quer mover um método para reduzir ou eliminar a dependência da classe que chama o método em relação à classe onde ele está localizado. Isso pode ser útil se a classe chamadora já depende da classe para a qual você planeja mover o método. Isso **reduz a dependência entre as classes**.

## How to Refactor

1. Verifique todas as funcionalidades usadas pelo método antigo em sua classe. Pode ser uma boa ideia movê-las também. Como regra, se uma funcionalidade é usada apenas pelo método em questão, você certamente deve mover a funcionalidade junto com ele. Se a funcionalidade também for usada por outros métodos, você deve mover esses métodos também. Às vezes é muito mais fácil mover um grande número de métodos do que estabelecer relações entre eles em classes diferentes.
Certifique-se de que o método não esteja declarado em superclasses e subclasses. Se for o caso, você terá que se abster de movê-lo ou então implementar uma espécie de polimorfismo na classe destinatária para garantir a funcionalidade variável de um método dividido entre as classes doadoras.
2. Declare o novo método na classe destinatária. Talvez você queira dar ao método um novo nome que seja mais apropriado para ele na nova classe.
3. Decida como você vai referenciar a classe destinatária. Você pode já ter um campo ou método que retorne um objeto apropriado, mas, se não, será preciso escrever um novo método ou campo para armazenar o objeto da classe destinatária.
Agora você tem uma forma de referenciar o objeto destinatário e um novo método em sua classe. Com tudo isso em mãos, você pode transformar o método antigo em uma referência ao novo método.
4. Observe: você consegue excluir o método antigo por completo? Se sim, coloque uma referência ao novo método em todos os lugares que usam o antigo.
## Relations

**Helps you do**

- [Extrair Classe](/pt-br/extract-class.md)
- [Classe Inline](/pt-br/inline-class.md)
- [Introduzir Objeto de Parâmetro](/pt-br/introduce-parameter-object.md)

**Similar techniques**

- [Extrair Método](/pt-br/extract-method.md)
- [Mover Campo](/pt-br/move-field.md)

**Eliminates smells**

- [Cirurgia com Espingarda](/pt-br/smells/shotgun-surgery.md)
- [Inveja de Recurso](/pt-br/smells/feature-envy.md)
- [Comandos Switch](/pt-br/smells/switch-statements.md)
- [Hierarquias de Herança Paralelas](/pt-br/smells/parallel-inheritance-hierarchies.md)
- [Cadeias de Mensagens](/pt-br/smells/message-chains.md)
- [Intimidade Inapropriada](/pt-br/smells/inappropriate-intimacy.md)
- [Classe de Dados](/pt-br/smells/data-class.md)

