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