30 de outubro de 2017
 
O replace method with method object é um método de refatoração utilizado para tratar métodos muito longos que possuam muitas variáveis locais. Nesses casos, é interessante verificar a viabilidade de esse método se tornar uma nova classe, pois, métodos muito longos tornam o código menos legível.

Nas situações em que seja interessante aplicar essa refatoração, podemos verificar que em alguns casos uma classe possui um ou mais métodos com essas características e a própria classe se torna muito longa por esse motivo. É importante verificar também se o método está utilizando outros atributos gerais da classe ou se utiliza somente sua grande variedade de atributos locais. Se ele estiver de acordo com a segunda opção, é um método candidato a se tornar uma classe.

Veja a seguir um exemplo no qual o método calculaPreco de uma classe de Venda possui muitas variáveis locais.

Antes da refatoração:

public class Venda {
   
    private String produto;
    private String vendedor;
    private String cpfCliente;
    double precoBase;
    int quantidade;
           
 public void processarVenda(String produto,
 String vendedor, String cpfCliente, double precoBase,
 int quantidade){       
        this.produto = produto;
        this.vendedor = vendedor;
        this.cpfCliente = cpfCliente;
        this.quantidade = quantidade;
        this.precoBase = precoBase;       
        ...

        calculaPreco();   
    }

    ...
   
    public double calculaPreco(){
               
        double imposto;
        double desconto;
        double precoFinal;
       
        if (quantidade == 1){           
            precoFinal = precoBase;
        }

        else if(quantidade >= 2){           
            desconto = 0.1 * precoBase;
            precoFinal = precoBase - desconto;           
           
        }                   
            return precoFinal;           
    }
   
}

Na refatoração, o método calculaPreco foi transformado em uma nova classe para melhorar a legibilidade do código uma vez que o mesmo possuía muitas variáveis locais.

Depois da refatoração:

public class Venda {
   
    private String produto;
    private String vendedor;
    private String cpfCliente;
    double precoBase;
    int quantidade;       
   
    public void processarVenda(String produto,
    String vendedor, String cpfCliente, double precoBase,
    int quantidade){
       
        Preco preco = new Preco();
       
        this.produto = produto;
        this.vendedor = vendedor;
        this.cpfCliente = cpfCliente;
        this.precoBase = precoBase;
        this.quantidade = quantidade;
        ...
        preco.calculaPreco(produto, quantidade);
       
    }   
...
}
public class Preco {
   
    double imposto;
    double desconto;
    double precoFinal;
   
    public double calculaPreco(String _produto, int quant){       
       
        if (quant == 1){
           
            precoFinal = precoBase;
        }
       
        else if(quant >= 2){
           
            desconto = 0.1 * precoBase;
            precoFinal = precoBase - desconto;           
           
        }
                   
            return precoFinal;
           
    }

}

Referência:

FOWLER, M. Refactoring: Improving the Design of Existing Code. 1. ed. Boston: Addison- Wesley Professional, 1999.

0 comentários:

Postar um comentário

Comentários:

Perfil

Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Facebook

Views