Download - Refactoring de Programas Java
Refactoring de Programas Java
Projeto Orientado II
Aluno : Eduardo Magno Lages FigueiredoOrientador : Marcelo de Almeida Maia
Colaborador : Marcone Jamilson Freitas Souza
Dezembro de 2003
Motivação / Problema
Refactorings
A ferramenta de refactoring JMT
Métricas de código fonte (JSystemInfo)
Função de avaliação da qualidade do software
Heurística para aplicação automática
Exemplo de código refabricado
Conclusões
Trabalhos futuros 2
Tópicos da Apresentação
3
Contexto
Qualidade de Software
Reutilização de módulos
Adequação a padrões
Legibilidade do código
Facilidade de manutenção
Facilidade para extensão
“Um projeto reutilizável e flexível é difícil, senão impossível, de obter corretamente da primeira vez." Gamma et al.
4
O Problema
Manipulação de Programas
Manipulação Manual X Programada X Automática
Como escrever programas para manipular programas?– Sistemas para meta-programação
Como melhorar a qualidade do software através de manipulações do código?
5
Tecnologia Utilizada
Linguagem de manipulação de programas MetaJ
Linguagem de Programação Java
Aplicação
6
Refactoring
Ferramentas de refactoring
Catálogo de Fowler
• Um tipo especial de manipulação de programas:• Transformação de programas • Preservação da semântica
7
Refactoring Encapsulate Field
Torna o campo privado, prove métodos get e set públicos para acessar o campo e atualiza as referências.
Aluno
public String nome ;
Aluno
private String nome ;public String getNome()
public void setNome(String nome)
public String getNome() { return this.nome;}public void setNome(String nome) { this.nome = nome;}
8
Refactoring Move Field
Disciplina
String professor ;
Turma
String professor ;
Disciplina
Turma
Cria um novo campo na classe destino, altera todas as referências feitas ao campo e o remove da classe origem.
9
Refactoring Move Method
Disciplina
boolean matriculado() ;
Aluno
boolean matriculado() ;
Aluno
Disciplina
Cria um novo método na classe destino com um corpo similar ao corpo do método original e transforma o método antigo em um
simples redirecionador, ou o remove atualizando as referências.
10
Refactoring Extract Class
Cria uma nova classe, movendo os campos e métodos relevantes da classe antiga para a nova classe.
Disciplina
String codigo ;Aluno [] matriculados ;
String professor ;
boolean matriculado() ;
Disciplina
String codigo ;
boolean matriculado() ;
Turma
Aluno [] matriculados ;String professor ;
boolean matriculado() ;
turma
11
Refactoring Inline Class
Move todas as características de uma classe para outra e elimina a classe vazia. Oposto do Extract Class.
Aluno
String nome ;int prova1 ;int prova2 ;
boolean getSituacao() ;
Aluno
String nome ;
Avaliacao
int prova1 ;int prova2 ;
boolean getSituacao() ;
avaliacao
12
A Ferramenta JMT
Java Meta-programming Tool
Programação e Aplicação de refactoring
Plug-in de extensão para uma IDE
Demonstração da
Ferramenta JMT
Integrada ao JBuilder
13
JMT Integrada ao JBuilder
14
Refactoring
Seleção e Aplicação Automática
Objetivos:
Melhorar a qualidade do software
Seleção dos refactorings sem interferência do programador
Requisitos:– Implementação de refactorings– Métricas de qualidade de software– Heurística para aplicação dos refactorings
15
Métricas de Código
– Número de linhas de código– Número de arquivos existente no sistema– Número de tipos Java (classes ou interfaces)– Tamanho dos tipos (número de membros do tipo)– Número de campos públicos– Tamanho dos métodos (número de comandos)– Nível da árvore de hierarquia de um tipo Java– Número de subtipos de um tipo (filhos)– Nível de acoplamento entre dois tipos– Nível de reutilização por herança
16
JSystemInfoFerramenta para coleta de informações de sistemas Java.
17
Função de Avaliação
Baseado nas métricas de código fonte
Configurado pelo arquivo FautValue.txt
Penalidades:– Linhas de código = 1; No de classes = 1; Classes com mais
de 10 membros = 5; Classes c/ mais de 20 membros = 20; Campo público = 20; ...
Benefícios:– Herança = 10; Método reutilizado por herança = 20.
F(x) = (Penalidades) – (Benefícios)
18
Modelagem Heurística
Justificativa da Modelagem Heurística:– Vasto espaço de soluções (NP-difícil)– Existência de uma função de avaliação– É relativamente barato gerar uma solução candidata.
Considerando apenas o Move Field– Número de soluções é nm
– n é o nº de classes e m o nº de campos
19
Heurística Principal
Heurística tradicional
Solução inicial = sistema original
Algoritmo:1. Avalia o sistema original2. Seleciona um refactoring aleatório3. Aplica o refactoring à solução corrente (inicial)4. Avalia o sistema gerado
– Se melhora a função: aceita o refactoring– Se não, desfaz o refactoring (undo)
5. Repete os passos 2, 3 e 4 por um número de iterações
20
Método para aplicar o
Encapsulate Field
Seleciona aleatoriamente um campo público do sistema.
21
Método para aplicar o
Move Field
1. Seleciona aleatoriamente um campo qualquer do sistema.2. Seleciona uma classe destino para o campo diferente da classe
origem, mas no mesmo pacote.
22
Método para aplicar o
Move Method
1. Seleciona aleatoriamente um método não privado (private) do sistema.
2. Seleciona uma classe destino para o método diferente da classe origem, mas no mesmo pacote.
23
Método para aplicar o
Extract Class
1. Separa as classes, pelo seu tamanho, em três grupos com o mesmo número de classes cada.
2. Seleciona uma das classes pela prioridade:– Grandes têm 60% de chances;– Médias têm 30% de chances; e– Pequenas têm 10% de chances.
3. Seleciona alguns membros aleatórios da classe para compor uma nova classe (Criada pelo Extract Class).
Grandes Médias Pequenas
24
Método para aplicar o
Inline Class
1. Seleciona aleatoriamente um par de classes que possuem algum acoplamento entre elas.
– Variáveis de instância– Variáveis de classe (estáticas)– Variáveis locais dos métodos – Argumentos dos métodos– Parâmetro de retorno dos métodos
25
Exemplo
Refactoring Automático (Antes)
ClasseA
public String fileName;
void methodA ()
myClasseBClasseB
public String extenssion;
26
PRIMEIRA AVALIACAO: -11
Selected Move MethodSource class: ClasseAMethod: methodATarget class: ClasseB
AVALIACAO: -6
UNDO ...
Exemplo (Passo 1)
Refactoring Automático
27
AVALIACAO: -11
Selected Encapsulate Field
Class: ClasseBField: extenssion
AVALIACAO: -22
Aceito !
Exemplo (Passo 2)
Refactoring Automático
28
Selected Inline Class
Source class: ClasseBTarget class: ClasseA
AVALIACAO: -41
Aceito !
AVALIACAO FINAL: -41
Exemplo (Passo 3)
Refactoring Automático
29
Exemplo
Refactoring Automático (Depois)
ClasseA
public String fileName;private String extenssion;
void methodA () public void setExtenssion(String arg)
public String getExtenssion ()
– Campo “extenssion” foi encapsulado– “ClasseB” foi absorvida pela “ClasseA” (Inline Class)
30
Conclusões
JMT X Ferramentas de refactoring– Fácil alteração do código dos refactorings;
– Adição de novos itens;
Aplicação de refactoring é indispensável para evolução do software.
Seleção e aplicação automática de refactoring é possível.
Não houve conclusões a respeito da viabilidade da seleção e aplicação automática de refactoring ?
31
Trabalhos Futuros
Melhorar a função de avaliação.– Outras medidas de código como coesão de classe– Outras medidas de software como desempenho
Implementação de novos refactorings
Implementar uma meta-heurística
Integrar todo o ambiente a uma IDE