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
Download

Refactoring2