refactoring parte 2 paulo henrique msc. ciência da computação – ufc phmendes@gmail.com
Post on 21-Apr-2015
105 Views
Preview:
TRANSCRIPT
Refactoringparte 2
Paulo Henrique
MSc. Ciência da Computação – UFC
phmendes@gmail.com
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ívidaswhile (e.temMaisElementos ()){
Order cada = (Order) e.proximoElemento ();divida += cada.valor ();
}// imprime detalhesSystem.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ívidaswhile (e.temMaisElementos ()){
Order cada = (Order) e.proximoElemento ();divida += cada.valor ();
}//imprime detalhesSystem.out.println(“nome: ” + _nome);System.out.println(“divida total: ” + divida);
}
void imprimeCabecalho () {System.out.println (“***************************”);System.out.println (“*** Dívidas do Cliente ****”);System.out.println (“***************************”);
}
Catálogo de refatorações Extract Method (com variáveis locais)void imprimeDivida () {
Enumerate e = _pedidos.elementos ();double divida = 0.0;imprimeCabecalho ();// calcula dívidaswhile (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: antesint bandeiradaDoTaxi (int hora) {
return (depoisDas22Horas (hora)) ? 2 : 1);
}
int depoisDas22Horas (int hora) {
return hora > 22;
} Depoisint 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
Ex: Drop Column, Rename Table Qualidade dos dados: mudança que garante ou melhora a
consistência dos dados 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
top related