A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Refactoring de Programas Java

Apresentações semelhantes


Apresentação em tema: "Refactoring de Programas Java"— Transcrição da apresentação:

1 Refactoring de Programas Java
Projeto Orientado II Refactoring de Programas Java Dezembro de 2003 - Este projeto propõe a integração de uma ferramenta de refactoring a um ambiente de desenvolvimento de sistemas (IDE). - O orientador do projeto é o Professor Doutor Marcelo de Almeida Maia e eu, que irei apresentar nosso trabalho, sou aluno de Ciência da Computação da UFOP: Eduardo Magno Lages Figueiredo. Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Jamilson Freitas Souza

2 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 - Os tópicos que serão abordados nesta apresentação são: * A principal motivação; * Uma visão geral do projeto; * A linguagem de manipulação de programas JMJ; * Refactoring, sendo apresentado o conceito e alguns dos refactorings trabalhados: Move Field, Move Method e Extract Class; * A ferramenta para meta-programação JMT; * e, a conclusão sobre este trabalho. 2

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 - A principal motivação para este trabalho é melhorar a qualidade de software, oferecendo uma ferramenta para auxiliar o programador no desenvolvimento de sistemas. - Um sistema Orientado a Objetos deve apresentar certas características para que seja considerado um software de qualidade: * Ele deve possibilitar reutilização de seus módulos; * Deve ser desenvolvido de acordo com padrões de design; * Deve apresentar código legível e fácil de ser compreendido; * E deve permitir fácil manutenção e fácil inclusão de novas funcionalidades. - Porém, um sistema que apresente todas estas características é difícil de ser produzido em suas primeiras versões. - A solução é efetuar reprojeto no sistema, criando novas versões que apresentem melhor qualidade. “Um projeto reutilizável e flexível é difícil, senão impossível, de obter corretamente da primeira vez." Gamma et al. 3

4 Manipulação de Programas
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? - A principal motivação para este trabalho é melhorar a qualidade de software, oferecendo uma ferramenta para auxiliar o programador no desenvolvimento de sistemas. - Um sistema Orientado a Objetos deve apresentar certas características para que seja considerado um software de qualidade: * Ele deve possibilitar reutilização de seus módulos; * Deve ser desenvolvido de acordo com padrões de design; * Deve apresentar código legível e fácil de ser compreendido; * E deve permitir fácil manutenção e fácil inclusão de novas funcionalidades. - Porém, um sistema que apresente todas estas características é difícil de ser produzido em suas primeiras versões. - A solução é efetuar reprojeto no sistema, criando novas versões que apresentem melhor qualidade. 4

5 Tecnologia Utilizada Linguagem de manipulação de programas MetaJ
Linguagem de Programação Java Aplicação - Antes de continuar falando sobre produção de software, será apresentado o projeto MetaJ. - MetaJ é um projeto de parceria entre o DCC da UFMG e o DECOM da UFOP. - O objetivo do projeto é produzir um ambiente para meta-programação. - MetaJ esta sendo desenvolvido em Java para manipulação de diversos tipos de linguagens de programação. - As linguagens que podem ser manipuladas são inseridas em MetaJ através de plug-ins. - Este trabalho que esta sendo apresentado atua nas duas camadas superiores do projeto, ou seja, na produção de meta-programas e em aplicações para a linguagem. 5

6 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 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 6

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 private String nome ; public String getNome() public void setNome(String nome) Aluno public String nome ; - O primeiro refactoring que iremos apresentar é o Move Field. - A mecânica deste refactoring é a seguinte: * Primeiro ele cria um novo campo na classe destino; * Depois ele altera todas as referências feitas ao campo; * Finalmente, ele remove o campo da classe origem. - Na ilustração, o campo "professor" é movido da classe "Disciplina" para a classe "Turma". public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; 7

8 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 String professor ; Disciplina Turma Turma String professor ; - O primeiro refactoring que iremos apresentar é o Move Field. - A mecânica deste refactoring é a seguinte: * Primeiro ele cria um novo campo na classe destino; * Depois ele altera todas as referências feitas ao campo; * Finalmente, ele remove o campo da classe origem. - Na ilustração, o campo "professor" é movido da classe "Disciplina" para a classe "Turma". 8

9 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 boolean matriculado() ; Aluno - O Move Method é bem semelhante ao Move Field. - Este refactoring age da seguinte forma: * Primeiro cria um método na classe destino com um corpo similar ao corpo do método original; * Depois transforma o método antigo em um redirecionador ou o remove atualizando as referências. - Na ilustração, o método "matriculado" é movido da classe "Disciplina" para a classe "Aluno". 9

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() ; Turma turma - O refactoring Extract Class é praticamente uma soma de Move Fields e Move Methods. * Primeiro ele cria uma nova classe vazia; e * Depois ele move os campos e métodos relevantes da classe antiga para a nova classe. - Note que, mesmo movendo o método "matriculado" da classe "Disciplina" para a classe "Turma", este método permanece na classe "Disciplina" como um redirecionador. 10

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() ; Avaliacao avaliacao - O primeiro refactoring que iremos apresentar é o Move Field. - A mecânica deste refactoring é a seguinte: * Primeiro ele cria um novo campo na classe destino; * Depois ele altera todas as referências feitas ao campo; * Finalmente, ele remove o campo da classe origem. - Na ilustração, o campo "professor" é movido da classe "Disciplina" para a classe "Turma". 11

