---
title: "Introduzir Método Estrangeiro"
type: "refactoring-technique"
slug: "introduce-foreign-method"
url: "http://localhost:3000/pt-br/introduce-foreign-method.md"
category: "Moving Features between Objects"
description: "Problema: Uma classe utilitária não contém o método de que você precisa e você não pode adicionar o método à classe. Solução: Adicione o método a uma classe cliente e passe a ela um objeto da classe utilitária como argumento."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Introduzir Método Estrangeiro

> Problema: Uma classe utilitária não contém o método de que você precisa e você não pode adicionar o método à classe. Solução: Adicione o método a uma classe cliente e passe a ela um objeto da classe utilitária como argumento.

## Problem

Uma classe utilitária não contém o método de que você precisa e você não pode adicionar o método à classe.

## Solution

Adicione o método a uma classe cliente e passe a ela um objeto da classe utilitária como argumento.

## Why Refactor

Você tem código que usa os dados e métodos de uma certa classe. Você percebe que o código ficaria e funcionaria muito melhor dentro de um novo método na classe. Mas você não pode adicionar o método à classe porque, por exemplo, a classe está localizada em uma biblioteca de terceiros.

Essa refatoração traz um grande retorno quando o código que você quer mover para o método se repete várias vezes em diferentes lugares do seu programa.

Como você está passando um objeto da classe utilitária para os parâmetros do novo método, você tem acesso a todos os seus campos. Dentro do método, você pode fazer praticamente tudo o que quiser, como se o método fizesse parte da classe utilitária.

## Benefits

* Remove a duplicação de código. Se o seu código se repete em vários lugares, você pode substituir esses fragmentos de código por uma chamada de método. Isso é melhor do que a duplicação, mesmo considerando que o método estrangeiro está localizado em um lugar não ideal.

## How to Refactor

1. Crie um novo método na classe cliente.
2. Nesse método, crie um parâmetro ao qual o objeto da classe utilitária será passado. Se esse objeto puder ser obtido a partir da classe cliente, você não precisa criar tal parâmetro.
3. Extraia os fragmentos de código relevantes para esse método e substitua-os por chamadas de método.
4. Certifique-se de deixar a etiqueta _Método estrangeiro_ nos comentários do método, junto com a recomendação de colocar esse método em uma classe utilitária caso isso se torne possível mais tarde. Isso facilitará entender por que esse método está localizado nessa classe em particular para quem for manter o software no futuro.
## Relations

**Similar techniques**

- [Introduzir Extensão Local](/pt-br/introduce-local-extension.md)

**Eliminates smells**

- [Classe de Biblioteca Incompleta](/pt-br/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 estrangeiro. Deveria estar em 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);
  }
}
```

