---
title: "Extrair Método"
type: "refactoring-technique"
slug: "extract-method"
url: "http://localhost:3000/pt-br/extract-method.md"
category: "Composing Methods"
description: "Problema: Você tem um fragmento de código que pode ser agrupado. Solução: Mova esse código para um novo método (ou função) separado e substitua o código antigo por uma chamada ao método."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Extrair Método

> Problema: Você tem um fragmento de código que pode ser agrupado. Solução: Mova esse código para um novo método (ou função) separado e substitua o código antigo por uma chamada ao método.

## Problem

Você tem um fragmento de código que pode ser agrupado.

## Solution

Mova esse código para um novo método (ou função) separado e substitua o código antigo por uma chamada ao método.

## Why Refactor

Quanto mais linhas houver em um método, mais difícil é descobrir o que o método faz. Essa é a principal razão para essa refatoração.

Além de eliminar arestas no seu código, extrair métodos também é um passo em muitas outras abordagens de refatoração.

## Benefits

* Código mais legível! Certifique-se de dar ao novo método um nome que descreva o propósito do método: `createOrder()`, `renderCustomerInfo()`, etc.
* Menos duplicação de código. Muitas vezes o código encontrado em um método pode ser reutilizado em outros lugares do seu programa. Assim você pode substituir as duplicatas por chamadas ao seu novo método.
* Isola partes independentes do código, o que significa que erros são menos prováveis (como modificar a variável errada).

## How to Refactor

1. Crie um novo método e dê a ele um nome que torne seu propósito autoevidente.
2. Copie o fragmento de código relevante para o seu novo método. Apague o fragmento de seu local antigo e coloque ali, em vez dele, uma chamada ao novo método.
Encontre todas as variáveis usadas nesse fragmento de código. Se elas forem declaradas dentro do fragmento e não usadas fora dele, simplesmente deixe-as inalteradas—elas se tornarão variáveis locais do novo método.
3. Se as variáveis forem declaradas antes do código que você está extraindo, você precisará passar essas variáveis para os parâmetros do seu novo método a fim de usar os valores nelas contidos anteriormente. Às vezes é mais fácil se livrar dessas variáveis recorrendo a [Substituir Variável Temporária por Consulta](/pt-br/replace-temp-with-query).
4. Se você notar que uma variável local muda de alguma forma no seu código extraído, isso pode significar que esse valor alterado será necessário mais tarde no seu método principal. Verifique duas vezes! E se for esse o caso, retorne o valor dessa variável para o método principal a fim de manter tudo funcionando.
## Relations

**Helps you do**

- [Introduzir Objeto de Parâmetro](/pt-br/introduce-parameter-object.md)
- [Formar Método Template](/pt-br/form-template-method.md)
- [Parametrizar Método](/pt-br/parameterize-method.md)

**Similar techniques**

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

**Opposite refactorings**

- [Embutir Método](/pt-br/inline-method.md)

**Eliminates smells**

- [Código Duplicado](/pt-br/smells/duplicate-code.md)
- [Método Longo](/pt-br/smells/long-method.md)
- [Inveja de Recurso](/pt-br/smells/feature-envy.md)
- [Comandos Switch](/pt-br/smells/switch-statements.md)
- [Cadeias de Mensagens](/pt-br/smells/message-chains.md)
- [Comentários](/pt-br/smells/comments.md)
- [Classe de Dados](/pt-br/smells/data-class.md)

## Code Examples

### java

```java
// Before
void printOwing() {
  printBanner();

  // Imprime os detalhes.
  System.out.println("name: " + name);
  System.out.println("amount: " + getOutstanding());
}

// After
void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails(double outstanding) {
  System.out.println("name: " + name);
  System.out.println("amount: " + outstanding);
}
```

### csharp

```csharp
// Before
void PrintOwing() 
{
  this.PrintBanner();

  // Imprime os detalhes.
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}

// After
void PrintOwing()
{
  this.PrintBanner();
  this.PrintDetails();
}

void PrintDetails()
{
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}
```

### php

```php
// Before
function printOwing() {
  $this->printBanner();

  // Imprime os detalhes.
  print("name:  " . $this->name);
  print("amount " . $this->getOutstanding());
}

// After
function printOwing() {
  $this->printBanner();
  $this->printDetails($this->getOutstanding());
}

function printDetails($outstanding) {
  print("name:  " . $this->name);
  print("amount " . $outstanding);
}
```

### python

```python
// Before
def printOwing(self):
    self.printBanner()

    # imprime os detalhes
    print("name:", self.name)
    print("amount:", self.getOutstanding())

// After
def printOwing(self):
    self.printBanner()
    self.printDetails(self.getOutstanding())

def printDetails(self, outstanding):
    print("name:", self.name)
    print("amount:", outstanding)
```

### typescript

```typescript
// Before
printOwing(): void {
  printBanner();

  // Imprime os detalhes.
  console.log("name: " + name);
  console.log("amount: " + getOutstanding());
}

// After
printOwing(): void {
  printBanner();
  printDetails(getOutstanding());
}

printDetails(outstanding: number): void {
  console.log("name: " + name);
  console.log("amount: " + outstanding);
}
```

