• Nenhum resultado encontrado

3.3 Técnicas de Apoio ao Processo

3.3.2 Agrupamentos de Elementos

Os clusters representam agrupamentos lógicos de unidades físicas de programas (como processos, arquivos, pacotes, classes, funções, variáveis etc), representando módulos ou subsistemas da aplicação. A técnica de agrupamento de elementos (clustering) é essencial ao processo de recuperação de arquitetura, pois é através dos agrupamentos que se formam as abstrações no modelo e se chega a uma representação do software em nível arquitetural.

Mecanismos de agrupamentos de elementos vêm sendo empregados há anos pela comunidade de engenharia reversa para a recuperação de estruturas modulares de sistemas legados. O problema é complexo, envolvendo o particionamento do sistema em conjuntos disjuntos de entidades. Modelos estáticos de um software são na realidade grafos completamente conectados, e encontrar partições significativas sobre estes grafos não é uma tarefa simples.

Em (ANQUETIL e LETHBRIDGE, 2003), é apresentado um estudo comparativo de algoritmos de clustering para a remodularização de software. Os autores expõem a problemática envolvida e a abrangência do tema, apontando questões que devem ser consideradas para a adoção de um mecanismo de agrupamento adequado, como: a seleção de métricas de acoplamento e de um algoritmo de clustering adequados ao problema. As métricas de acoplamento representam um papel fundamental na técnica de clustering. É através destas que um algoritmo de agrupamento pode decidir em que grupos as entidades do software devem ficar. ANQUETIL e LETHBRIDGE (2003) apresentam dois tipos de métricas de acoplamento: métricas baseadas na ligação direta entre as entidades do código fonte e métricas baseadas nas similaridades entre elas. Ligação direta é determinada pelas dependências entre duas entidades e similaridade pelas características em comum que estas possuem, sendo que características, neste caso, podem envolver: acesso a variáveis, chamada de procedimento, nomenclaturas utilizadas etc.

Com relação aos algoritmos, diversas propostas se apresentam na literatura. A seleção de um algoritmo de agrupamento adequado ao problema é importante, pois a qualidade da modularização recuperada depende não só das métricas, mas também do algoritmo de agrupamento selecionado. Os algoritmos propostos na área de engenharia reversa prevêem a extração automática dos módulos de uma aplicação. Porém, mecanismos semi-automatizados de agrupamentos, nos quais o desenvolvedor interfere nas tomadas de decisão, também são possíveis.

Como exemplo de clustering automático, podem ser citados os mecanismos para colapso dos nós de um grafo, com base na análise das propriedades dos seus relacionamentos (DI LUCCA et al., 1994). Relacionamentos recursivos entre os nós, como o que pode ser observado entre os nós 2, 3 e 4 da figura 7 e os de dominância forte, indicam oportunidades de agrupamentos. A dominância forte e direta entre nós se dá quando um nó

A apresenta uma dependência para um nó B, sendo A o único caminho para se chegar ao nó B. Neste tipo de relacionamento, a dependência no sentido contrário não ocorre. Este exemplo de relacionamento pode ser observado entre os nós 9 e o 10, 11 e 12 da figura 7.

Figura 7. Grafo Direcionado de Chamadas.

Os algoritmos de clustering de hill-climbing e genéticos também geram, automaticamente, partições do sistema sobre um grafo de chamadas direcionado. MANCORIDIS et al. (1998) aplicam estes algoritmos, juntamente com métricas de inter- conectividade (acoplamento entre módulos) e de intra-conectividade (coesão nos módulos), para resgatar uma estrutura modular de sistemas legados. Os algoritmos analisam o sistema, buscando minimizar a diferença entre a média de inter-conectividade e intra-conectividade nos particionamentos gerados. O objetivo é buscar um particionamento com o valor mais alto possível de diferença, resultando em módulos altamente coesos e fracamente acoplados.

Conforme afirmam ANQUETIL e LETHBRIDGE (2003), os algoritmos de clustering propostos na engenharia reversa visam a recuperação de uma estrutura modular possível para o software, não apresentando o compromisso de descobrir a arquitetura da aplicação. Estes algoritmos impõem uma estrutura sobre o conjunto de entidades do software, não se preocupando em resgatar decisões passadas de projeto ou inferir conceitos a partir do código. Portanto, na área de recuperação de arquitetura, mecanismos automatizados de agrupamento não são adequados, sendo priorizados, neste caso,

1 9 8 10 2 3 6 5 11 12 4

