---
title: "Extraer método"
type: "refactoring-technique"
slug: "extract-method"
url: "http://localhost:3000/es/extract-method.md"
category: "Composing Methods"
description: "Problema: tienes un fragmento de código que se puede agrupar. Solución: traslada este código a un nuevo método (o función) independiente y sustituye el código antiguo por una llamada al método."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Extraer método

> Problema: tienes un fragmento de código que se puede agrupar. Solución: traslada este código a un nuevo método (o función) independiente y sustituye el código antiguo por una llamada al método.

## Problem

Tienes un fragmento de código que se puede agrupar.

## Solution

Traslada este código a un nuevo método (o función) independiente y sustituye el código antiguo por una llamada al método.

## Why Refactor

Cuantas más líneas hay en un método, más difícil resulta entender qué hace ese método. Esta es la razón principal de esta refactorización.

Además de eliminar asperezas en tu código, extraer métodos es también un paso dentro de muchos otros enfoques de refactorización.

## Benefits

* ¡Código más legible! Asegúrate de dar al nuevo método un nombre que describa su propósito: `createOrder()`, `renderCustomerInfo()`, etc.
* Menos duplicación de código. A menudo el código que se encuentra en un método puede reutilizarse en otros lugares de tu programa. Así puedes sustituir los duplicados por llamadas a tu nuevo método.
* Aísla partes independientes del código, lo que hace que los errores sean menos probables (por ejemplo, que se modifique la variable equivocada).

## How to Refactor

1. Crea un nuevo método y nómbralo de forma que su propósito resulte evidente por sí mismo.
2. Copia el fragmento de código relevante a tu nuevo método. Elimina el fragmento de su ubicación antigua y coloca allí, en su lugar, una llamada al nuevo método.
Localiza todas las variables que se usan en este fragmento de código. Si se declaran dentro del fragmento y no se usan fuera de él, simplemente déjalas tal cual: se convertirán en variables locales del nuevo método.
3. Si las variables se declaran antes del código que estás extrayendo, tendrás que pasarlas como parámetros de tu nuevo método para poder usar los valores que contenían previamente. A veces es más fácil deshacerse de estas variables recurriendo a [Reemplazar variable temporal por consulta](/es/replace-temp-with-query).
4. Si observas que una variable local cambia de algún modo dentro del código extraído, puede significar que ese valor modificado se necesitará después en tu método principal. ¡Compruébalo bien! Y si efectivamente es así, devuelve el valor de esta variable al método principal para mantener todo funcionando.
## Relations

**Helps you do**

- [Introducir Objeto Parámetro](/es/introduce-parameter-object.md)
- [Formar Método Plantilla](/es/form-template-method.md)
- [Parametrizar método](/es/parameterize-method.md)

**Similar techniques**

- [Mover método](/es/move-method.md)

**Opposite refactorings**

- [Método en Línea](/es/inline-method.md)

**Eliminates smells**

- [Código Duplicado](/es/smells/duplicate-code.md)
- [Método Largo](/es/smells/long-method.md)
- [Envidia de características](/es/smells/feature-envy.md)
- [Sentencias switch](/es/smells/switch-statements.md)
- [Cadenas de mensajes](/es/smells/message-chains.md)
- [Comentarios](/es/smells/comments.md)
- [Clase de datos](/es/smells/data-class.md)

## Code Examples

### java

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

  // Imprimir detalles.
  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();

  // Imprimir detalles.
  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();

  // Imprimir detalles.
  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()

    # imprimir detalles
    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();

  // Imprimir detalles.
  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);
}
```

