Programação orientada a aspectos (POA)

1 resposta
N

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:

  1. A primeira parte é a declaração de restrição de acesso - nesse caso, public, mas pointcuts podem ser private ou protected.
  2. A palavra-chave pointcut denota que se esta declarando um ponto de corte.
  3. Todo pointcut tem um nome qualquer, e pode receber parâmetros - nesse caso, o pointcut não recebe parâmetros.
  4. Depois dos dois pontos (:slight_smile: 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.
  5. 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]:

  1. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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:

  1. before: executa antes do ponto de junção
  2. after: executa depois do ponto de junção
  3. 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

1 Resposta

R

http://www.javaframework.org/portal/2010/04/14/o-que-programao-orientada-a-aspectos/

Criado 29 de maio de 2011
Ultima resposta 1 de jun. de 2011
Respostas 1
Participantes 2