DETECÇÃO DE CLONES
Emmanuel Tenório Férrer – et Gabriela Fernanda - gfsv
Configuracao mais adequada
O clone de id 51 foi o clone que mais ocorreu e o clone que mais apareceu em arquivos diferentes. As classes que o clone ocorreu foram: “DaoNoticia”,”DaoLinhaPesquisa”, “DaoPesquisa” e “DaoMembro”. Observamos que esses clones quando aparece no mesmo arquivo eles são mais parecidos do que em arquivos diferentes. Esse clone tem um tamanho 80 e a quantidade de tipos de tokens é 20. Esse é um clone significativo. Abaixo , a figura ilustra esse clone:
O clone 74 é o clone com o maior do McCabe (4). É o clone mais complexo. É um clone significativo. Possui um tamanho de 214 e 27 tipos de tokens
O clone 161 apresenta a maior taxa de RNR com 0.940. Este é um clone bastante significativo pois é exatamente igual nas 4 vezes em que aparece. Tem tamanho 66 e 17 tipos de tokens:
O clone 141 não é um clone significativo, por fazer coisas diferentes. Aparece 2 vezes no mesmo arquivo “AdcionarPublicacaoServlet”com 61 de tamanho e 15 tipos de tokens:
O clone 122 não é significativo. Apesar de incluir um método que faz a mesma coisa, não consideramos ele como significativo, apesar de tem um raio com valor 9 , pois inclui chamada de métodos diferentes. Podemos ver na figura:
Clones significativos:
5 – Funções de remover, muda apenas o parâmetro
6 – O método doGet aparece em 4 arquivos e em todos executa a mesma ação
19 – Não sabemos se este clone é significativo, pois os tipos de retorno do método são diferentes.
35 – O método doGet aparece em 2 arquivos e em todos executa a mesma ação. 74, 84, 161 e 203 – São os mesmos métodos em classes separadas
171 – Classe foto e pdf com o mesmo método
Clones não significativos: 141, 122
Foram encontrados 13 clones, sendo 11 significativos e 2 não significativos.
Configurações com os outros valores
das outras equipes
Configuração padrão do programa
Para as configuração padrão do programa, os seguinte dados foram recolhidos:Um clone significativo para essa configuração foi encontrado no adicionar de “adcionarPublicacaoServlet.java” e “adcionarMembroServlet.java”. A função “ProcessFormField()” aparece nos dois arquivos de forma idêntica. Como mostrado na figura abaixo:
O segundo clone significativo que aparece nesses dois arquivos é dentro de da função “extractFields()” em “adcionarMembroServlet.java” e dentro da função “doPost()” em “adcionarPublicacaoServlet.java” . Embora os métodos sejam diferentes em uma determinada parte do código dessas funções eles fazem um procedimento igual . A figura abaixo ilustra esse procedimento.
A Figura a seguir mostra em vermelho mais um exemplo de clone significativo e em verde um clone não significativo
Informações dos clones detectados nos arquivos “adcionarPublicacaoServlet.java” e “adcionarMembroServlet.java.
O clone identificado com o id 3 é a função “processFormField()”. Aparece em 6 arquivos . O tamanho desse clone é de 53 e ele pode ser considerado um clone significativo. Pois sua estrutura é a mesma em todos os arquivos em que ele aparece. O clone possui 15 tokens:
O clone identificado com o id 9 é a função “RemoverMembroServlet ()”. Aparece em 2 arquivos diferentes . O tamanho desse clone é de 89. É um clonesignificativo. Sua estrura é muito parecida nos 2 arquivos em que aparece, basicamente mudando apenas o valores do parâmetros. Possui 15 tokens.
O clone identificado com o id 10 são classe que possui a mesma estruturas , diferenciando apenas nos valores do parâmetros além do nome da classe. São elas:
RemoverMembroServlet, DetalharPublicacaoServlet, AlterarNoticiaServlet, DetalharNoticiaServlet. O tamanho do clone é 87 . é um clone significativo com 16
Um clone bem maior é o clone de id 13. Com o tamanho de 181 e 25 tokens, ele engloba duas funções(“processFormField()”, “doPost”) em 3 arquivos. Porém partes desse clone não deveria ser detectado como clone , pois são informações dos (ou para os ) atributos da classe Membro e Publicação e estes são diferentes. Parte desse clone é significativo.
O clone de id 27 aparece duas vezes no mesmo arquivo como também em outro arquivo. Para os arquivos diferentes a estrutura desse clone é diferente e não deveria ser considerado como um clone significativo. Porém quando aparece no mesmo arquivo o clone é significativo, pois poderíamos reusar a função modificando os valores dos parâmetros. Seu tamanho é 114 e 16 tokens.
Para o clone 36 , o programa não detecta que ele deveria ter o mesmo id do clone de id 10. Apesar do seu tamanho ser de 76 e possui 15 tokens, ambos diferentes dos valores do id 10, a estrutura desse clone faz o mesmo que o clone de id 10 faz. O sistema não percebeu que no clone id 10 a variável criada do tipo int não é usado pela estrutura e portanto não deveria ser distinguido do clone de id 36. Esse é um clone significativo e aparece em dois arquivos : “DetalharMembroServlet”, e
“AlterarMembroServlet”.
O clone de id 44 não é um clone significativo, pois nos 2 arquivos em que aparece , a estrutura do clone faz alterar campos diferentes. Seu tamanho é 56 e possui 13 tokens.
Clone de id 51 possui tamanho 80 e 20 tokens . Aparece em 4 arquivos:
“DaoPublicacao”, “DaoLinhaPesquisa”, “DaoNoticia”, “DaoMembro.” São funções
gets que se tornam diferentes apenas no valor e no tipo do parâmetro. É um clone significativo. (Penso que o tipo do parâmetro não está influenciando).
O clone de id 63 com 215 de tamanho e 27 tokens ele pega parte do clone 51 e acrescenta mais conteúdo . Aparece em 2 arquivos. Poderiamos distrinchar esse clone pegando uma parte dele e criando uma função , passando a classe como parâmetro . Esse conteúdo seria o mesmo conteúdo que vem na função “List<Noticia>
getNoticias”, “List<LinhaPesquisa> getLinhasPesquisa”.
O clone de id 106 com 161 de tamanho e 21 tokens podereria ter sido encontrando também na class Filtrar MembrosServlet” além de ser encontrada nas classes
“FiltrarNoticiasServlet”, “FiltrarPublicacoesServlet”, “FiltrarLinhasServlet”. Mas não faz
isso pois na class “FiltrarMembrosServlet”, a função doPost() não está posicionado logo acima da função “addField”. Este não é um clone significativo, pois existe outro clone que detecta a clonagem da função “addField”.
O clone 117 não é um clone significante. Tem tamanho 98, aparece em dois arquivos e possui 13 tokens.
O clone 120 não é significativo, pois são criadas classes diferentes. Possui 52 de tamanho e 15 tokens. (São condições para saber se é Mestrado ou Doutorado).
Clone de id 131 e o id 134 de tamanho 69 e 20 tokens e tamanho 59 e 12 tokens respectivvamente não são significativos , pois já faz chamada a outros métodos . São 4 e 2 classes respectivamente que esse clone aparece (clone de exceção.).
Os clones de id 144 e 145 são clones que o loop em um Iterator faz a mesma coisa, porém na condição do else os clones agem diferentes. Por tanto, podemos considerar como um clone não siginificativo. A quantidade de tokens são 16 e 17 e o tamanho é 64 e 73 respectivamente.
'
O clone de id 158 é um clone significativo. São as classes de “FotoServlet“ e
“PDFServlet”. O formato do documento é o que tem de diferente nas classes. Seu
tamanho é 117 e possui 19 tokens.
Clone de id 185 significativos . A função “addField” é idêntica nas 4 classes em que ela aparece. Seu tamanho é 92 e possui 20 tokens.
Clone 220 é significativo. O método “List<String> getElementsWithSplitAndTrim”é igual em tudo em todos os 2 arquivos em que aparece Seu tamanho é 59 e possui 19 tokens.
Clone 234 talves seja significativo, se o tipo da classe não fizer diferença para o procedimento que está sendo feito, podemos fazer uma melhora no código desses loops . Seu tamanho é 52 e possui 18 tokens.
Clone 235 não é significativo, Não vale a pena fazer mudanças.(IF else) Aparece em apenas um arquivo . Seu tamanho é 52 e possui 18 tokens.