refactoring parte 2 paulo henrique msc. ciência da computação – ufc [email protected]

29
Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC [email protected]

Upload: internet

Post on 21-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Refactoringparte 2

Paulo Henrique

MSc. Ciência da Computação – UFC

[email protected]

Page 2: Refactoring parte 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?

Page 3: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Agenda

Relembrar refactorings Testes de refactorings Catalogando um refactoring Novas pesquisas

Page 4: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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?

Page 5: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 6: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Testes de Refactorings

O testador ideal

Page 7: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 8: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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

Page 9: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 10: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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);

}

Page 11: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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 (“***************************”);

}

Page 12: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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);

}

Page 13: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 14: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 15: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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);

}

Page 16: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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; }

Page 17: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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

Page 18: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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/

Page 19: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.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

Page 20: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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.

Page 21: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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

Page 22: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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

Page 23: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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

Page 24: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Novas pesquisas em refatorações Catálogo

Refactorings para extração de interesses entrecontantes

Page 25: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Novas pesquisas em refatorações Catálogo (cont.)

Refactorings para reestruturação interna de aspectos

Page 26: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Novas pesquisas em refatorações Catálogo (cont.)

Refactorings para lidar com generalização

Page 27: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Novas pesquisas em refatorações Derivando refatorings para AspectJ

Page 28: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

Novas pesquisas em refatorações Bad smells em códigos AO

Page 29: Refactoring parte 2 Paulo Henrique MSc. Ciência da Computação – UFC phmendes@gmail.com

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