Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador...
Transcript of Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador...
![Page 1: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/1.jpg)
Refactoring de Programas Java
Projeto Orientado II
Aluno : Eduardo Magno Lages FigueiredoOrientador : Marcelo de Almeida Maia
Colaborador : Marcone Jamilson Freitas Souza
Dezembro de 2003
![Page 2: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/2.jpg)
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
![Page 3: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/3.jpg)
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.
![Page 4: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/4.jpg)
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?
![Page 5: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/5.jpg)
5
Tecnologia Utilizada
Linguagem de manipulação de programas MetaJ
Linguagem de Programação Java
Aplicação
![Page 6: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/6.jpg)
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
![Page 7: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/7.jpg)
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;}
![Page 8: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/8.jpg)
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.
![Page 9: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/9.jpg)
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.
![Page 10: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/10.jpg)
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
![Page 11: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/11.jpg)
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
![Page 12: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/12.jpg)
12
A Ferramenta JMT
Java Meta-programming Tool
Programação e Aplicação de refactoring
Plug-in de extensão para uma IDE
![Page 13: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/13.jpg)
Demonstração da
Ferramenta JMT
Integrada ao JBuilder
13
JMT Integrada ao JBuilder
![Page 14: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/14.jpg)
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
![Page 15: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/15.jpg)
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
![Page 16: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/16.jpg)
16
JSystemInfoFerramenta para coleta de informações de sistemas Java.
![Page 17: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/17.jpg)
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)
![Page 18: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/18.jpg)
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
![Page 19: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/19.jpg)
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
![Page 20: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/20.jpg)
20
Método para aplicar o
Encapsulate Field
Seleciona aleatoriamente um campo público do sistema.
![Page 21: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/21.jpg)
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.
![Page 22: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/22.jpg)
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.
![Page 23: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/23.jpg)
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
![Page 24: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/24.jpg)
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
![Page 25: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/25.jpg)
25
Exemplo
Refactoring Automático (Antes)
ClasseA
public String fileName;
void methodA ()
myClasseBClasseB
public String extenssion;
![Page 26: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/26.jpg)
26
PRIMEIRA AVALIACAO: -11
Selected Move MethodSource class: ClasseAMethod: methodATarget class: ClasseB
AVALIACAO: -6
UNDO ...
Exemplo (Passo 1)
Refactoring Automático
![Page 27: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/27.jpg)
27
AVALIACAO: -11
Selected Encapsulate Field
Class: ClasseBField: extenssion
AVALIACAO: -22
Aceito !
Exemplo (Passo 2)
Refactoring Automático
![Page 28: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/28.jpg)
28
Selected Inline Class
Source class: ClasseBTarget class: ClasseA
AVALIACAO: -41
Aceito !
AVALIACAO FINAL: -41
Exemplo (Passo 3)
Refactoring Automático
![Page 29: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/29.jpg)
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)
![Page 30: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/30.jpg)
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 ?
![Page 31: Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson.](https://reader035.fdocumentos.tips/reader035/viewer/2022062318/552fc10b497959413d8c204c/html5/thumbnails/31.jpg)
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