ConstructiCat Logo
CodeBust.
Browse section ▾

Introduzir Método Estrangeiro.

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.

##Example

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);
  }
}

##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.