mecanismos semi-automatizados, os quais serão abordados nas abordagens de recuperação de arquitetura apresentadas no capítulo 4.

3.3.2.1 Utilização de Métricas para o Agrupamento de Classes

Métricas são necessárias nos algoritmos de clustering para apoiar a tomada de decisão sobre a distribuição das entidades do software em módulos. Os algoritmos de clustering trabalham com métricas de acoplamento e de similaridade entre as entidades do software. Neste trabalho, são abordados sistemas orientados a objetos (OO) e, portanto, são investigadas métricas que se aplicam a este tipo de sistema.

O acoplamento estático entre classes, na visão de CHIDAMBER e KEMERER (1994), ocorre quando objetos de uma classe atuam sobre objetos de outra classe. Por atuar, entenda-se que métodos de uma classe referenciam métodos ou variáveis de instância da outra classe. Esta é a definição dos autores para a métrica CBO (acoplamento entre objetos de classes), a qual é medida verificando-se o número de classes às quais uma classe X está acoplada no sistema. LORENZ e KIDD (1994), por sua vez, alegam que as conexões entre classes são formas de acoplamento e que se pode medir a quantidade de acoplamentos entre classes por meio do número de conexões entre elas. Embora CHIDAMBER e KEMERER (1994) estabeleçam, assim como LORENZ e KIDD (1994), a necessidade de verificar as conexões entre classes para medir o acoplamento, eles não contabilizam o número de acessos entre as classes nesta medição, apenas contabilizam o relacionamento estabelecido entre as classes. Neste trabalho, concordamos com a visão de LORENZ e KIDD (1994), entendendo que a contagem do número de conexões entre classes é importante para medir o seu acoplamento.

Porém, a contagem de conexões estaticamente pode sofrer alguns problemas em função do polimorfismo em sistemas OO. Métodos polimórficos não demonstram, estaticamente, o tipo do objeto destino de uma chamada. A utilização de métricas dinâmicas ajuda a solucionar este problema.

Contribuindo com a discussão sobre métricas de acoplamento, HITZ e MONTAZERI (1996) alegam que não se pode medir todo o acoplamento gerado por conexões entre classes da mesma forma, uma vez que existem atributos do software que influenciam na medida de acoplamento. Como exemplos de atributos, temos: as estruturas iterativas, ou seja, chamadas de métodos em loops; o número de parâmetros nas chamadas

de métodos; o tipo de relacionamento entre as classes (agregação, herança etc.); a diferenciação do peso entre conexões por acesso a variáveis de instância e por chamadas de métodos; a diferenciação entre os acessos a variáveis de instância de classes estrangeiras e os acessos a variáveis de instância de superclasses, dentre outras. Atributos que influenciam na medição do acoplamento entre classes de software OO pretendem ser investigadas neste trabalho.

Um outro aspecto a ser considerado, no que tange às métricas de acoplamento de software OO, é a diferenciação que vem sendo feita na literatura entre métricas estáticas e dinâmicas. Em (CHO et al., 1998), os autores consideram que as métricas estáticas podem ser medidas em nível de classe e as métricas dinâmicas somente em nível de objeto. Em (EMAM, 2001), uma definição mais precisa para métricas dinâmicas é apresentada, onde o autor afirma que métricas estáticas podem ser computadas pela análise do código fonte ou do projeto, ao passo que métricas dinâmicas requerem a execução do programa para serem coletadas.

Métricas de acoplamento dinâmicas levam em conta o volume de mensagens trocadas entre os objetos das classes durante a execução do software. Devem ser extraídas, portanto, dos rastros de eventos coletados do sistema. Algumas métricas dinâmicas para software OO vêm sendo propostas na literatura (YACOUB et al., 1999) (CHO et al., 1998) (ARISHOLM, 2002).

Neste trabalho, conforme será explorado na seção 5.2.5.1, a proposta é combinar valores de métricas de acoplamento estáticas e dinâmicas para apoiar a reconstrução da arquitetura. Acreditamos que estas métricas se complementem em uma medida mais efetiva do acoplamento entre classes. Além disso, as métricas dinâmicas para sistemas OO foram menos experimentadas até o momento do que as métricas estáticas. A sua utilização, nesta proposta, pretende oferecer contribuições na avaliação da aplicabilidade prática deste tipo de métrica para a medição do acoplamento entre classes em sistemas OO.

Como observação final em relação à utilização de métricas, convém ressaltar que o acoplamento entre classes e entre objetos deve sempre ser analisado nos dois sentidos: da classe/objeto A para o B e vice-versa.

Documentos relacionados