Refatoração com Netbeans e Eclipse

À medida que programamos, o software vai crescendo e nascem novas classes e funcionalidades. Com isso as vezes, programador percebe que seria mais fácil se o código estivesse estruturado de forma diferente. Uma funcionalidade que é chamada várias vezes no programa e poderia ser extraída e se tornado método externo, uma classe que poderia ser herdada de outra evitando código repetido para classes semelhantes, ou mesmo uma variável que poderia ser trocada de nome para melhor representar sua utilidade.

Imagine a seguinte situação: você escreveu seu código e toda sua lógica, mas lá na frente percebe que o nome de uma variável usada no projeto inteiro deve ser mudada. Muitos usariam o recurso de substituição de palavras comum nos editores, facilmente fariam a substituição de palavras no projeto inteiro e trocariam o nome antigo pelo novo. Agora imagine outro cenário: por inocência, você nomeou as variáveis como:

private String a;

private int b;

Caso utilize o recurso de substituição (CRTL + H no NetBeans e CRTL + F no Eclipse) todo o código será mudado. Portanto, qualquer código com a letra “a” será substituído pelo novo texto, ou seja, se substituir a String “a” pela String “novoNome”, já na declaração da variável teremos o problema:

privnovoNomete String novoNome;

 

Refatoração é reestruturar o código para que a estrutura interna do programa seja melhorada sem que suas funcionalidades sejam modificadas. Mudar nomes de variáveis são ações comuns a medida que vamos escrevendo o código.Mas vamos pensar além, partindo do princípio que os nomes estão corretos porém por alguma razão o tipo da variável mudou. Isso quer dizer que todos os métodos que recebem ou devolvem essa variável devem ser mudados também. Com o uso da refatoração as referências da variável são modificadas, ou seja, somente onde tiver realmente a variável “a” será substituidade por “novoNome”. Diversos são os motivos para empregar refatoração, a limpeza e clareza do código são somente algumas delas. A facilidade de manutenção também é outro benefício da refatoração, tendo em vista que um código bem estruturado melhora a compreensão e pode otimizar a performance da aplicação, pois a medida que o código se torna mais legivel o programador pode encontrar partes do que podem ser simplificadas ou até mesmo não necessárias .

O ato de renomear é apenas uma das diversas opções de refatoração. Entre outras, podemos citar:

  • Mover uma classe de um pacote para outro;

  • Trocar a assinatura de métodos;

  • Encapsulamento de campos;

  • Extrair super classes;

  • Extrair interfaces;

  • Introduzir métodos.

NetBeans

O NetBeans tem diversos recursos de refatoração, podendo ser usado nas diferentes tarefas citadas anteriormente. Utilizando como exemplo a Listagem 1 faremos uso do refactoring para extrair estruturas if/else de um método em vários outros métodos com retorno void. Dessa forma eles podem ser chamados em diferentes partes do programa somente escrevendo seu nome.

//Listagem 1. Exemplo de código para refatoração.
package rotinasderepeticao;

import java.util.Scanner;

public class CalculaNota {

    public static void main(String[] args) {

        for (int i = 0; i < 2; i++) {
            double nota1;
            double nota2;
            double media;

            Scanner entradaTecladoNota1 = new Scanner(System.in);
            System.out.println("Digite a primeira nota do aluno:");
            nota1 = Double.valueOf(entradaTecladoNota1.nextLine());
            Scanner entradaTecladoNota2 = new Scanner(System.in);
            System.out.println("Digite a segunda nota do aluno:");
            nota2 = Double.valueOf(entradaTecladoNota2.nextLine());
            media = (nota1 + nota2) / 2;

            if (media == 7) {
                System.out.println("Média =" + media + ", Passou na Risca!");
            }
            if (media > 7) {
                System.out.println("Média =" + media + ", Passou com louvor!");
            }
            if (media < 7) {
                System.out.println("Média =" + media + ", Não passou, estudar mais no próximo ano!");
            }
        }
    }
}

