Desenvolvimento
Programação Orientada a Aspectos
Um exemplo prático utilizando AspectJ
De que se trata o artigo
Apresenta fundamentos da programação orientada a aspectos, através do AspectJ, uma extensão da linguagem Java, exemplificando seu uso e seus principais componentes através de um estudo de caso.
Para que serve:
Demonstrar a utilização da orientação a aspectos em conjunto com conceitos de Orientação a Objetos (OO), permitindo a compreensão das estruturas básicas em AspectJ e sua relação com a linguagem Java.
Em que situação o tema é útil:
Na construção de sistemas complexos, criando alternativas através da separação de interesses, que permitam maior reusabilidade e manutenibilidade do software.
A Engenharia de Software busca o aperfeiçoamento dos produtos de software, através de técnicas e métodos para facilitar sua reutilização, manutenção e evolução. Dentre as diversas práticas de desenvolvimento sugeridas, uma das mais consolidadas e eficientes, é a divisão de um sistema em partes para compreensão das fronteiras que definem suas funções. Essa divisão pode ser conhecida também como separação de interesses (separation of concerns). O ideal nessa abordagem seria que toda parte relacionada a um interesse fosse transportada para uma localização física separada das demais, que se relacionam a outros interesses, facilitando seu estudo e compreensão.
O paradigma de orientação a objetos emprega a separação de interesses através dos objetos, seus estados e operações, visando a redução da complexidade no desenvolvimento de software e aumentando sua produtividade. Embora a Orientação a Objetos (OO) dê suporte a essa divisão, ela ainda não é totalmente contemplada, devido aos interesses sistêmicos não serem tratados da forma adequada e muitas vezes se encontrarem espalhados por todo o sistema. Interesses sistêmicos são requisitos que não se aplicam à lógica de negócios como, por exemplo, segurança, desempenho, persistência, integridade de dados e tratamento de erros, dentre outros. Em decorrência disso, os sistemas OO mais complexos tendem a ter forte acoplamento, fraca coesão e grande redundância, o que dificulta sua compreensão, manutenção, evolução e reutilização. Quando um interesse se espalha por todo o sistema e se mistura entre outras funcionalidades, é denominado de interesse transversal, ou crosscutting concern. Como exemplo de interesses transversais pode-se citar logging, segurança, tratamento de erros, persistência de dados ou autenticação, entre outros.
A Programação Orientada a Aspectos surge com uma boa proposta para solucionar esse problema, através do encapsulamento dos crosscutting concern em módulos separados do restante do código. Esses módulos são denominados aspectos. Dessa forma, ao invés dos interesses estarem espalhados pelo código do sistema, eles são combinados nos locais desejados (ver Figura 1). A idéia é permitir que os objetos tratem apenas dos interesses de negócio a que são destinados sem se importar com a forma com que os interesses sistêmicos serão tratados pelos aspectos. Por isso, o ideal é que um objeto não saiba da existência de um aspecto, sendo obrigação deste acessar e tratar os interesses sistêmicos de acordo com a necessidade de um objeto.
Figura 1. Diferença entre interesses transversais espalhados no sistema e a abordagem de modularização através dos aspectos.
Dentro desse contexto, este artigo tem por objetivo apresentar o desenvolvimento de sistemas utilizando AspectJ, uma extensão da linguagem Java, através da ferramenta AJDT – AspectJ Development Tool (ver seção Links) auxiliando na criação de aspectos que serão desenvolvidos através de um estudo de caso em Java, que permitirá ao leitor maior entendimento dos conceitos abordados. A plataforma utilizada para a realização do estudo de caso foi a IDE Eclipse. Para o entendimento da linguagem, faz-se necessário a compreensão dos conceitos básicos sobre o desenvolvimento orientado a aspectos, que serão explicados na seção seguinte.
Fundamentos básicos da Programação Orientada a Aspectos (POA)
Programação de Orientada a Aspectos (POA) foi criada para complementar a programação orientada a objetos através de novos conceitos e técnicas de modularização de código. Para isso, a programação orientada a aspectos envolve basicamente três etapas de desenvolvimento (ver Figura 2):
1. Decomposição aspectural (aspectual decomposition): nesta etapa, os interesses transversais são identificados e separados dos interesses de negócio;
2. Implementação de interesses (concern implementation): cada interesse identificado é programado separadamente, dando origem aos aspectos;
3. Recomposição aspectural (aspectual recomposition): após a implementação dos aspectos, é realizada a integração dos aspectos com os componentes desenvolvidos, através do combinador aspectural, ou aspect weaver.
Figura 2. Etapas do processo de desenvolvimento orientado a aspectos
Um programa desenvolvido utilizando-se a POA é composto pelos seguintes elementos:
1. Linguagem de componentes: responsável pela implementação dos interesses de negócio, sendo a linguagem base para a construção do sistema, não prevendo nada a respeito do que deve ser implementado na linguagem de aspectos.
2. Linguagem de aspectos: responsável pela implementação de estruturas que irão definir o comportamento de um aspecto e a forma como este será executado.
3. Combinador de aspectos (aspect weaver): semelhante a um compilador, porém não gera um programa compilado e sim, um novo código que combina os componentes escritos em linguagem de componentes com os escritos em linguagem de aspectos.
Introdução ao AspectJ
Para a implementação dos conceitos de POA, foi criada pela equipe da Xerox Parc, em 1997, o AspectJ (ver seção Links), que atua basicamente como uma extensão da linguagem Java. Além dos elementos oferecidos pela POO (Programação Orientada a Objetos) como classes, métodos e atributos, dentre outros, são acrescentados novos conceitos e construções ao AspectJ, apresentados a seguir:
Pontos de Junção ou Join Points: são pontos na execução do programa Java onde o aspecto será aplicado como, por exemplo, em chamadas de métodos, chamadas de construtores, execução de tratamento de exceções, pré-inicialização de objetos, dentre outros.
Pontos de Corte ou Pointcut: são construções que permitem indicar em que join points o aspecto irá interceptar a execução da aplicação. Ou seja, ele indica em que situações o aspecto entrará
...