O que é Programação Orientada a Aspectos?

Posted on 14 April 2010

Esse foi um trabalho apresendado por Rógel Garcia a disciplina de Desenvolvimento de Sistemas Distribuídos 2, do Curso de Ciência da Computação – 8o. período, da Universidade FUMEC – FACE, sob orientação do professor Flávio Lapper no ano de 2005. O intuito do trabalho é conheçer o paradgma de programação orientado a aspectos ou AOP.


1 Orientação a Aspectos

 

Todas as aplicações possuem diversas funcionalidades, algumas fazem parte do núcleo (primárias) e outras dão suporte as funcionalidades presentes no núcleo e geralmente se repetem em diversos módulos (secundárias). Em uma aplicação comercial as funcionalidades do núcleo são as regras de negócios e as secundárias são, por exemplo, logging e autorização. A programação orientada a objetos é a metodologia de programação mais utilizado para implementar funcionalidades primárias, mas ela não é suficiente para cobrir as funcionalidades secundárias, especialmente em aplicações complexas. Essas funcionalidades secundárias são definidas pelo termo crosscuting concerns. A orientação a objetos cria um acoplamento entre funcionalidades principais e os crosscuting concerns que não é desejado, uma vez que a adição ou modificação dessas funcionalidades secundárias implicam em mudanças no núcleo da aplicação.

image

O acoplamento da regra de negócios com as funcionalidades secundárias, implica em mudanças no núcleo caso ocorra alguma alteração nas funcionalidades secundárias

AOP é uma nova metodologia que provê a separação dos crosscuting concerns introduzindo uma nova unidade de modularização, o aspecto. Com AOP você implementa os crosscuting concerns em aspectos ao invés de mesclá-los nos módulos principais. Os módulos principais e os secundários são implementados separadamente. Um compilador especial monta o sistema final combinando os módulos principais e os secundários num processo chamado weaving (tecelagem), daí dá-se o nome de weaver (tecelão) ao compilador. O resultado é que a AOP modulariza as funcionalidades secundárias, possibilitando a criação de um sistema que é mais fácil de implementar e manter.

image
image

Diferença na construção dos módulos entre Orientação a Objetos e Orientação a Aspectos

A separação dos módulos ainda possibilita a reutilização dos módulos secundários em vários módulos principais. Os módulos secundários são escritos apenas uma vez, e mesclado quantas vezes for necessário nos módulos principais. Isso sem nenhuma alteração no núcleo da aplicação.

Existem várias implementações de AOP para várias linguagens de programação, inclusive em Java. AspectJ é a implementação AOP para Java mais utilizada e que tem mais suporte, por isso utilizaremos ela nesse trabalho, além disso a sintaxe estendida do AspectJ o torna uma das implementações AOP mais poderosas que existe.


2 Elementos da Orientação a Aspectos

 

Assim como na Orientação a objetos, a Orientação a Aspectos possui os seus próprios conceitos.

Crosscuting concern

Crosscuting concern é o termo que define partes do sistema que são aplicaveis em vários locais. Autenticação é uma funcionalidade que aperece em vários módulos do sistema, logo, autenticação é um crosscuting concern. Crosscuting também é o termo dado ao processo de adicionar código extra a um determinado módulo.

Weaving

Processo onde é feita a mesclagem dos módulos do sistema de acordo com os aspectos encontrados. O weaving é como uma outra etapa da compilação. Weaving rules são as regras que devem ser aplicadas durante essa fase da compilação.

Join point

Um join point (ponto de mesclagem) é um ponto identificável do fluxo de um programa. Pode ser uma chamada de método ou a configuração do valor de uma variável. Variadas implementações da orientação a aspectos suportam variados tipos de join point.

Pointcut

Um pointcut é uma construção que seleciona join points. Depois de capturar um join point é possível especificar as regras de weaving nesses join points, como executar determinada ação antes ou depois da execução desse join point. Um pointcut pode selecionar um join point que é uma chamada para um método por exemplo. Pointcuts especificam as regras de mesclagem (onde devem ser feitas as mesclagens), e join points são as situações que satisfazem essas regras. Podemos criar um pointcut para todos os métodos chamados checar, o pointcut definiu a regra: métodos chamados checar. Cada método chamado checar será um join point desse pointcut.

pointcut hello() : execution (* Hello.*(..));

Advice

Um advice é o código a ser executado em um join point que foi selecionado por um pointcut. Um advice pode ser executado antes, depois ou em volta de um join point. Um pointcut selecionará os join points e o advice contém o código que será executado em cada join point.

after() : hello() {

        System.out.println("Hello Aspect");

}

Introduction

Introductions são instruções que modificam a estrutura de interfaces, classes e aspectos. Elas podem adicionar variáveis membros ou métodos e até mesmo mudar a hierarquia dessas entidades.