Para realizarmos a refatoração, devemos selecionar o trecho de código que representa o método e escolher a opção Refatorar > Introduzir método. Feito isso, uma janela é mostrada para que possamos definir o nome e o tipo de acesso do método (veja a Figura 1).


O resultado após o processo de refatoração pode ser visto na Listagem 2

//Listagem 2. Exemplo de código refatorado.
package rotinasderepeticao;

import java.util.Scanner;

public class CalculaNota {

    public static void main(String[] args) {

        for (int i = 0; i < 2; i++) {

            double media = calculaMedia();
            verificaPassou(media);

        }
    }

    private static void verificaPassou(double media) {
        if (media == 7) {
            System.out.println("Média =" + media + ", Passou na Risca!");
        }
        if (media > 7) {
            System.out.println("Média =" + media + ", Passou com louvor!");
        }
        if (media < 7) {
            System.out.println("Média =" + media + ", Não passou, estudar mais no próximo ano!");
        }
    }

    private static double calculaMedia() throws NumberFormatException {
        double nota1;
        double nota2;
        double media;
        Scanner entradaTecladoNota1 = new Scanner(System.in);
        System.out.println("Digite a primeira nota do aluno:");
        nota1 = Double.valueOf(entradaTecladoNota1.nextLine());
        Scanner entradaTecladoNota2 = new Scanner(System.in);
        System.out.println("Digite a segunda nota do aluno:");
        nota2 = Double.valueOf(entradaTecladoNota2.nextLine());
        media = (nota1 + nota2) / 2;
        return media;
    }
}

Foram feitas duas refatorações no código, as duas com introdução de métodos. Na Listagem 2 foi criado o método calculaMedia(), e o método verificaPassou(double media). Reparem que além de atribuir o tipo de retorno correspondente, foi adicionada uma no exceção no método calculaMedia() para situações em que o número retornado não seja do formato correto.

Para realizar outros tipos de fatoração o processo é semelhante, primeiro deve-se selecionar o trecho de código e em seguida escolher um dos tipos desejados de refatoração através do menu ou atalhos.

Eclipse

No Eclipse as opções de refactoring têm basicamente as mesmas funcionalidades do NetBeans, como apresenta a Figura 2.

Nesse menu o último item merece destaque, pois corresponde ao histórico de mudanças produzidas pela refatoração. Podemos ver todas as mudanças feitas e clicando sobre um dos itens do histórico é possível ver detalhes como a data da mudança, de qual para qual classe foi feita a operação, se a refatoração for um método,superclasse ou interface extraída, e qual o nome e tipo de acesso desse novo componente. Um botão de remoção também é habilitado quando um item é selecionado, mas a remoção não só é feita no histórico e não no codigo (Figura 3).


 

Listagem 4. Exemplo de código refatorado.

package rotinasderepeticao;

 

import java.util.Scanner;

 

public class CalculaNota {

 

public static void main(String[] args) {

 

for (int i = 0; i < 2; i++) {

double media = calculaMedia();

verificaPassou(media);

 

}

}

 

private static void verificaPassou(double media) {

if (media == 7) {

System.out.println(“Média =” + media + “, Passou na Risca!”);

}

if (media > 7) {

System.out.println(“Média =” + media + “, Passou com louvor!”);

}

if (media < 7) {

System.out.println(“Média =” + media + “, Não passou, estudar mais no próximo ano!”);

}

}

 

private static double calculaMedia() throws NumberFormatException {

double nota1;

double nota2;

double media;

Scanner entradaTecladoNota1 = new Scanner(System.in);

System.out.println(“Digite a primeira nota do aluno:”);

nota1 = Double.valueOf(entradaTecladoNota1.nextLine());

Scanner entradaTecladoNota2 = new Scanner(System.in);

System.out.println(“Digite a segunda nota do aluno:”);

nota2 = Double.valueOf(entradaTecladoNota2.nextLine());

media = (nota1 + nota2) / 2;

return media;

}

}

Anúncios

Sobre kurtphpr
Ronaldo Caldas : Formado em Ciência da Computação - UNICENTRO-PR

Deixe seu comentário, opinião , critica ou dúvida aqui :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: