ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Método por Objeto de Método.

Problem

Você tem um método longo cujas variáveis locais estão tão entrelaçadas que não é possível aplicar Extrair Método.

Solution

Transforme o método em uma classe separada para que as variáveis locais se tornem campos da classe. Então você pode dividir o método em vários métodos dentro da mesma classe.

##Example

Before
class Order {
  // ...
  public double price() {
    double primaryBasePrice;
    double secondaryBasePrice;
    double tertiaryBasePrice;
    // Realize uma computação longa.
  }
}
After
class Order {
  // ...
  public double price() {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator {
  private double primaryBasePrice;
  private double secondaryBasePrice;
  private double tertiaryBasePrice;
  
  public PriceCalculator(Order order) {
    // Copie informações relevantes do
    // objeto order.
  }
  
  public double compute() {
    // Realize uma computação longa.
  }
}

##Why Refactor

Um método é longo demais e você não consegue separá-lo por causa de massas emaranhadas de variáveis locais difíceis de isolar umas das outras.

O primeiro passo é isolar o método inteiro em uma classe separada e transformar suas variáveis locais em campos da classe.

Em primeiro lugar, isso permite isolar o problema no nível da classe. Em segundo lugar, abre caminho para dividir um método grande e difícil de manejar em outros menores que, de qualquer forma, não se encaixariam no propósito da classe original.

##Benefits

  • Isolar um método longo em sua própria classe permite impedir que um método cresça descontroladamente de tamanho. Isso também permite dividi-lo em submétodos dentro da classe, sem poluir a classe original com métodos utilitários.

##How to Refactor

  1. Crie uma nova classe. Dê a ela um nome baseado no propósito do método que você está refatorando.

  2. Na nova classe, crie um campo privado para armazenar uma referência a uma instância da classe na qual o método estava localizado anteriormente. Ele pode ser usado para obter alguns dados necessários da classe original, se preciso.

  3. Crie um campo privado separado para cada variável local do método.

  4. Crie um construtor que aceite como parâmetros os valores de todas as variáveis locais do método e também inicialize os campos privados correspondentes.

  5. Declare o método principal e copie para ele o código do método original, substituindo as variáveis locais pelos campos privados.

  6. Substitua o corpo do método original na classe original criando um objeto de método e chamando seu método principal.