declare parents: Account implements BankingEntity;

Compile-time detection

Compile-time detections são utilizadas para criar warnings e errors em determinados padrões de uso de APIs.

declare warning : call(void Persistence.save(Object))

: "Consider using Persistence.saveOptimized()";


Aspect

O aspect (aspecto) é o ponto central da Orientação a Aspectos, assim como uma classe é o ponto central em orientação a objetos. Nele são declarados e implementados os códigos que expressam as regras de mesclagem das funcionalidades. Pointcuts, advices, introductions e declarações são combinados em aspectos. Além dos elementos da Orientação a Aspecto, um aspecto também pode conter métodos e variáveis membros assim como nas classes Java.

image Esquema mostrando o relacionamento entre uma classe e um aspecto

Existem outras implementações de Orientação a Aspectos para Java que podem não ter a sintaxe extendida do AspectJ e por isso utiliza classes e métodos normais para criação dos aspectos, mas ainda assim os conceitos são válidos.


3 Hello World

 

Criaremos então o Hello World, utilizando AspectJ. Criaremos uma classe Hello com um método sayHello que imprimirá ‘Hello’ na saída padrão. Depois criaremos um aspecto que conterá um pointcut que selecionará o join point que será a execução do método sayHello da classe Hello, criaremos um advice que imprimirá ‘World’ após o join point definido previamente.

public class Hello {

    public void sayHello(){

        System.out.print("Hello");

    }

}

Ao executarmos o método sayHello será impresso na tela:

Hello

Criaremos então, o aspecto que estenderá a funcionalidade do sayHello:

public aspect AspectHello {

    // pointcut que seleciona como join point a execução do método

    // sayHello da classe Hello

    pointcut world(): execution (public void Hello.sayHello());

    // advice que será executado após cada join point selecionado

    // pelo pointcut world()

    after() returning: world() {

        System.out.println(" World");

    }

}

Após fazer o weaving e executar o método Hello.sayHello() a saída do programa será:

Hello World

4 Vantagens da Orientação a Aspectos

 

A Orientação a Aspectos traz novas dificuldades a programação, mesmo porque é uma nova metodologia, e tudo que é novo requer um tempo de aprendizado. Mas a Orientação a Aspectos oferece vantagens que cobrem esse tipo de problema:

· Responsabilidades mais transparentes de cada módulo: cada módulo é responsável apenas pelas tarefas destinadas ao próprio módulo. Os módulo são mais independentes.

· Modularização mais alta: As responsabilidades são melhor definidas em cada módulo, os módulos tem baixo acoplamento entre si.

· Evolução do sistema mais facilitada: O baixo acoplamento possibilita que alterações no sistema sejam feitas sem alteração do núcleo

· Decisões de design podem ser tomadas com mais atraso: Devido ao baixo acoplamento não é necessário pensar em todos os problemas no início do desenvolvimento do sistema

· Mais reusabilidade do código: Os módulos podem ser mais reaproveitados devido a alta coesão e baixo acoplamento

· Sistemas mais fáceis de desenvolver e manter: Os aspectos tornam a integração das partes do sistema um modulo separado, o que traz mais facilidade no desenvolvimento

· Custos reduzidos de introdução de novas funcionalidades: Novas funcionalidades podem ser introduzidas criando aspectos, não sendo necessário alterar o núcleo para adicionar tais funcionalidades


5 Conclusão

 

A Orientação a Aspectos é uma nova metodologia de programação. A Orientação a Aspectos não é um substituto a orientação a objetos e sim um complemento. Um novo nível de modularização é alcançado, a diminuição do acoplamento dos módulos possibilita mais facilidade de manutenção, maior reaproveitamento do código e maior organização do sistema. Apesar de ser uma nova metodologia a orientação a aspectos já é está madura o suficiente para ser utilizada na produção de sistemas, já tem documentação e suporte de ferramentas suficiente. Assim como hoje a orientação a objetos é a maneira mais aceita para desenvolvimento dos módulos do sistema, a orientação a aspectos será o padrão de integração desses módulos.

Screen casts mostrando a utilização de aspectos junto com a IDE eclipse

Exemplo de logging
http://www.javaframework.org/portal/arquivos/log.htm
Exemplo de uso de anotações para marcar um parâmetro de um método como obrigatório
http://www.javaframework.org/portal/arquivos/req.htm


1 Response to O que é Programação Orientada a Aspectos?

Leave a Response

Recent Posts

Tag Cloud

advice annotations aop api aspect bean bytecode compilador configuração crosscuting eclipse framework ide jar java jdk jee jme join point jre jse máquina virtual netbeans pointcut produtividade spring weaving web

Meta

Java Framework Portal is proudly powered by WordPress and the SubtleFlux theme.

Copyright © Java Framework Portal