Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC [email protected] Antes de tudo... Todos podem ficar de 8h-12h, no dia 01/08, para workshop de padrões? Agenda Relembrar refactorings Testes de refactorings Catalogando um refactoring Novas pesquisas Relembrando... O que é mesmo esse tal de refactoring? Qual o nome do cara que escreveu o livro mais famoso no assunto? Quais as vantagens de usar refactoring? Um refactoring é composto de que mesmo? O que é refuctoring? Testes de Refactorings Os testes devem verificar a si mesmos. A saída deve ser “OK” ou lista precisa das coisas que deram errado. Quando os testes funcionam, sua saída deve ser apenas uma lista enxuta de “Oks”. Ou um botão e uma luz verde e outra vermelha. Testes de Refactorings O testador ideal Catálogo de refatorações Formato de cada entrada Nome da refatoração. Resumo da situação na qual ela é necessário e o que ele faz. Motivação para usá-la (e quando não usá-la). Mecânica, i.e., descrição passo a passo. Exemplos para ilustrar o uso. Catálogo de refatorações Exemplo Nome: Extract Method Resumo: 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. Motivação: é 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 Catálogo de refatorações Exemplo (cont.) Mecânica: Crie um novo método e escolha um nome que explicite a sua intenção (o nome deve dizer o que ele faz, não como ele faz). Copie o código do método original para o novo. Procure por variáveis locais e parâmetros utilizados pelo código extraído. Se variáveis locais forem usados apenas pelo código extraído, passe-as para o novo método. Caso contrário, veja se o seu valor é apenas atualizado pelo código. Neste caso substitua o código por uma atribuição. Se é tanto lido quando atualizado, passe-a como parâmetro. Compile e teste. Catálogo de refatorações Extract Method (antes da refatoração) void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; // imprime cabeçalho System.out.println (“***************************”); System.out.println (“*** Dívidas do Cliente ****”); System.out.println (“***************************”); // calcula dívidas while (e.temMaisElementos ()){ Order cada = (Order) e.proximoElemento (); divida += cada.valor (); } // imprime detalhes System.out.println (“nome: ” + _nome); System.out.println (“divida total: ” + divida); } Catálogo de refatorações Extract Method (após a refatoração) void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; imprimeCabecalho (); // calcula dívidas while (e.temMaisElementos ()){ Order cada = (Order) e.proximoElemento (); divida += cada.valor (); } //imprime detalhes System.out.println(“nome: ” + _nome); System.out.println(“divida total: ” + divida); } void imprimeCabecalho System.out.println System.out.println System.out.println } () { (“***************************”); (“*** Dívidas do Cliente ****”); (“***************************”); Catálogo de refatorações Extract Method (com variáveis locais) void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; imprimeCabecalho (); // calcula dívidas while (e.temMaisElementos ()){ Order cada = (Order) e.proximoElemento (); divida += cada.valor (); } imprimeDetalhes (divida); } void imprimeDetalhes (divida) { System.out.println(“nome: ” + _nome); System.out.println(“divida total: ” + divida); } Catálogo de refatorações Nome: Inline Method Resumo: a implementação de um método é tão clara quanto o nome do método. Substitua a chamada ao método pela sua implementação. Motivação: bom para eliminar indireção desnecessária. Se você tem um grupo de métodos mau organizados, aplique Inline Method em todos eles seguido de uns bons Extract Methods. Catálogo de refatorações Inline Method (cont.) Mecânica: Verifique se o método não é polimórfico ou se as suas subclasses o especializam Ache todas as chamadas e substitua pela implementação Compile e teste Remova a definição do método Dica: se for difícil -> não faça. Catálogo de refatorações Exemplo: antes int bandeiradaDoTaxi (int hora) { return (depoisDas22Horas (hora)) ? 2 : 1); } int depoisDas22Horas (int hora) { return hora > 22; } Depois int bandeiradaDoTaxi (int hora) { return (hora > 22) ? 2 : 1); } Exercício Como você definiria um refactoring que transforma um atributo público em um privado, criando seus métodos de acesso? public String name; private String name; public String getName() { return name; } public void setName(String arg) { name = arg; } Novas pesquisas em refatorações Linhas de pesquisa Refatoração para Banco de Dados Refatoração para Padrões Refatoração para Diagramas UML Refatoração para Sistemas Orientados a Aspectos Novas pesquisas em refatorações Refatoração para Banco de Dados Pequena mudança no esquema do banco de dados que melhora seu projeto sem modificar sua semântica Catálogo com vários tipos de refactorings Estruturais: mudança na estrutura da tabela do esquema Qualidade dos dados: mudança que garante ou melhora a consistência dos dados Ex: Drop Column, Rename Table Ex: Drop Non-Nullable Constraint, Introduce Default Value DataBase Refactoring site: http://www.databaserefactoring.com/ Novas pesquisas em refatorações Refatoração para Padrões Melhora o código existente com mudanças direcionadas para a aplicação de padrões Catálogo de 27 refatorações Ex: Extract Adapter, Inline Singleton, Replace Implict Tree with Composite Novas pesquisas em refatorações Refatoração para Diagramas UML Tiago Massoni, Rohit Gheyi, Paulo Borba. “Formal Refactoring for UML Class Diagrams”, SBES 2005 Propõem um conjunto de transformações que preservam a semântica de diagramas de classe UML com OCL. Ao aplicar as transformações propostas, projetistas de software podem, de forma segura, definir transformações maiores, alem de detectar problemas sutis ao refatorar modelos. Refatoração de modelos podem ser úteis tanto em MDA quanto para introduzir padrões de projeto. Novas pesquisas em refatorações Refatoração para Sistemas OA Problema Abstrações OO (classes, métodos, atributos) nem sempre modularizam eficientemente interesses da aplicação Interesses espalhados pelos módulos e entrelaçados com o código funcional Desenvolvimento de Software Orientado a Aspectos pode auxiliar a separação de interesses Novas pesquisas em refatorações Problema (cont.) Embora o uso de aspectos possa auxiliar na modularização de interesses desta natureza, sua adição pode introduzir problemas específicos do uso de aspectos ou similares aos que podem ser encontrados em sistemas OO, tais como trechos de código que foram abandonados em um módulo e não estão mais sendo usados, duplicações de código classes com poucas responsabilidades ou atribuições em demasia Novas pesquisas em refatorações Linhas de pesquisa Refactorings para código OA Catálogo de Monteiro e Fernandes - Towards a Catalog of Aspect-Oriented Refactorings Derivando Refactorings para AspectJ Bad smells em Sistemas AO Refatorações para Padrões em Sistemas AO Novas pesquisas em refatorações Catálogo Refactorings para extração de interesses entrecontantes Novas pesquisas em refatorações Catálogo (cont.) Refactorings para reestruturação interna de aspectos Novas pesquisas em refatorações Catálogo (cont.) Refactorings para lidar com generalização Novas pesquisas em refatorações Derivando refatorings para AspectJ Novas pesquisas em refatorações Bad smells em códigos AO Novas pesquisas em refatorações Padrões em Sistemas OA Kcizales: implementação dos padrões do GoF em AspectJ Aplicar padrões em códigos OA através de padrões