5.1 Planejamento do Estudo de Caso
5.1.3 Procedimentos para a Coleta dos Dados
Para responder as questões de pesquisa, um conjunto de dados foi coletados das LPSs MobileMedia e Health Watcher. Os passos para a coleta foram os seguintes: i) Identificar e coletar code smells; ii) Identificar relações Inter-smell; iii) Medir e remover as ocorrências de Inter-smell; e iv) Analisar o impacto de ocorrências de Inter-smell na manutenibilidade da LPS.
i) Identificar e coletar code smells: os code smells das LPSs MobileMedia e Health Watcher foram identificados utilizando as ferramenta JDeodorant e PMD, essas ferramentas foram escolhidas pela disponibilidade e pela utilização em trabalhos anteriores para detecção de code smells (PAIVA1 et al., 2015),(SHEN; RUAN, 2008). Atualmente 4 code smells são
suportados pela ferramenta JDeodorant: Long Method, Feature Envy, God Class e Type Cheking (KAUR; SINGH, 2016). A ferramenta PMD foi utilizada para detectar o code smell Duplicated Code.
Foi realizado o levantamento e armazenamento do número total de code smells presentes em cada release das LPSs MobileMedia e Healt Watcher.
Figura 5 – Detecção de code smells na ferramenta JDeodorant
Fonte – Elaborado pelo Autor
A Figura 5 mostra o processo de detecção do code smell Long Method utilizando a ferramenta JDeodorant. Nesta Figura pode ser observado o critério de seleção da ferramenta para identificar esse code smell, que está dermarcado com a cor verde.
Para a identificação do code smell Duplicated Code foi utilizada a ferramenta PMD como um plugin do eclipse. A Figura 6 mostra a lista de classes com esse smell. Nesse caso foi selecionada a classe BaseController para verificação e como pode ser observado, a ferramenta seleciona o trecho de código que está duplicado.
Figura 6 – Detecção de Duplicated Code com a ferramenta PMD
Fonte – Elaborado pelo Autor
Após identificação dos code smells, deu-se o início do armazenamento dessas anomalias em planilhas. A Tabela 3 mostra o padrão ou representação utilizada para armazenamento das ocorrências individuais de code smells.
Tabela 3 – Padrão de armazenamento das ocorrências de code smell
Pacote Classe Método LM FE TC GC DC
pacote1 Classe1 metodo1() X
Após a detecção de ocorrências individuais de code smells, foi percebido que alguns code smells estavam “agrupados”, ou seja, em um primeiro caso foi encontrado que em um mesmo método existia a presença de mais de um code smell, e que em um segundo caso foi detectado a presença de outros code smells em uma God Class. A Tabela 4 mostra as duas situações na Classe2 e Classe3, respectivamente.
Tabela 4 – Padrão de armazenamento das co-ocorrências de code smell
Pacote Classe Método LM FE TC GC DC
pacote1 Classe1 metodo1() X
pacote1 Classe2 método2() X X
pacote1 Classe3 método3() X X
Desta forma, com os code smells e as co-ocorrências (Inter-smell) já detectadas, o processo para Identificação das relações Inter-smell pôde ter início.
ii) Identificar relações Inter-smell: após o procedimento de identificação de ocorrências individuais de code smell e das co-ocorrências desses code smells nas LPSs MobileMedia e Health Watcher, foram detectadas as relações Inter-smell dos 5 code smells, Duplicated Code (DC), God Class (GC), Long Method (LM), Feature Envy (FE) e Type Checking(TC). Os tipos de relacionamento são descritos na Seção 2.2.2. Para identificar as relações Inter-smells foram utilizadas as métricas definidas na Seção 2.2.3.
Figura 7 – Processo para identificar relações Inter-smell
Fonte – Elaborado pelo Autor
A Figura 7 mostra como foi o procedimento para identificação das relações Inter- smell. Esse processo foi feito totalmente de maneira manual, os cálculos e resultados obtidos foram armazenados em planilhas. Note que as co-ocorrências de code smells foram marcadas com cores para facilitar no processo de identificação, após isso, as métricas indiretas exist que é o número de ocorrências de um code smell e co-exist que é o número de co-ocorrências de um code smell(CS1) juntamente com outro code smell (CS2), foram armazenadas. Após o cálculo das métricas indiretas, foi utilizada a métrica exist − overlap(CS1,CS2) que é equivalente a métrica co-exist de um CS1 e CS2 dividido pelo exist do CS1. Como exemplo, note que o exist − overlap(TC,GC) é equivalente a 1/1 pois o co-exist(TC,GC) = 1 e o número de ocorrências de TC = 1. Perceba que o inverso também acontece, o exist − overlap(GC,TC) é equivalente a 1/1 pois o co-exist(GC,TC) = 1 e o número de ocorrências de GC = 1.
Após calcular o exist − overlap(CS1,CS2), as relações Inter-smell já podem ser identificadas a partir das seguintes regras:
• Mutual Support (A ↔ B) : se exist − overlap(A,B) ≈ exist − overlap(B,A) • Rejection (A 6⇒ B) : se co − exist(A,B) ≈ 0
• Inclusion (A ⇒ B) : se exist − overlap(A,B) ≈ 1
A relação Rejection é a mais fácil de ser identificada, como exemplo, na Figura 7 o code smellDC não possui nenhuma ocorrência individual, portanto nesse exemplo, ele também não terá co-ocorrências com outros code smells, e nesse caso, assume-se que o co-exist de (DC,GC) = 0, (DC,LM) = 0, (DC,TC) = 0 e (DC,FE) = 0.
iii) Medir e remover as ocorrências de Inter-smell: nesse procedimento foi mensurada a qualidade interna do código de cada classe das LPSs MobileMedia e Health Watchercontendo as relações Inter-smell, apenas essas classes tiveram as métricas coletadas. Para o processo de medição foi utilizada a ferramenta ckjm que implementa as métricas já conhecidas na literatura e que são descritas na Seção 2.3.
Figura 8 – Processo de medição e refatoração de Inter-smell
Fonte – Elaborado pelo Autor
A Figura 8 mostra o processo de medição e refatoração neste trabalho. Primeiramente foi utilizada a ferramenta ckjm para a medição das métricas descritas na seção 2.3, nessa primeira parte foram medidas todas as classes com co-ocorrências de code smells nas oito releases de MobileMedia e nas três releases de Health Watcher. Ou seja, a medição antes do processo de refatoração.
A Tabela 5 mostra como foram armazenadas as métricas de cada classe com co- ocorrências de code smells.
Tabela 5 – Exemplo de armazenamento das métricas
Pacote Classe WMC DIT NOC CBO RFC LCOM
pacote1 Classe1 20 1 0 21 142 0
pacote1 Classe2 2 0 0 14 24 1
pacote1 Classe3 6 1 0 7 25 0
Após esse processo inicial de medição, deu-se início ao processo de refatoração das co-ocorrências, ou seja, todas as classes e métodos que possuíam co-ocorrências foram refatoradas de modo que apenas um code smell individual continuasse. Na Tabela 6 pode ser observado um exemplo hipotético de co-ocorrências de code smells antes do processo de refatoração.
Tabela 6 – Co-ocorrências de code smells antes da refatoração
Pacote Classe Método LM FE TC GC DC
pacote1 Classe1 metodo1() X X
pacote1 Classe2 método2() X X
pacote1 Classe3 método3() X X
O resultado do processo de refatoração das co-ocorrências pode ser visualizado na Tabela 7.
Tabela 7 – Resultado após o processo de refatoração
Pacote Classe Método LM FE TC GC DC
pacote1 Classe1 metodo1() X
pacote1 Classe2 método2() X
pacote1 Classe3 método3() X
Como pode ser visualizado na Tabela 7, foi eliminado pelo menos um code smell para descaracterizar a co-ocorrência. Não existiu critério na escolha do code smell a ser removido, o objetivo neste passo era apenas descaracterizar a co-ocorrência na classe ou no método.
Como pode ser observado na Figura 8, após a refatoração das co-ocorrências, a etapa de medição foi realizada novamente nas classes que tiveram co-ocorrências removidas seguindo o mesmo padrão da Tabela 5.
iv) Analisar o impacto de ocorrências de Inter-smell na manutenibilidade da LPS: a Figura 9 mostra o processo de comparação após o processo de refatoração. Todas as releasesforam comparadas, por exemplo, a release 1 original de MobileMedia foi comparada com a release 1 refatorada de MobileMedia e esse processo continuou para as sete releases
restantes de MobileMedia. O processo foi igual para Health Watcher, as três releases originais foram comparadas com as três refatoradas.
Figura 9 – Processo de Comparação da releases das LPSs
Fonte – Elaborado pelo Autor
A comparação foi realizada através dos resultados das métricas de qualidade, e foi feita a comparação apenas nas classes que tinham co-ocorrências de code smells. Para avaliar a manutenibilidade das LPSs a partir dos valores das métricas, este trabalho utiliza a mesma abordagem de Tarwani e Chug (2016), na qual os autores utilizam o somatório de todas as métricas para medir e comparar a manutenibilidade, quanto menor o valor do somatório, maior a manutenibilidade. Assim, este trabalho conseguiu avaliar se a presença dessas co-ocorrências ou Inter-smellprejudicaram a qualidade e a manutenibilidade do código dessas duas LPSs orientada a objetos.