Projeto Orientado II
Refactoring de Programas Java
Dezembro de 2003
Aluno : Eduardo Magno Lages Figueiredo
Orientador : Marcelo de Almeida Maia
Colaborador : Marcone Jamilson Freitas Souza
Tópicos da Apresentação
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
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.
3
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?
4
Tecnologia Utilizada
Linguagem de manipulação de programas MetaJ
Linguagem de Programação Java
Aplicação
5
Refactoring
• Um tipo especial de manipulação de programas:
• Transformação de programas
• Preservação da semântica
Ferramentas de refactoring
Catálogo de Fowler
6
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;
}
7
Refactoring Move Field
Cria um novo campo na classe destino, altera todas as referências
feitas ao campo e o remove da classe origem.
Disciplina
Disciplina
String professor ;
Turma
Turma
String professor ;
8
Refactoring Move Method
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.
Disciplina
Disciplina
boolean matriculado() ;
Aluno
Aluno
boolean matriculado() ;
9
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() ;
Turma
Disciplina
String codigo ;
boolean matriculado() ;
turma
Aluno [] matriculados ;
String professor ;
boolean matriculado() ;
10
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 ;
avaliacao
Avaliacao
Aluno
int prova1 ;
int prova2 ;
String nome ;
int prova1 ;
int prova2 ;
boolean getSituacao() ;
boolean getSituacao() ;
11
A Ferramenta JMT
Java Meta-programming Tool
Programação e Aplicação de refactoring
Plug-in de extensão para uma IDE
12
JMT Integrada ao JBuilder
Demonstração da
Ferramenta JMT
Integrada ao JBuilder
13
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
14
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
15
JSystemInfo
Ferramenta para coleta de informações de sistemas Java.
16
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)
17
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
18
Heurística Principal
Heurística tradicional
Solução inicial = sistema original
Algoritmo:
1.
2.
3.
4.
Avalia o sistema original
Seleciona um refactoring aleatório
Aplica o refactoring à solução corrente (inicial)
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
19
Método para aplicar o
Encapsulate Field
Seleciona aleatoriamente um campo público do sistema.
20
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.
21
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.
22
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.
Grandes
Médias
Pequenas
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).
23
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
24
Exemplo
Refactoring Automático (Antes)
ClasseA
public String fileName;
ClasseB
myClasseB
public String extenssion;
void methodA ()
25
Exemplo (Passo 1)
Refactoring Automático
PRIMEIRA AVALIACAO: -11
Selected Move Method
Source class: ClasseA
Method: methodA
Target class: ClasseB
AVALIACAO: -6
UNDO ...
26
Exemplo (Passo 2)
Refactoring Automático
AVALIACAO: -11
Selected Encapsulate Field
Class: ClasseB
Field: extenssion
AVALIACAO: -22
Aceito !
27
Exemplo (Passo 3)
Refactoring Automático
Selected Inline Class
Source class: ClasseB
Target class: ClasseA
AVALIACAO: -41
Aceito !
AVALIACAO FINAL: -41
28
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)
29
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 ?
30
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
31
Download

Apresentação - DECOM-UFOP