9 de novembro de 2017


O extract class é um método de refatoração utilizado para dividir classes muito longas e que com essa característica provavelmente possuem mais de uma responsabilidade. Se uma classe possui mais de uma responsabilidade, ela está ferindo o SRP e deve ser refatorada para garantir um código mais legível.

Classes com mais de uma responsabilidade podem provocar uma complexidade desnecessária no código conforme já abordamos ao falar do SRP. Quando uma classe tem mais de uma responsabilidade, a necessidade de sua alteração pode causar um maior impacto no aplicativo. Nesses casos, é sempre importante aplicar o extract class para atribuir uma responsabilidade única para cada uma das novas classes geradas.

Podemos identificar mais de uma responsabilidade em uma classe quando observamos que essa classe possui uma ou mais tarefas distintas/sem ligação. Esse é o caso do exemplo mostrado a seguir de uma classe Pessoa que possui um método para cálculo de IMC totalmente distinto das tarefas básicas da classe Pessoa que seriam inserção e consulta de uma pessoa. Esse método deveria ser inserido em uma classe destinada somente para o cálculo do IMC.

Antes da refatoração:

public class Pessoa {
   
    String nome;
    String sexo;
    String cpf;
    String endereco;
    String telefone;
    String estadoCivil;
    float peso;
    float altura;
   
    public Pessoa(String nome, String sexo, String cpf,
    String endereco, String telefone, String estadoCivil,
    float peso, float altura) {

        this.nome = nome;
        this.sexo = sexo;
        this.cpf = cpf;
        this.endereco = endereco;
        this.telefone = telefone;
        this.estadoCivil = estadoCivil;
        this.peso = peso;
        this.altura = altura;
   
    }

public String consultarPessoa(String _cpf){
       
        ...   
    }
   
    public float calcularImcPessoa(){
       
        float imc = peso/(altura * altura);
               
        return imc;       
    }

}

Na refatoração, as responsabilidades da classe Pessoa foram divididas com a criação da nova classe Imc. Agora a classe Pessoa possui as tarefas de sua responsabilidade e a classe Imc é responsável pelo cálculo.

Após a refatoração:

public class Pessoa {
   
    String nome;
    String sexo;
    String cpf;
    String endereco;
    String telefone;
    String estadoCivil;
   
    public Pessoa(String nome, String sexo, String cpf,
    String endereco, String telefone, String estadoCivil) {
        this.nome = nome;
        this.sexo = sexo;
        this.cpf = cpf;
        this.endereco = endereco;
        this.telefone = telefone;
        this.estadoCivil = estadoCivil;
   
    }
   
    public String consultarPessoa(String _cpf){
       
        /...   
    }
       

}

public class Imc {
   
    float peso;
    float altura;
   
    public Imc(float peso, float altura) {

        this.peso = peso;
        this.altura = altura;
   
    }

   
    public float calcularImcPessoa(){
       
        float imc = peso/(altura * altura);
               
        return imc;
       
    }

}

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