Programação orientada a aspectos (POA) é um paradigma de programação de computadores que permite aos desenvolvedores de software separar e organizar o código de acordo com a sua importância para a aplicação [1]. A POA permite que esse código seja encapsulado e modularizado.
Os paradigmas de programação mais antigos, como a programação a procedural e programação orientada a objeto, implementam a separação do código por meio de entidades únicas. Por exemplo, a funcionalidade de log de dados, numa linguagem orientada a objetos, é implementada em uma única classe que é referenciada em todos os pontos onde é necessário fazer log de dados. Como praticamente todo método necessita que alguns dados sejam registrados em log as chamadas a essa classe são espalhadas por toda a aplicação.
Tipicamente uma implementação da POA busca encapsular essas chamadas por meio de uma nova construção chamada de “aspecto”. Um aspecto pode alterar o comportamento de um código (a parte do programa não orientada a aspectos) pela aplicação de um comportamento adicional, advice, sobre um “ponto de execução”, ou join point[2].
A POA apresenta técnicas de programação capazes de cobrir estas falhas. Ela permite aos programadores separar os interesses comuns do sistema (comportamentos que fogem a típica divisão de responsabilidade, como o logging, introduzindo o conceito de aspectos, os quais encapsulam comportamentos que afetam múltiplas classes [3].
Os pioneiros da programação orientada a aspectos chamam este tipo de comportamento de crosscutting porque ele atravessa a divisão de responsabilidades dos modelos de programação tradicionais[3].
Elementos do AspectJ
Pointcut: um ponto de corte (pointcut) é uma construção sintática do AspectJ para se agrupar a um conjunto de pontos de junção. Sua sintaxe básica está ilustrada na Figura 1.
public pointcut nome() : call (void Receita.print())
Onde:
- A primeira parte é a declaração de restrição de acesso - nesse caso, public, mas pointcuts podem ser private ou protected.
- A palavra-chave pointcut denota que se esta declarando um ponto de corte.
- Todo pointcut tem um nome qualquer, e pode receber parâmetros - nesse caso, o pointcut não recebe parâmetros.
- Depois dos dois pontos (
obrigatórios vem o tipo dos pontos de junção agrupados pelo pointcut - nesse caso tem-se um pointcut do tipo call, que indica uma chamada de método. - Finalmente, vem a assinatura do pointcut, uma especificação dos pontos de junção aos quais o pointcut se refere.
Figura 1 ? Exemplo de declaração de pointcut [3].
Joinpoints: Um ponto de junção é qualquer ponto identificável pelo AspectJ durante a execução de um programa. Aspectos podem ser associados a pontos de junção e executados antes, depois ou ao invés deles. Existem diversos pontos de junção reconhecidos pelo AspectJ[2]:
- Métodos: Existem dois tipos de pontos de junção relacionados a métodos: pontos de chamada de métodos e pontos de execução de métodos
? Chamada de métodos - São os pontos indicativos de onde, no código, o método é chamado.
? Execução de métodos - É o corpo dos métodos propriamente ditos.
-
Construtores: Assim como os métodos, construtores têm dois pontos de junção: um para as chamadas ao construtor e outro para a execução do construtor. Pontos de junção de chamada de construtores são encontrados em locais onde um objeto é instanciado com comandos new. Pontos de junção de execução de construtores é o próprio código do construtor.
-
Acesso a campos: Existe um ponto de junção em cada acesso aos dados de uma classe. Os pontos são divididos em pontos de leitura, onde o dado é usado, mas não modificado, e pontos de escrita, onde o dado é modificado.
É importante notar que só há pontos de junção em dados declarados no escopo da classe. Não há pontos de junção para variáveis locais a métodos. -
Tratamento de exceções: Um ponto de junção de tratamento de exceções é o interior de um bloco catch que ‘captura’ algum tipo de exceção.
-
Inicialização de classes: São pontos de junção que representam o instante em que uma classe é carregada na memória e seus dados estáticos são inicializados.
Há outros tipos de pontos de junção menos usados tais como: inicialização de objetos, pré-inicialização de objetos e execução de advice.
Advice: é uma estrutura que denota o que um aspecto deve fazer, ou seja, qual o comportamento do aspecto [3]. Em termos mais formais, o advice designa a semântica comportamental do aspecto. Todo advice está associado a um pointcut, que define pontos de junção. Há três tipos de advice:
- before: executa antes do ponto de junção
- after: executa depois do ponto de junção
- around: executa “em volta” do ponto de junção; esse tipo de advice serve para substituir a execução do ponto de junção pela execução do advice, ou executar parte do advice antes do ponto e junção e outra parte depois.
Todos os tipos de advice são definidos de forma semelhante conforme ilustra a Figura 2.
before(): // declaração do advice
ponto_de_corte() { // ponto de corte associado
System.out.println("teste"); // corpo do advice
System.out.println("tchau");
}
? Advice do tipo before: é o mais simples. Ele simplesmente executa antes do ponto de junção. O único detalhe a se observar é que se o advice levantar uma exceção, o ponto de junção não será executado.
? Advice do tipo after: O advice do tipo after executa após o ponto de junção. Existem três variacões desse advice, que dependem de como terminou a execução do ponto de junção: se terminou normalmente, com uma exceção, ou de qualquer forma.
? Advice do tipo around: O corpo de um advice around é executado substituindo o ponto de junção. No entanto, o ponto de junção pode ser executado de dentro do corpo do advice usando-se o comando proceed( ).
A chamada a proceed() retorna o mesmo tipo retornado pelo ponto de junção substituído. Além disso, se o ponto de junção é um método que espera receber argumentos, estes devem ser passados no proceed( ).
Referências
[1] Aspectos Treinamento e Consultoria em Engenharia de Software. Disponível em: <http://www.aspectos.org/courses/aulasaop >. Acessado: 10 ago. 2010.
[2] FRÖEHLICH. Antônio Augusto, VIEIRA. Fernanda Ariane Rangel, FONTANA. Heitor de Brito, BRAGA. Marcelo. PROGRAMAÇÃO ORIENTADA A ASPECTOS. Disponível em: http://www.lisha.ufsc.br/teaching/sce/ine5612-2001-2/work/aop.html. Acessado: 16 ago. 2010.
[3] LOUREIRO. João Manuel Bonita Pereira, COSTA. João Pedro Couto Soares Gonçalves da, FONSECA. Rosana Mendes Sequeira Baptista da, LOUREIRO. Vergílio Augusto Neves. Programação Orientada a Aspectos. Disponível em: http://paginas.fe.up.pt/~aaguiar/es/artigos%20finais/es_final_15.pdf. Acessado: 17 ago. 2010.
[4] Programação orientada a aspecto. Disponível em: http://pt.wikipedia.org/wiki/Programação_orientada_a_aspecto. Acessado: 15 ago. 2010.
[5] RECH. Marcelo Paes. POA com Spring. Disponível em: http://marcelorech.wordpress.com/category/java/spring-framework/. Acessado: 15 ago. 2010.
[6] Fonte: http://www.lisha.ufsc.br/teaching/sce/ine5612-2001-2/work/aop.html
Se alguem souber mais coisa fico grato em compartilhar