---
title: "Introducir un método externo"
type: "refactoring-technique"
slug: "introduce-foreign-method"
url: "http://localhost:3000/es/introduce-foreign-method.md"
category: "Moving Features between Objects"
description: "Problema: una clase de utilidad no contiene el método que necesitas y no puedes añadirlo a la clase. Solución: añade el método a una clase cliente y pásale como argumento un objeto de la clase de utilidad."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Introducir un método externo

> Problema: una clase de utilidad no contiene el método que necesitas y no puedes añadirlo a la clase. Solución: añade el método a una clase cliente y pásale como argumento un objeto de la clase de utilidad.

## Problem

Una clase de utilidad no contiene el método que necesitas y no puedes añadirlo a la clase.

## Solution

Añade el método a una clase cliente y pásale como argumento un objeto de la clase de utilidad.

## Why Refactor

Tienes código que usa los datos y los métodos de cierta clase. Te das cuenta de que el código quedaría y funcionaría mucho mejor dentro de un nuevo método de la clase. Pero no puedes añadir el método a la clase porque, por ejemplo, la clase se encuentra en una biblioteca de terceros.

Esta refactorización tiene un gran beneficio cuando el código que quieres mover al método se repite varias veces en diferentes lugares de tu programa.

Como estás pasando un objeto de la clase de utilidad a los parámetros del nuevo método, tienes acceso a todos sus campos. Dentro del método puedes hacer prácticamente todo lo que quieras, como si el método formara parte de la clase de utilidad.

## Benefits

* Elimina la duplicación de código. Si tu código se repite en varios lugares, puedes sustituir esos fragmentos por una llamada al método. Esto es mejor que la duplicación, incluso teniendo en cuenta que el método externo se encuentra en un lugar subóptimo.

## How to Refactor

1. Crea un nuevo método en la clase cliente.
2. En este método, crea un parámetro al que se le pasará el objeto de la clase de utilidad. Si ese objeto puede obtenerse desde la clase cliente, no hace falta crear dicho parámetro.
3. Extrae los fragmentos de código relevantes a este método y sustitúyelos por llamadas al método.
4. Asegúrate de dejar la etiqueta _Método externo_ en los comentarios del método, junto con la recomendación de colocar este método en una clase de utilidad si más adelante resulta posible. Esto facilitará entender por qué este método se encuentra en esta clase en particular a quienes mantengan el software en el futuro.
## Relations

**Similar techniques**

- [Introducir extensión local](/es/introduce-local-extension.md)

**Eliminates smells**

- [Clase de biblioteca incompleta](/es/smells/incomplete-library-class.md)

## Code Examples

### java

```java
// Before
class Report {
  // ...
  void sendReport() {
    Date nextDay = new Date(previousEnd.getYear(),
      previousEnd.getMonth(), previousEnd.getDate() + 1);
    // ...
  }
}

// After
class Report {
  // ...
  void sendReport() {
    Date newStart = nextDay(previousEnd);
    // ...
  }
  private static Date nextDay(Date arg) {
    return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
  }
}
```

### csharp

```csharp
// Before
class Report 
{
  // ...
  void SendReport() 
  {
    DateTime nextDay = previousEnd.AddDays(1);
    // ...
  }
}

// After
class Report 
{
  // ...
  void SendReport() 
  {
    DateTime nextDay = NextDay(previousEnd);
    // ...
  }
  private static DateTime NextDay(DateTime date) 
  {
    return date.AddDays(1);
  }
}
```

### php

```php
// Before
class Report {
  // ...
  public function sendReport() {
    $previousDate = clone $this->previousDate;
    $paymentDate = $previousDate->modify("+7 days");
    // ...
  }
}

// After
class Report {
  // ...
  public function sendReport() {
    $paymentDate = self::nextWeek($this->previousDate);
    // ...
  }
  /**
   * Método externo. Debería estar en Date.
   */
  private static function nextWeek(DateTime $arg) {
    $previousDate = clone $arg;
    return $previousDate->modify("+7 days");
  }
}
```

### python

```python
// Before
class Report:
    # ...
    def sendReport(self):
        nextDay = Date(self.previousEnd.getYear(),
            self.previousEnd.getMonth(), self.previousEnd.getDate() + 1)
        # ...

// After
class Report:
    # ...
    def sendReport(self):
        newStart = self._nextDay(self.previousEnd)
        # ...
        
    def _nextDay(self, arg):
        return Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1)
```

### typescript

```typescript
// Before
class Report {
  // ...
  sendReport(): void {
    let nextDay: Date = new Date(previousEnd.getYear(),
      previousEnd.getMonth(), previousEnd.getDate() + 1);
    // ...
  }
}

// After
class Report {
  // ...
  sendReport() {
    let newStart: Date = nextDay(previousEnd);
    // ...
  }
  private static nextDay(arg: Date): Date {
    return new Date(arg.getFullYear(), arg.getMonth(), arg.getDate() + 1);
  }
}
```

