EH-Meter – Uma Ferramenta para Coleta de Métricas de
Tratamento de Exceções
Júlio César Taveira1, Fernando Castor2, Sergio Soares1,2
1
Departamento de Sistemas e Computação – Universidade de Pernambuco (UPE)
Recife – PE – Brasil
2
Centro de Informática – Universidade Federal de Pernambuco (UFPE)
Recife – PE – Brasil
{jcft2, scbs}@dsc.upe.br, [email protected]
Resumo
A maioria das ferramentas de coleta de métricas existentes não contemplam
linguagens de programação orientadas a aspectos e adicionalmente,
implementam métricas genéricas, nem sempre ideais para avaliar atributos de
qualidade relativos a interesses específicos do sistema. Este trabalho
apresenta uma ferramenta que coleta métricas referentes ao interesse de
tratamento de exceções em sistemas escritos nas linguagens Java e AspectJ. A
ferramenta proposta foi utilizada na coleta de métricas em vários sistemas
escritos nessas duas linguagens.
Abstract
Most of the existing metrics collection tools do not cover aspect-oriented
programming languages. In addition, these tools implement generic metrics,
not always appropriate to evaluate quality attributes pertaining to specific
system concerns. This work presents a metrics collection tools specifically
targeting the exception handling concern and capable of working with both
Java and AspectJ programs. The proposed tool was employed to measure a
number of software systems written in both languages.
1. Introdução
Métricas estáticas de código são amplamente utilizadas para avaliar atributos de
qualidade de sistemas de software [Sommerville 2007]. Métricas de código podem
fornecer desde informações básicas, como número de linhas de código e de módulos no
sistema, até informações mais refinadas como as dependências entre os elementos do
sistema e o quão focados esses elementos são [Ceccato e Tonella 2004, Eaddy et al.
2007]. Idealmente, métricas de código devem ser coletadas de maneira automática, a
fim de acelerar o processo de medição, evitar os erros inerentes à coleta manual e
garantir a uniformidade dos resultados, tornando possível a realização de comparações.
Existem diversas ferramentas capazes de coletar métricas estáticas de código a partir de
programas escritos em diferentes linguagens de programação. Por exemplo, Metrics1 e
FindBugs2 coletam diversas métricas a partir de programas escritos em Java.
Apesar da crescente popularidade da programação orientada a aspectos (POA)
[Kiczales et al. 1997], há poucas ferramentas de coleta de métricas capazes de medir
programas escritos em linguagens de POA. Um exemplo de tais ferramentas é o
AOPMetrics3, que coleta métricas de programas em AspectJ [Laddad 2003], uma
extensão orientada a aspectos da linguagem Java. Para que POA possa se consolidar
como o próximo passo na evolução das linguagens de programação, essa técnica precisa
ser avaliada exaustivamente, idealmente tanto qualitativa quanto quantitativamente.
Até onde foi possível averiguar, todas as ferramentas de coleta de métricas
existentes trabalham com métricas gerais, aplicáveis a todos os interesses (do inglês:
concerns) de um sistema. Consequentemente, não é possível avaliar alguns atributos de
qualidade no contexto de interesses específicos. Entretanto, alguns autores [Castor et al.
2009, Eaddy et al. 2008, Couto et al., 2009] acreditam que, para avaliar o impacto de
novas abordagens de desenvolvimento, como POA, em atributos de qualidade como
reuso, métricas focadas em interesses específicos são mais eficazes do que as
independentes de interesse. Utilizar apenas métricas que se aplicam ao sistema como um
todo, sem levar em conta os interesses que o compõem, pode fazer com que a avaliação
de tais abordagens não reflita adequadamente seus benefícios e limitações.
Este trabalho propõe uma ferramenta de coleta de métricas que visa preencher
parcialmente essa lacuna. A ferramenta proposta, chamada de EH-Meter, é capaz de
coletar 11 métricas descritas em diferentes trabalhos na literatura [Eaddy et al. 2007,
Sant’Anna et al. 2003] a partir de programas escritos em Java ou AspectJ. Dez dessas
métricas lidam com um interesse específico, tratamento de exceções. O interesse de
tratamento de exceções foi escolhido por dois motivos: (i) é o alvo de vários trabalhos
realizados pelos autores no passado; e (ii) é um interesse demarcado sintaticamente no
código do programa, o que evita dificuldades ligadas à mineração de interesses
[Robillard e Murphy 2002] e permite que o foco se mantenha na atividade de medição.
2. Funcionalidades
Nessa seção são descritas as métricas que foram implementadas e maneira como o EHMeter pode ser utilizado na prática.
Métricas Implementadas. O EH-Meter é capaz de colher diversas métricas relativas ao
interesse de tratamento de exceções. As métricas escolhidas são divididas em dois
grupos: métricas de tamanho e métricas de interesses. O primeiro grupo engloba
diversas métricas que visam determinar a quantidade de código em um sistema relativa
ao interesse de tratamento de exceções. Para tanto, inclui desde métricas tradicionais,
como numero de linhas de código (tanto total quanto especificamente de tratamento de
exceções) e outras menos comuns, como números de blocos catch e finally. Essas
métricas são apresentadas e descritas na parte superior da tabela Tabela 1. Para as
métricas NOT, NOC e NOF, caso o bloco try (catch, finally) apareça dentro de
outro bloco catch ou finally (mas não try), ele não é levado em conta. A
1
http://metrics.sourceforge.net/
2
http://findbugs.sourceforge.net/
3
http://aopmetrics.tigris.org/
justificativa para isso é que, para fins de separação de interesses, tal bloco não precisaria
ser separado pois não está misturado a outros interesses.
O outro grupo de métricas, relativas a separação de interesses, tem o intuito de
medir o quanto o código está direcionado aos interesses analisados, que no caso desse
trabalho é o tratamento de exceções, e separado do código relativo aos outros interesses
do sistema. Essas métricas são também apresentadas na Tabela 1, na parte inferior. As
três primeiras delas mostram valores absolutos, para os valores coletados. As duas
últimas métricas relativas a interesses contabilizam de forma normalizadas os valores
apresentados. Para todas as métricas, um valor menor implica em um resultado melhor.
Execução e Resultados da Ferramenta. Do mesmo modo que a ferramenta
AopMetrics, a ferramenta EH-Meter também funciona através de tasks do Apache Ant4.
Através de um arquivo de configurações XML é especificado quais serão os programas
Java que a ferramenta vai analisar, quais as bibliotecas que devem ser utilizadas como
referência, versão da linguagem e o nome do arquivo de saída. Arquivo de saída
produzido pela ferramenta é uma planilha eletrônica no padrão do Microsoft Excel. Essa
planilha contém, para cada componente do sistema, o valor de cada uma das métricas,
descritas na Seção 2.1. Apenas a métrica DOS depende do sistema completo.
3. Implementação
O EH-Meter é uma extensão da ferramenta AopMetrics. Para facilitar a implementação
do EH-Meter, recursos como os parsers para Java e AspectJ o engenho de coleta de
métricas do AopMetrics foram utilizados. Para a maior parte das métricas, foi necessário
apenas implementar as classes responsáveis pelas novas métricas. Algumas delas,
porém, exigem que a medição seja feita de um modo diferente do que tradicionalmente
acontece no AopMetrics, levando em conta o sistema como um todo. Para estes casos,
foi necessário modificar o engenho de medição do AopMetrics.
Arquitetura e Modificações no Código Original. A arquitetura da ferramenta é
simples, dividida em módulos (pacotes) com propósitos bem definidos. No pacote
principal se encontram o código responsável por receber entradas do usuário para
execução da ferramenta e outros recursos comuns a toda a ferramenta, como o engenho
de coleta de métricas. Em outros pacotes, source e ajdt, são encontrados elementos
que fazem referência a um projeto Java e AspectJ e transformações necessárias,
respectivamente. O pacote metrics contém as classes que implementam as métricas a
serem coletadas. A maior parte das alterações aplicadas ao AopMetrics resultaram em
novas classes sendo incluídas neste pacote. Os últimos pacotes, export e results,
contém o código responsável por exportar os resultados da medição para planilhas em
formato XLS e como são as saídas das métricas. A Figura 1 mostra as dependências
entre os pacotes do sistema.
4
http://ant.apache.org/
Tabela 1. Resumo das métricas, grupos e respectivas descrições.
Group
Métricas
de
Tamanho
Metric
Description
LOCC
Lines of Common Code: Linhas de código do sistema, excluindo-se comentários e linhas em
branco.
NOT
Number of Try blocks: Número de blocos try.
NOC
Number of Catch blocks: Número de blocos catch.
NOF
Number of Finally blocks: Número de blocos finally.
LOCEH
Métricas
de
Interesse
s
Lines of Exception Handling Code: Linhas de código relativo ao o tratamento de exceções.
NEH
Number of Exception Handlers: Número de blocos de código relativo ao tratamento de
exceções.
CDC
Concern Diffusion over Component [Sant’Anna et al 2003]: Conta o número de componentes
(classes, aspectos, interfaces) que incluem código de tratamento de exceções.
CDO
Concern Diffusion over Operation [Sant’Anna et al 2003]: Conta o número de operações
(métodos, advices) que incluem código de tratamento de exceções.
CDLOC
LOF
DOS
Concern Diffusion over Lines of Code [Sant’Anna et al 2003]: Conta o número de pontos de
transição para cada interesse através das linhas de códigos. O uso dessa métrica necessita do
processo de sombreamento dentro do código, com áreas sombreadas e áreas não-sombreadas.
Lack of Focus: Essa é a medição da perda de foco de cada componente, para todos os interesses.
O resultado é normalizado entre 0 (completamento focado) e 1 (completamente sem foco). O
resultado dessa métrica é obtido a partir do valor da métrica DOF (Degree of Focus) [Eaddy et
al. 2007]. LOF = 1 – DOF
Degree of scattering [Eaddy et al. 2007]: Essa métrica mede a variação de concentração de um
interesse por todos os componentes. O resultado é normalizado entre 0 (completamento
localizado) e 1 (completamente distribuído).
A primeira modificação para dar suporte às novas métricas diz respeito a como é
calculado o valor para cada uma. Normalmente, as medições são executadas
individualmente para cada componente (classe, interface e aspecto). Assim, cada
métrica é executada uma vez para cada componente, retorna o valor resultante e a
execução prossegue para o próximo componente, sem um valor intervir no outro. A
métrica DOS, porém, é calculada para todos os componentes do sistema. Logo, foi
necessário levar em conta os valores relativos a cada componente do sistema para poder
fazer o calculo da métrica. Esse comportamento precisou ser incorporado ao engenho de
coleta do AopMetrics, já que este é construído partindo da suposição de que todas as
métricas podem ser coletadas de forma independente, para cada componente.
A segunda modificação diz respeito à listagem de todas as métricas. A classe
Metrics contém todas as métricas que devem ser coletadas. Para o EH-Meter, foram
adicionadas as novas métricas implementadas e suas respectivas strings de
identificação. Ponto comum entre todas as métricas as métricas é a interface
MetricsCalculator. Entretanto, essa interface é aplicável apenas para métricas que
não precisam ser coletadas globalmente. Logo, a ultima modificação consistiu na
criação de uma interface para abranger as métricas que sejam calculadas utilizando
dados
de
todo
o
sistema.
Essa
interface
foi
denominada
de
MetricsCalculatorGeneral e pode ser usada na implementação de novas métricas
com essa característica.
Novas Métricas. Para as novas métricas implementadas na maioria dos casos foi
extendida a classe ASTVisitor, para detectar ocorrências de trechos de código
relativos ao tratamento de exceções. Esses trechos de código na maioria dos casos foram
ocorrências de blocos try (catch, finally), declarações de método e blocos de
código. Para as métricas de tamanho (mostradas na Tabela 1), os resultados foram são
obtidos apenas através da contagem das ocorrências do pedaço de código desejado. Para
métricas de interesses, interfaces não foram consideradas por não incluírem
comportamento, sendo apenas analisadas classes e aspectos. CDC e CDO foram bem
simples, bastando apenas marcar para cada componente e operação, respectivamente, a
existência de haver códigos tratadores de exceções. Para LOF (medida utilizando DOF)
e DOS, apenas foi necessário utilizar informações de outras métricas e trabalhar
corretamente com os valores.
A Métrica CDLOC é a que apresenta a implementação mais complexa. Em
todos os trabalhos anteriores dos quais temos conhecimento [Castor Filho et al. 2006,
Castor et al. 2009, Garcia et al. 2005, Sant'Anna et al. 2003], essa métrica foi coletada
manualmente. A Figura 2 mostra um exemplo de como é diferenciado as áreas de
transições entre o interesse do tratamento de exceção (fundo amarelo) e o interesse de
comportamento normal do sistema (fundo branco). Na implementação, foi necessário
detectar e marcar essas áreas, a fim de calcular as transições. Para essa métrica, têm que
ser levados em conta diversos casos de transição entre o código referente ao tratamento
de exceções e o código relativo ao comportamento normal do sistema.
public static void example() {
System.out.println("Starting!");
try{
...//Código que pode levantar exceção
}catch (Exception e){
...//Código que trata a exceção;
}
System.out.println("Step 1 end!");
try{
...//Código que pode levantar exceção
}catch (Exception e2){
...//Código que trata a exceção;
}
}
Figura 1. Diagrama de Interação
entre pacotes.
Figura 2. Exemplo de código com
suas transições.
4. Um Estudo de Caso
Atualmente, está sendo conduzido um estudo com o objetivo de identificar o efeito da
modularização de tratamento de exceções usando POA no reuso do código desse
interesse. Neste novo estudo, o EH-Meter é usado em todas as atividades de medição.
Foram utilizados três sistemas, em versões Java e AspectJ, com diferentes
características. No total, as medições foram aplicadas a nove versões distintas, 3 em
AspectJ e 6 em Java. Enquanto a medição manual feita por dois desenvolvedores durou
cerca de 16 horas para apenas uma das versões, a ferramenta coletou as informações em
menos de um minuto. Além disso, a ferramenta foi empregada diversas vezes para
refazer as medições de forma rápida. Adicionalmente, a contagem manual apresentou
problemas de uniformidade que não ocorreram com a ferramenta.
O emprego de métricas centradas em um interesse ressaltou que POA de fato
promove o reuso de tratadores de exceções. Também deixou claro que o código de
tratamento de exceções cresce de maneira não desprezível quando extraído para
aspectos em um sistema não-trivial. A combinação dessas duas descobertas
complementa estudos anteriores [Castor Filho et al. 2006, Lippert e Lopes 2000] sobre
POA e tratamento de exceções. Mais informações sobre esse estudo podem ser obtidas
em outro trabalho [Taveira et al. 2009].
5. Conclusão
Neste trabalho foi apresentada a ferramenta EH-Meter, que implementa métricas
específicas de tratamento de exceções. Foram descritas as métricas implementadas pela
ferramenta, bem como sua arquitetura e as principais escolhas de projeto envolvidas no
seu desenvolvimento. O EH-Meter é capaz de coletar métricas tanto a partir de
programas escritos em Java quanto de programas em AspectJ. Até onde pudemos
averiguar, o EH-Meter é a primeira ferramenta capaz de coletar métricas para um
interesse específico de forma completamente automática.
No Endereço, http://www.dsc.upe.br/~jcft2/eh-meter, a ferramenta EH-Meter
está disponível. No mesmo endereço também está disponível o código fonte e também
outras informações. A licença do EH-Meter é a GPL.
Referências
Castor Filho, F. et al. (2006), “Exceptions and aspects: The devil is in the details”, In:
14th SIGSOFT FSE, pages 152–162.
Castor, F. et al. (2009), “On the Modularization and Reuse of Exception Handling with
Aspects”. Submitted to Software – Practice & Experience.
Ceccato, M. and Tonella P. (2004), “Measuring the Effects of Software Aspectization”,
In: 1st Workshop on Aspect Reverse Engineering (WARE 2004).
Couto, C. F. M. et al. (2009), “Estimativa de Métricas de Separação de Interesses em
Processos de Refatoração para Extração de Aspectos.”, In: VI Workshop de
Manutenção de Software Moderna, Ouro Preto. p. 1-8
Eaddy, M., Aho, A., Murphy, G. C. (2007), “Identifying, Assigning, and Quantifying
Crosscutting Concerns”, In: Proceedings of the 1st ACoM Workshop.
Eaddy, M. et al. (2008), “Do Crosscutting Concerns Cause Defects?”, In: IEEE
Transactions on Software Engineering (34):July 2008, pp. 497-515.
Garcia, A. et al. (2005), “Modularizing Design Patterns with Aspects: A Quantitative
Study”, In: 4th AOSD.
Kickzales, G. et al. (1997), “Aspect-Oriented Programming”, In: 11th ECOOP.
Laddad, R. (2003), “AspectJ in Action”, 1st ed., Manning.
Lippert, M.;Lopes, C. (2000), “A study on exception detection and handling using
aspect-oriented programming”, In: Proceedings of the 22nd ICSE, pages 418-427.
Robillard, M. P.; Murphy, G. C. (2002), “Concern graphs: finding and describing
concerns using structural program dependencies”, In: Proc. of the 24th ICSE.
Sant'Anna, C. et al. (2003), “On the Reuse and Maintenance of Aspect-Oriented
Software: An Assessment Framework”, In: XVII SBES, Manaus, Brazil.
Sommerville, I. (2007), “Software Engineering”, 8th ed., Addison-Wesley.
Taveira, J. C. et al. (2009) “Assessing Intra-Application Exception Handling Reuse with
Aspects”. Submitted to SBES'2009.
Download

Artigo 06