Refactoring de Programas Java

Slides:



Advertisements
Apresentações semelhantes
Soluções elegantes para problemas recorrentes
Advertisements

AULA 02 PROGRAMAÇÃO LINEAR INTEIRA
Programação em Java Prof. Maurício Braga
Introdução a Programação Orientada a Objetos
Experiments with Clustering as a Software Remodularization Method Nicolas Anquetil and Timothy C. Lethbridge University of Ottawa, Canada WCRE 1999:
Raphael Gatti Thomás Bryan
Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/ Capitulo 3 – Introdução às classes Capitulo 3 Introdução às classes.
Celso C. Ribeiro Caroline T. Rocha
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
03/08/2011 Professor Leomir J. Borba- –
Interação entre objetos
Ferramenta de aprovisionamento de redes de cliente
SISTEMAS DE EQUAÇÕES.
Orientação a Objetos: Encapsulamento e Classificação
Java: Pacotes e Modificadores de Visibilidade
Java: Pacotes e Modificadores de Visibilidade
Introdução à Programação
1 MODELAGEM COM A UML (UNIFIED MODELING LANGUAGE) BREVE HISTÓRICO CARACTERÍSTICAS CONCEITOS DE PROGRAMAÇÃO ORIENTADA A OBJETOS MODELAGEM DE ANÁLISE E DE.
Administração para Engenharia
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
ANÁLISE E PROJETO ORIENTADA A OBJETOS UFRJ/IM/DCC Lab PSI mai/1999.
Auditoria de Segurança da Informação
Aula 8 Orientação à Objetos
Aula 6 Subprogramas Universidade do Vale do Rio dos Sinos
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
1 MAC 413/5715 – Seminário Prof. Fabio Kon Self: The Power of Simplicity David Ungar and Randall B. Smith OOPSLA 1987 Cristina Fang Eduardo Miyoshi Kasa.
Registro Eletrônico para Acompanhamento Médico de Pacientes em uma UTI Rafael Charnovscki (1), Jacques R. Nascimento Filho (2,3) Giancarlo Bianchin.
Capítulo 9 Herança 1.
Fases do desenvolvimento de software UML
Listas Encadeadas.
Classes e objetos Arrays e Sobrecarga
Classes e objetos Modelagem
Herança P. O. O. Prof. Ângela e Grace.
Classes e objetos P. O. O. Prof. Grace.
Introdução a Programação Orientada a Objetos
Análise de Casos de Uso Alexandre Motnteiro.
Monitoria GDI Aula Prática
IDENTIFICAÇÃO, MODELAGEM E ANÁLISE DE PROCESSOS Luís Gonzaga Trabasso
Programação Orientada a Objetos com Java
Aluno: Mário Monteiro Orientador: Sérgio Soares 1.
Object Oriented Software Construction (MEYER, Bertrand)
Compressão de Textos Juliano Palmieri Lage.
Cadastro de Docentes e Auxiliares de Educação Infantil
Linguagens Orientadas a Objeto
Estruturas de Dados com Jogos
BENCHMARKING.
Principais operações em Listas TPA Listas Simples Inserção no Final 1.void insereNofinalDaLista(Lista *l, Elemento e){ 2.Lista paux,p; 3. p.
Entendendo as definições de classe
É u m e l e m e n t o f u n d a m e n t a l
Diêgo Santiago, Leila Soriano e Patrícia Lustosa 27/03/2008 JaTS Java Transformation System.
Introdução e Busca Cega
Ritornello Um Framework para Representação de Conhecimento Musical
IF696 - Integração de Dados e DW
1.
Projeto de Banco de Dados
1 2 Observa ilustração. Cria um texto. Observa ilustração.
1/27 IV Encontro Sul Fluminense de Educação Matemática - ESFEM 16 e 17 de dezembro de 2005 Antonio.
CALENDÁRIO SEXY Ele & Ela. CALENDÁRIO SEXY Ele & Ela.
1 Aplicações do Fecho Regular. 2 A interseção de uma linguagem livre de contexto e uma linguagem regular é uma linguagem livre de contexto livre de contexto.
Marcio de Carvalho Victorino
Acoplamento e Coesão Modelagem e Programação Orientada a Objetos
Stream – Fluxo I/O Sistema de Arquivos
Rio Verde - Goiás - Brasil
FORMATANDO O TRABALHO NO WORD 2007
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS EM JAVA
CALENDÁRIO 2013 MÓDULO II.
Listas Simplesmente Encadeadas
Contagem Sequencial do Estoque
Aula 10 Adeline de Sousa Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis.
Transcrição da apresentação:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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