Substituir Método por Objeto de Método.
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.
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
class Order {
// ...
public double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
// Realize uma computação longa.
}
}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
-
Crie uma nova classe. Dê a ela um nome baseado no propósito do método que você está refatorando.
-
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.
-
Crie um campo privado separado para cada variável local do método.
-
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.
-
Declare o método principal e copie para ele o código do método original, substituindo as variáveis locais pelos campos privados.
-
Substitua o corpo do método original na classe original criando um objeto de método e chamando seu método principal.