refactoring de programas java

31
Refactoring de Programas Java Projeto Orientado II Aluno : Eduardo Magno Lages Figueiredo Orientador : Marcelo de Almeida Maia Colaborador : Marcone Dezembro de 2003

Upload: clark

Post on 03-Feb-2016

40 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Refactoring de Programas Java

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

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

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

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

5

Tecnologia Utilizada

Linguagem de manipulação de programas MetaJ

Linguagem de Programação Java

Aplicação

Page 6: Refactoring de Programas Java

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

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

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

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

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

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

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

Demonstração da

Ferramenta JMT

Integrada ao JBuilder

13

JMT Integrada ao JBuilder

Page 14: Refactoring de Programas Java

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

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

16

JSystemInfoFerramenta para coleta de informações de sistemas Java.

Page 17: Refactoring de Programas Java

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

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

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

20

Método para aplicar o

Encapsulate Field

Seleciona aleatoriamente um campo público do sistema.

Page 21: Refactoring de Programas Java

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

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

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

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

25

Exemplo

Refactoring Automático (Antes)

ClasseA

public String fileName;

void methodA ()

myClasseBClasseB

public String extenssion;

Page 26: Refactoring de Programas Java

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

27

AVALIACAO: -11

Selected Encapsulate Field

Class: ClasseBField: extenssion

AVALIACAO: -22

Aceito !

Exemplo (Passo 2)

Refactoring Automático

Page 28: Refactoring de Programas Java

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

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

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

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