Resumo:
Técnicas de última geração e ferramentas automáticas de análise estática (ASATs) para identificar cheiros de código dependem de avaliação baseada em métricas. No entanto, a maioria dessas técnicas tem baixa precisão. Uma possível razão é que os elementos do código-fonte, como métodos implementados de acordo com diferentes decisões de design, são avaliados pelo mesmo limite genérico para cada métrica. Outra razão possível é que esses limites de métrica geralmente são derivados de classes orientadas por diferentes decisões de projeto. O uso de limites de métricas genéricas que não consideram o contexto de design de cada classe avaliada pode gerar muitos falsos positivos e falsos negativos para desenvolvedores de software. Nosso objetivo é propor técnicas sensíveis ao design para derivar limites de métricas contextuais. Nossa hipótese principal é que usar o papel de design desempenhado por cada classe de sistema para definir esse contexto pode apontar cheiros de código mais relevantes para desenvolvedores de software. Realizamos alguns estudos empíricos para definir as técnicas propostas. Primeiramente, realizamos uma pesquisa em larga escala que mostrou que os profissionais reconhecem dificuldades em encaixar ASATs no processo de desenvolvimento de software. Afirmam também que não há rotina para aplicação. Uma possível razão pela qual os profissionais reconhecem que a maioria dessas ferramentas usa um único limite de métrica, que pode não ser adequado para avaliar todas as classes do sistema. Em segundo lugar, realizamos um estudo empírico para investigar se as decisões de projeto refinadas também influenciam a distribuição de métricas de software e, portanto, devem ser consideradas para derivar limites de métricas. Nossas descobertas mostram que a distribuição de métricas é sensível às seguintes decisões de design: (i) função de design da classe (ii) bibliotecas usadas, (iii) estilo de codificação, (iv) tratamento de exceção e (v) código de registro e depuração mecanismos. Usamos essas descobertas para propor duas novas técnicas para derivar limites de métricas sensíveis ao design usando a função de design de classe como contexto. Em seguida, realizamos dois estudos empíricos de grande escala para avaliá-los. O primeiro estudo mostrou que nossas técnicas propostas melhoraram a precisão de acordo com as percepções dos desenvolvedores. Como é impossível e cansativo realizar uma avaliação completa da qualidade do código-fonte com os desenvolvedores, realizamos um segundo estudo minerando a evolução de projetos de software de domínios arquiteturais populares. Descobrimos que nossas técnicas melhoraram o recall para apontar métodos efetivamente refatorados durante a evolução do software.