JAVA Tópicos Especiais de Programação Orientada a Objetos 1
REFATORAÇÃO DE CÓDIGOS 2
REFATORAÇÃO O QUE É REFATORAR? Refatorar é alterar o código de um projeto existente, sem mudar o seu comportamento, ou seja, trata-se de melhorar a qualidade interna do software, a nível de código e design. Melhorar a qualidade no sentido de tornar o código mais legível, coeso, com um melhor desempenho ou simplesmente tornar o design mais limpo. 3
REFATORAÇÃO Principais Benefícios: Refatorar resulta em um melhor projeto de software O entendimento do negócio pode mudar durante o desenvolvimento e refatorar pode aproximar o modelo do software ao negócio. 4
REFATORAÇÃO 5
REFATORAÇÃO Principais Benefícios: Ajuda a programar mais rápido Um código mais limpo, coeso e organizado facilita a alteração e adição de novas funcionalidades. Programador do Mês 6
REFATORAÇÃO Principais Benefícios: Torna o código mais fácil de entender Com práticas de refatoração o código fala por si, dispensando comentários e melhorando o entendimento do sistema pela equipe que compartilha o código. 7
REFATORAÇÃO Principais Benefícios: Ajuda a encontrar falhas Códigos mais simples e legíveis levam a uma melhor observação, tanto a nível de design quanto a nível de implementação, e isto ajuda a encontrar falhas latentes, gargalos, etc. 8
REFATORAÇÃO Mas quando aplicar a Refatoração? Existem alguns momentos principais onde podemos fazer uso da Refatoração: Corrigindo um erro É um ótimo momento para introduzir um código mais limpo, haja visto que a mesma área pode ser novamente alterada, e por outro programador. 9
REFATORAÇÃO Adicionando uma nova funcionalidade Às vezes, percebe-se que a hierarquia de classes poderia ser diferente, um método poderia estar em uma classe mais abstraída ou mais específica. O programador lida o tempo todo com a complexidade, e identificar partes que poderão sofrer alterações no futuro e torná-las mais flexíveis para receber estas alterações, faz parte da complexidade. 10
REFATORAÇÃO Revisando o código O código está pronto e funcionando, mas percebe-se locais em que o código parece confuso (ter que ler mais de 2 vezes indica isso) ou nota-se que existem instruções desnecessárias que degradam o desempenho, então, eis um bom momento para refatorar. 11
REFATORAÇÃO O livro mais importante sobre refatoração é Refactoring: Improving the Design of Existing Code de Martin Fowler, onde são explicados os conceitos, motivações e uma série de refatorações. Os tipos de refatorações utilizadas por Fowler se tornou padrão e são amplamente utilizados hoje. 12
Principais tipos de Refatorações: REFATORAÇÃO Extrair Método (Extract Method) Mover Método (Move Method) Mover Atributo (Move Field) Extrair Classe (Extract Class) Encapsular Atributo (Encapsulate Field) Renomear Método (Rename Method) Remover Variáveis Temporárias (Split Temporary Variable) Substituir Temporário por Consulta (Replace Temporary with Query) Subir Método (Pull Up Method) Subir Atributo (Pull Up Field) Descer Método (Push Down Method) Descer Atributo (Push Down Field) Extrair Sub-classe (Extract Subclass) Extrair Super-classe (Extract Superclass) 13
EXTRAIR MÉTODO Você tem um fragmento de código que poderia ser agrupado. Mude o fragmento para um novo método e escolha um nome que explique o que ele faz. É uma das refatorações mais comuns. Se um método é longo demais ou difícil de entender e exige muitos comentários, extraia trechos do método e crie novos métodos para eles. Isso vai melhorar as chances de reutilização do código e vai fazer com que os métodos que o chamam fiquem mais fáceis de entender. O código fica parecendo comentário. 14
EXTRAIR MÉTODO public class DividaCliente {!! public void imprimedividas(arraylist<double> dividas) {!!!! System.out.println("-------------------------------");!! System.out.println("Impressao de dividas do Cliente");!! System.out.println("-------------------------------");!!!! Iterator<Double> iteradordividas = dividas.iterator();!! Double totaldivida = 0.0;!!!! while (iteradordividas.hasnext()) {!!! totaldivida += iteradordividas.next();!! }!! System.out.println("-------------------------------");!! System.out.println("Total de dividas: " + totaldivida);!! System.out.println("-------------------------------");!! } } 15
EXTRAIR MÉTODO public class DividaCliente {!! public void imprimedividas(arraylist<double> dividas) {!!!! imprimecabecalho();!!!! Iterator<Double> iteradordividas = dividas.iterator();!! Double totaldivida = 0.0;!!!! while (iteradordividas.hasnext()) {!!! totaldivida += iteradordividas.next();!! }!! imprimedivida(totaldivida);!! }!! private void imprimecabecalho() {!! System.out.println("-------------------------------");!! System.out.println("Impressao de dividas do Cliente");!! System.out.println("-------------------------------");! }! private void imprimedivida(double divida) {!! System.out.println("-------------------------------");!! System.out.println("Total de dividas: " + divida);!! System.out.println("-------------------------------");! } } 16
SUBSTITUIR TEMPORÁRIO COM CONSULTA Essa técnica consiste em trocar variáveis temporárias que contêm expressões matemáticas por métodos, para que possam ser chamados em outros métodos aumentando a reusabilidade e manutenção da expressão em questão. public class SubsTempConsulta {! private double massa, gravitacional, altura;!! public String localizacaoobjeto() {!!! double energiapotencial = this.massa * this.gravitacional * this.altura;!!!! if (energiapotencial == 0) {!!! return "O objeto está no chão. Energia potencial: " + energiapotencial;!! }!! else!! {!!! return "O objeto não está no chão. Energia potencial: " + energiapotencial;!! }!!! }! } 17
SUBSTITUIR TEMPORÁRIO COM CONSULTA private double massa, gravitacional, altura; public String localizacaoobjeto() { } if (energiapotencial() == 0) { return "O objeto está no chão. Energia potencial: " + energiapotencial(); } else { return "O objeto não está no chão. Energia potencial: " + energiapotencial(); } private double energiapotencial() { return getmassa() * getgravitacional() * getaltura(); } public double getmassa() { return massa; } public void setmassa(double massa) { this.massa = massa; } public double getaltura() { return altura; } public void setaltura(double altura) { this.altura = altura; } public double getgravitacional() { return gravitacional; } public void setgravitacional(double gravitacional) { this.gravitacional = gravitacional; } 18
REMOVER VARIÁVEL TEMPORÁRIA Caracteriza-se por ter uma ou várias variáveis temporárias com valores designados que são frequentemente alterados, exceto quando forem variáveis de loop ou coleções. O problema afeta diretamente a clareza do seu código, sendo que em um dado momento uma variável vale X e em outro a mesma variável poderá valer Y. A cada vez que a variável altera o seu valor, aumenta-se também a sua responsabilidade dentro do método. Qualquer variável com mais de uma responsabilidade deve ser refatorada de maneira que cada variável tenha apenas uma responsabilidade. Usar uma variável para designar várias coisas pode ser bastante confuso para o leitor do código. Lembre-se que a refatoração de código tem como princípio melhorar a organização do código para ser mais legível aos humanos, e não as máquinas. Para resolver nosso problema podemos criar variáveis temporárias como apenas uma responsabilidade e declara-las como sendo constantes. 19
REMOVER VARIÁVEL TEMPORÁRIA! double temporario = getmassa() * getgravitacional() * getaltura();! System.out.println("Energia potencial: " + temporario);! temporario = getmassa() * (getvelocidade() * getvelocidade()) / 2;! System.out.println("Energia cinetica: " + temporario);!! final double energiapotencial = getmassa() * getgravitacional() * getaltura();! System.out.println("Energia potencial: " + energiapotencial);! final double energiacinetica = getmassa() * (getvelocidade() * getvelocidade()) / 2;! System.out.println("Energia cinetica: " + energiacinetica); 20
SUBIR E DESCER MÉTODO As refatorações dos tipos Subir e Descer Métodos consistem na mudança de um método de uma ou mais subclasses para a superclasse ou vice versa. A principal motivação dessa refatoração é a existência de métodos repetidos ou com comportamento semelhantes nas subclasses. Dessa forma para evitar a repetição de código e melhorar a manutenção, esse método é movido para a superclasses ou vice versa. 21
SUBIR E DESCER MÉTODO 22
SUBIR E DESCER MÉTODO 23
DESFAZER A HIERARQUIA Neste tipo de refatoração a hierarquia de classes existente é desfeita, deixando toda a implementação para a superclasse. Faz uma generalização dos métodos das subclasses de forma a um único método atender a todas implementações existentes nas subclasses. Normalmente essa refatoração ocorre quando o sistema foi projeto em excesso, ou seja, foi realizado uma abordagem mais completa do que era necessário. 24
DESFAZER A HIERARQUIA 25
BIBLIOGRAFIA Introdução ao Java, Daniel Destro do Carmo Use a Cabeça Java, Kathy Sierra e Bert Bates Certificação Sun para Programador Java 6, Kathy Sierra e Bert Bates 26
OBRIGADO PROF. EMILIO PARMEGIANI DOWNLOAD DO MATERIAL 27