Universidade Federal de Pernambuco
Centro de Informática
Disciplina:
Tópicos Avançados em Engenharia de Software (IF722)Professor:
Paulo Henrique Monteiro Borba ([email protected])Atividade 1
Identificando oportunidades de
aumento do reuso de código
Equipe:
Filipe Wanderley Lima ([email protected]);
Maria Carolina Revoredo Martiniano ([email protected]).
1
Controle de Versões
Versão
Data
Descrição
Autor(es)
2
Sumário
1. Estratégia ... 3
1.1. Métricas de arquivo ... 3
1.2. Métricas de conjunto de clones ... 3
2. Configuração escolhida ... 4
2.1. Parâmetros ... 4
2.2. Scatter plot ... 4
2.3. Métricas de conjunto de clones ... 5
2.4. Resultados ... 5
2.5. Exemplos de clones não significativos ... 5
2.6. Exemplos de clones significativos ... 6
3
1.
Estratégia
Começar com restrições mais fortes;
Analisar os clones;
Diminuir as restrições;
Até que não haja mais nenhum clone interessante.
1.1.
Métricas de arquivo
LEN: Tamanho do arquivo em tokens;
CLN: Número de clones;
NBR: Vizinhos, outros arquivos que compartilham o mesmo clone com este arquivo;
RSA: Relação de similaridade com outro arquivo;
RSI: Relação de similiradade dentro do arquivo;
CVR: Cobertura, porcentagem de tokens cobertos por outros clones;
RNR: Relaçao de código não repetido.
1.2.
Métricas de conjunto de clones
LEN: Tamanho do fragmento de código do clone;
POP: Quantidade de fragmentos de código do clone;
NIF: Quantidade de arquivos fonte que incluem um ou mais fragmentos de código do clone;
RAD: Alcance dos fragmentos de código de um arquivo fonte de um clone na hierarquia de
diretório;
RNR: Relação (porcentagem) de tokens que não estão incluídos em partes repetidas de
fragmentos de código do clone;
4
2.
Configuração escolhida
2.1.
Parâmetros
Minimum clone length: 30;
Minimum token size: 15;
Shaper level: 3 – Hard shaper;
P-match: ativado.
5
2.3.
Métricas de conjunto de clones
2.4.
Resultados
Total de clones: 22
Quantidade de clones significativos: 15 (68%)
Quantidade de clones não significativos: 7 (32%)
2.5.
Exemplos de clones não significativos
ID 36: insignificante, pois o clone 34 capturou melhor a duplicação do código;
ID 156: insignificante, pois o clone 157 capturou melhor a duplicação do código;
ID 218: insignificante, pois os clones não fazem sentido;
ID 350: é a fachada. É normal alguns métodos parecem clones, pois a somente chamados de
métodos;
ID 365: clones já detectados;
ID 385: clones já detectados;
6
2.6.
Exemplos de clones significativos
ID 1
Porque é significante: as classes TeseDoutorado e DissertacaoMestrado são idênticas.
Possível solução: Refatorar as duas classes em uma única que teria um atributo indicando
7
ID 4 Porque é significante: as classes CadastrarPublicacaoServlet e EditarPublicacaoServlet
são muito parecidas, exceto pelo tipo de operação realizada. Além disse há uma duplicação do método doPost.
Possível solução: Refatorar as duas classes em uma única que teria receberia como
parâmetro do método doGet o tipo da operação a ser realizada. O doPost poderia ser refatorado criando uma nova classe que extenderia de HttpServlet e já faria o chamado do método doPost.
8
ID 5 Porque é significante: as classes EditarPublicacao2Servlet e CadastrarPublicacao2
possuem o método doGet muito parecidos, exceto pelo tipo de operação realizada. Possível solução: Da mesma maneira do clone 4.
9
ID 7 Porque é significante: as classes EditarLinhaPesquisaServlet e CadastrarLinhaPesquisaServlet possuem o método doGet muito parecidos, exceto pelo tipo de operação realizada. Os métodos preencherPublicacoes e preencherMembros são idênticos para as duas classes.
Possível solução: Da mesma maneira do clone 4. Os métodos preencherPublicacoes e
10
ID 17 Porque é significante: a classe ControleLinhaPesquisa possui os métodos
cadastrarLinhaPesquisa, editarLinhaPesquisa e deletarLinhaPesquisa (não detectado por essa configuração!) muito semelhantes.
Possível solução: Poderia ser criado um único método que receberia como parâmetro o
11
ID 18 Porque é significante: a classe ControleMembro possui os métodos cadastrarMembro,
editarMembro e deletarMembro (não detectado por essa configuração!) muito semelhantes.
12
ID 22 Porque é significante: as classes EditarPublicacao2Servlet, CadastrarLinhaPesquisaServlet e EditarLinhaPesquisaServlet possuem os métodos preencherPublicacoes, preencherMembros e preencherNaoMembros muito semelhantes. Possível solução: As classes CadastrarLinhaPesquisaServlet e EditarLinhaPesquisaServlet
poderiam ser refatoradas em uma única classe que receberia como parâmetro o tipo de operação a ser realizada. Os métodos preencherPublicacoes e preencherMembros ficaram nessa única classe. Os métodos preencherNaoMembros e preencherMembros de EditarPublicacao2Servlet poderiam ser refatorados em um único método que receberia como parâmetro se é para preencher um membro ou não membro.
13
ID 34 Porque é significante: na classe PublicacaoDAO, partes dos métodos getDissertacaoMestrado, getTeseDoutorado, getPeriodicoRevista e getConferencia são muito semelhantes.
Possível solução: Talvez esses métodos pudessem ser refatorados em um único método
14
ID 50 Porque é significante: nas classes LinhaPesquisaDAO e PublicacaoDAO os métodos
preencherMembros, preencherPublicacoes, adicionarMembrosPublicacao e adicionarNaoMembrosPublicacao são muito semelhantes.
15
ID 68 Porque é significante: na classe LinhaPesquisaDAO, os métodos cadastrarPublicacoes e
cadastrarMembros são muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
16
ID 122 Porque é significante: na classe PublicacaoDAO, os métodos cadastrarDissertacaoMestrado, cadastrarTeseDoutorado, cadastrarArtConferencia e cadastrarArtPeriodicoRevista (esse dois últimos não foram detectados!) são muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
17
ID 157 Porque é significante: na classe MembroDAO, os métodos listarProfessores,
listarEstudantes e listarPesquisadores são muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
18
ID 184 Porque é significante: na classe MembroDAO, os métodos cadastrarProfessor e
cadastrarPesquisador são muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
19
ID 216 Porque é significante: as classes MembroDAO e LinhaPesquisaDAO possuem os métodos
deletarLinhaPesquisa e deletarMembro muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
como parâmetro se o objeto a ser deletado é uma linha de pesquisa ou membro.
ID 367
Porque é significante: a classe PublicacaoDAO possui os métodos cadastrarRelacionamentoComMembro e cadastrarRelacionamentoComNaoMembro muito semelhantes.
Possível solução: Esses métodos poderiam ser refatorados em um único que receberia
20
3.
Outras configurações
Configuração 1
MCL: 50MTS: 12
Shaper Level: 2 - Soft shaper P-match Application: [X]
Scatter plot:
Total de clones: 50
Quantidade de clones significativos: Exemplos de clones não significativos: CLONE IDs: 24, ...
21
CLONE ID 1 - A classe Pesquisador e Professor poderiam ser representados pela classeMembro com a adição de um atributo a mais, indicando se o membro é um pesquisador ou professor.
CLONE ID 3 - As classes TeseDoutorado e DissertacaoMestrado também poderiam ser
refatoradas como dito acima, já que elas não mudam entre si.
CLONE ID 5 - Os servlets que têm o método doPost chamando o método doGet poderiam
ser refatorados com uma nova classe que extenderia HttpServlet e já faria isso.
CLONE ID 7 - Os servlets de cadastrar e editar poderiam ser juntados em um único servlet
que, de acordo com o parâmetro da ação a ser realizada, o servlet realizaria a ação.
CLONE ID 11 - Os métodos de cadastrar/editar Membro/LinhaPesquisa poderiam ser
refatorados em um único método que receberia como parâmetro o tipo de operação.
CLONE ID 34 - Os métodos de listar professores, estudantes e pesquisadores poderiam ser
refatorados em um único, que receberia o tipo de membro por parâmetro.
CLONE ID 54 - Os métodos de cadastrar professores e pesquisadores também poderiam
ser refatorados como o caso acima.
CLONE ID 94 - Os métodos de getTeseDoutorado e getDissertacaoMestrado também
poderiam ser refatorados como o caso acima.
CLONE ID - bib.append GerarListaPublicacao
dao\PublicacaoDAO.java
view\MembroAux.java
As duas classes possuem os CLN mais altos (10 e 11, média = 1.5).
linhapesquisa\CadastrarLinhaPesquisaServlet.java
linhapesquisa\EditarLinhaPesquisaServlet.java
view\CadastrarPublicacao2.java
view\EditarPublicacao2Servlet.java
Classes com alto grau de NBR (6, média = 1.1). As duas primeiras possuem muitos clones entre si, só mudando basicamente a funcionalidade (cadastrar e editar). O mesmo para as duas últimas. src\br\ufpe\cin\in980\basic\DissertacaoMestrado.java src\br\ufpe\cin\in980\basic\Pesquisador.java src\br\ufpe\cin\in980\basic\Professor.java src\br\ufpe\cin\in980\basic\TeseDoutorado.java src\br\ufpe\cin\in980\linhapesquisa\CadastrarLinhaPesquisaServlet.java src\br\ufpe\cin\in980\linhapesquisa\EditarLinhaPesquisaServlet.java
22
src\br\ufpe\cin\in980\view\CadastrarPublicacaoServlet.java src\br\ufpe\cin\in980\view\EditarPublicacao2Servlet.java
src\br\ufpe\cin\in980\view\EditarPublicacaoServlet.java
Essas classes possuem alto grau de RSA (max = 0,9 e média = 0,2) e CVR (max = 0,9 e média = 0,4), ou seja, alta similaridade com outros arquivos. São classes que possuem vários clones entre si e a maior parte dos seus códigos são clones.
src\br\ufpe\cin\in980\dao\PublicacaoDAO.java
src\br\ufpe\cin\in980\logic\Fachada.java
Essas classes possuem um alto RSI (max = 0,7 e média = 0,3), ou seja, vários clones dentro da própria classe. Na primeira classe isso se deve ao fato de que ela é responsável por fazer as mesmas ações (cadastrar, buscar e editar) mudando apenas tipo de publicação. Na fachada acontece a mesma coisa.
Configuração 2
MCL: 40MTS: 12
Shaper Level: 2 - Soft shaper P-match Application: [X]
Scatter plot:
23
Total de clones: 58Exemplos de clones significativos: dao\PublicacaoDAO.java
view\MembroAux.java
As duas classes continuam possuindo os CLN mais altos (11 e 14, média = 1,7). As classes que foram mencionadas anteriormente na configuração 1 com os maiores valores NRB (6, média = 1,1), RSA (max = 0,9 e média = 0,2), CVR (max = 0,9 e média = 0,4) e RSI (max = 0,7 e média = 0,3) continuam apresentando os mesmos valores nesta nova configuração.
24
Configuração 3
MCL: 20 MTS: 12 Shaper Level: 3 P-match Application: [X]Scatter plot: Total de clones: 88
Exemplos de clones significativos:
25
Essa classe possui o conjunto de clones de maior LEN (322 e média = 107). A mesma classe possui vários conjuntos de clones, só diminuindo o tamanho. Os clones são vários ifs aninhados. Conseqüentemente, ela possui também um alto grau de COND (11 e média = 1,2).
Configuração 4
MCL: 30MTS: 12
Shaper Level: 2 - Soft shaper P-match Application: [ ]
Total de clones: 70
Exemplos de clones significativos: dao\PublicacaoDAO.java
26
As classes continuam possuindo os CLN mais altos (18 e 15, média = 2,2).
view\CadastrarPublicacaoServlet.java
view\EditarPublicacaoServlet.java
Estas classes possuem os maiores valores de RSA (máx = 0,99 e média = 3,3). O código das duas é praticamente o mesmo, modificando apenas os nomes que em uma é ‘cadastrar’ e na outra ‘editar’.
Configuração 5
MCL: 50MT: 8
Shaper Level: 2 - Soft shaper P-match Application: [X]
Total de clones: 80
27
dao\PublicacaoDAO.java dao\MembroDAO.java
A classe dao\PublicacaoDAO.java continua como uma das que possui um alto número de clones, sendo esse valor igual a 23. A classe dao\MembroDAO.java vem logo em seguida com CLN igual 22. A média encontra-se em 2,5. A classe view\MembroAux.java que anteriormente figurava entre as que possuiam um dos maiores CLN, agora apresenta um CLN igual a 11, que comparado aos das classes mencionadas acima torna-se baixo.
view\GerarListaPublicacaoAux.java
Esta classe é a que possui o maior RSI (max = 0,83, média = 0,4), logo, possui um grande número de clones dentro de seu próprio arquivo.