310 likes | 398 Views
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
E N D
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
Aplicação Tecnologia Utilizada • Linguagem de manipulação de programas MetaJ • Linguagem de Programação Java 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
Aluno private String nome ; public String getNome() public void setNome(String nome) Aluno public String nome ; Refactoring Encapsulate Field Torna o campo privado, prove métodos get e set públicos para acessar o campo e atualiza as referências. public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } 7
Disciplina String professor ; Turma String professor ; Disciplina Turma Refactoring Move Field Cria um novo campo na classe destino, altera todas as referências feitas ao campo e o remove da classe origem. 8
Disciplina boolean matriculado() ; Aluno boolean matriculado() ; Aluno Disciplina 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. 9
Disciplina String codigo ; Aluno [] matriculados ; String professor ; boolean matriculado() ; Disciplina String codigo ; boolean matriculado() ; Turma Aluno [] matriculados ; String professor ; boolean matriculado() ; turma Refactoring Extract Class Cria uma nova classe, movendo os campos e métodos relevantes da classe antiga para a nova classe. 10
Avaliacao int prova1 ; int prova2 ; boolean getSituacao() ; Aluno String nome ; int prova1 ; int prova2 ; boolean getSituacao() ; Aluno String nome ; avaliacao Refactoring Inline Class Move todas as características de uma classe para outra e elimina a classe vazia. Oposto do Extract Class. 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: • 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) • 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 • Seleciona aleatoriamente um campo qualquer do sistema. • Seleciona uma classe destino para o campo diferente da classe origem, mas no mesmo pacote. 21
Método para aplicar o Move Method • Seleciona aleatoriamente um método não privado (private) do sistema. • Seleciona uma classe destino para o método diferente da classe origem, mas no mesmo pacote. 22
Grandes Médias Pequenas Método para aplicar o Extract Class • Separa as classes, pelo seu tamanho, em três grupos com o mesmo número de classes cada. • 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. • Seleciona alguns membros aleatórios da classe para compor uma nova classe (Criada pelo Extract Class). 23
Método para aplicar o Inline Class • 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
ClasseA public String fileName; void methodA () myClasseB ClasseB public String extenssion; Exemplo Refactoring Automático (Antes) 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
ClasseA public String fileName; private String extenssion; void methodA () public void setExtenssion(String arg) public String getExtenssion () Exemplo Refactoring Automático (Depois) • 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