12 A Ferramenta JMT Java Meta-programming Tool
Programação e Aplicação de refactoring Plug-in de extensão para uma IDE - Apresentaremos agora JMT. - A sigla significa Java Meta-programming Tool, ou seja, é uma ferramenta para meta-programação Java. - JMT integra a linguagem JMJ a um ambiente de desenvolvimento de sistemas (IDE). - A instalação desta ferramenta é através de um plug-in de extensão da IDE. - JMT é utilizada para aplicação de refactorings, sendo um diferencial entre JMT e as demais ferramentas de refactoring abalizadas que: JMT oferece uma maneira facilitada de alteração do código dos refactorings e adição de novos itens de meta-programação. 12

13 JMT Integrada ao JBuilder
Demonstração da Ferramenta JMT Integrada ao JBuilder - Este projeto propõe a integração de uma ferramenta de refactoring a um ambiente de desenvolvimento de sistemas (IDE). - O orientador do projeto é o Professor Doutor Marcelo de Almeida Maia e eu, que irei apresentar nosso trabalho, sou aluno de Ciência da Computação da UFOP: Eduardo Magno Lages Figueiredo. 13

14 Seleção e Aplicação Automática
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 - A principal motivação para este trabalho é melhorar a qualidade de software, oferecendo uma ferramenta para auxiliar o programador no desenvolvimento de sistemas. - Um sistema Orientado a Objetos deve apresentar certas características para que seja considerado um software de qualidade: * Ele deve possibilitar reutilização de seus módulos; * Deve ser desenvolvido de acordo com padrões de design; * Deve apresentar código legível e fácil de ser compreendido; * E deve permitir fácil manutenção e fácil inclusão de novas funcionalidades. - Porém, um sistema que apresente todas estas características é difícil de ser produzido em suas primeiras versões. - A solução é efetuar reprojeto no sistema, criando novas versões que apresentem melhor qualidade. 14

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 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 15

16 Ferramenta para coleta de informações de sistemas Java.
JSystemInfo Ferramenta para coleta de informações de sistemas Java. - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 16

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) - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 17

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 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 18

19 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 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 19

20 Seleciona aleatoriamente um campo público do sistema.
Método para aplicar o Encapsulate Field Seleciona aleatoriamente um campo público do sistema. - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 20

21 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. - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 21

22 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. - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 22

23 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). Grandes Médias Pequenas - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 23

24 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 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 24

25 Refactoring Automático (Antes)
Exemplo Refactoring Automático (Antes) ClasseA public String fileName; void methodA () myClasseB ClasseB public String extenssion; - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 25

26 Refactoring Automático
Exemplo (Passo 1) Refactoring Automático PRIMEIRA AVALIACAO: -11 Selected Move Method Source class: ClasseA Method: methodA Target class: ClasseB AVALIACAO: -6 UNDO ... - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 26

27 Refactoring Automático
Exemplo (Passo 2) Refactoring Automático AVALIACAO: -11 Selected Encapsulate Field Class: ClasseB Field: extenssion AVALIACAO: -22 Aceito ! - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 27

28 Refactoring Automático
Exemplo (Passo 3) Refactoring Automático Selected Inline Class Source class: ClasseB Target class: ClasseA AVALIACAO: -41 Aceito ! AVALIACAO FINAL: -41 - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". 28

29 Refactoring Automático (Depois)
Exemplo Refactoring Automático (Depois) ClasseA public String fileName; private String extenssion; void methodA () public void setExtenssion(String arg) public String getExtenssion () - Refactorings são transformações de programas que preservam a semântica do mesmo, ou seja, preservam o comportamento externo do sistema. - Várias ferramentas de refactoring têm aparecido no mercado, e mesmo as IDE's tem oferecido opções de refactoring. - As implementações de refactoring deste trabalho são baseadas no livro do Fowler "Refactoring - Improve the Design of Existing Code". Campo “extenssion” foi encapsulado “ClasseB” foi absorvida pela “ClasseA” (Inline Class) 29

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 ? - A conclusão é que JMT oferece maior flexibilidade ao usuário, opções para extensão de suas funcionalidades e baixa dependência da IDE, uma vez que JMJ é totalmente independente da IDE. - Porém, um problema identificado é a complexidade da linguagem JMJ e dos meta-programas. 30

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 - A conclusão é que JMT oferece maior flexibilidade ao usuário, opções para extensão de suas funcionalidades e baixa dependência da IDE, uma vez que JMJ é totalmente independente da IDE. - Porém, um problema identificado é a complexidade da linguagem JMJ e dos meta-programas. 31


Carregar ppt "Refactoring de Programas Java"

Apresentações semelhantes


Anúncios Google