Javafree
/usr/local/aplicacoes/javafree/class/header_forum.php:4: Notice: $show_banner is an undefined variable
Página Inicial do Fórum > [Tutoriais] - Boas Práticas de Programação

AOP - Um paradigma de desenvolvimento em evolução.



Criar novo tópico   Responder tópico


  1. jrodrigues
    Posts:1360


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    AOP - Um paradigma de desenvolvimento em evolução.

    Há alguns anos atrás, a metodologia de desenvolvimento de software era o que conhecíamos como "dividir para conquistar". Esta metodologia funcionava mas incorria em sérios problemas. Alguns desses problemas eram as várias linhas de código do sistema, muitas vezes redundantes, e inúmeras variáveis globais, o que o tornavam difícil de manter e de depurar. Os sistemas eram totalmente procedurais.

    Com a evolução da metodologia para um contexto baseado em classes e objetos, esses problemas foram desaparecendo mas outros foram surgindo. Hoje os desenvolvedores ainda têm dificuldade em expressar entidades do mundo real em objetos de sistema. Embora exista fundamento para expressar uma solução como um conjunto de vários objetos, ainda temos funcionalidades que devem ser aplicadas em diversos deles.

    Atualmente, sabemos que o paradigma de OO não contempla todas as nossas necessidades. Conhecemos o impacto que um novo requerimento gera dentro da etapa de desenvolvimento. Isso ocorre porque o modelo de OO é puramente estático.

    O AOP não veio substituir de maneira nenhuma esse paradigma. Veio para complementá-lo, permitindo que novos requerimentos possam ser facilmente agregados ao sistema, e que funcionalidades inerentes a vários objetos sejam facilmente desenvolvidas modularmente. E isso ocorre sem mudancas no modelo estático do sistema, o que comprova que os paradigmas são, de fato, complementares devido a natureza dinâmica do AOP.

    O AOP também não veio substituir o SOP (Subject Oriented Programming) já que cada um tem propósitos distintos. O SOP tende a tratar as funcionalidades do sistema como subjects. Mais tarde, em outra etapa, todos esses subjects são agrupados para formar o sistema. Embora um subject possa ser definido como um conjunto de objetos que tenham finalidades semelhantes dentro do sistema, o que é muito semelhante a um aspect, eles distinguem-se pelo fato de um aspect ter sua definição dinâmica no nível de instância de um objeto, enquanto o subject é completamente estático.



    No diagrama acima, vemos um exemplo de refactoring de código: a esquerda temos uma funcionalidade em várias partes do código e a direita, o projeto refactorado, com um aspect que substitui o código redundante.

    Mas o que é o AOP?

    AOP, ou Aspect Oriented Programming (Programação Orientada a Aspectos) é paradigma que veio solucionar dois problemas:

    [list]Permitir uma separação melhor entre os funcionalidades do sistema, de acordo com a linguagem utilizada
    Fornecer um mecanismo que permita que uma funcionalidade comum a vários objetos possa ser descrita de alguma forma;[/list]

    Quando desenvolvemos sob este novo modelo, o código basicamente é centralizado em algum ponto do sistema, diferentemente do paradigma OO, permitindo assim que o tempo de manutenção diminua sensivelmente e que o sistema se torne cada vez mais modularizado.

    Vamos nos ater a um exemplo para elucidar as terminologias mais comuns deste modelo.

    Suponha que queremos adicionar a funcionalidade de logging no sistema que estamos desenvolvendo. Assim sendo, explanamos algumas terminologias referentes a este paradigma:


    Advice element: esse seria o código que queremos adicionar ao nosso sistema: no nosso exemplo, o código para logar informações.

    Cross-cutting elements: são aspectos comuns a algumas classes do sistema. No nosso exemplo, isso seria adicionar logging a sua aplicação. Você pode querer que seu Business Delegate gere um log transacional de cada operação, assim como pode querer que seu front-end gere um log para cada ação do usuário. Embora as funcionalidades sejam distintas, o código é praticamente o mesmo.

    Pointcut element: é o ponto do sistema onde um cross-cutting element é aplicado. No nosso exemplo, isso equivaleria a um método do Business Delegate ou um método chamado no Controller do MVC do nosso front-end.

    Aspect element: um aspecto é a junção de dois elementos: um pointcut, e um advice. Com isso, o sistema saberá qual código executar, isto é, qual advice executar quando encontrar um pointcut.

    Introduction element: é um aspecto estático introduzido no sistema. Pode ser uma variável de instância por exemplo ou um método que serao adicionados a uma classe ou interface.



    Com isso, o AOP pode nos trazer os seguintes benefícios:

    [list]Alta reusabilidade de código
    Menor quantidade de linhas programadas
    Facilidade para manutenção
    Menor tempo e custo de desenvolvimento
    Maior coesão entre os objetos
    Menor acoplamento entre os objetos[/list]

    Exemplo de código:



    Percebam a quantidade de código redundante que é executado no código acima. Em vários pontos fazemos a checagem de permissão.
    Isso pode ser modularizado em um aspecto de sistema, como veremos abaixo.
    (Depois da criação de Aspectos)



    No Eclipse, com AspectJ, podemos ver as definicões de um aspecto:



    Na imagem, marcados em vermelhos, vemos os pointcuts:



    Na figura acima, vemos marcado no quadrado vermelho, os advices na direita e a definição de um aspecto, em código, a esquerda.

    Existem diversos frameworks que implementam o AOP. O mais conhecido e mais completo deles é o AspectJ (http://www.aspectj.org) .

    Com o AspectJ é possível criar aspectos rapidamente e é fácil integrá-lo ao Eclipse IDE.

    Também temos o DynAOP (https://dynaop.dev.java.net)

    Outras implementacões também existem como a do grupo Jboss, a Jboss AOP (http://www.jboss.org/developers/projects/jboss/aop). Jboss AOP usa o JavaAssist (http://www.jboss.org/developers/projects/javassist.html) que é um sistema de reflection em Java que altera o byte-code das classes antes de a JVM carregá-las.

    Existe também o AspectWerks (http://aspectwerkz.codehaus.org/) que é uma implementação mais leve do AOP. Ele não tem todas as funcionalidades do AspectJ, mas certamente é a mais simples de usar. Utiliza modificacões de byte-code em tempo de execução para criar aspectos no sistema.


    Jean Rodrigues é SCJP, SCWCD, Oracle Certified Instructor e consultor J2EE sênior da Seed Technology Solutions com mais de 4 anos de experiência em desenvolvimento com diversas tecnologias. Atualmente dentro e fora do Brasil, ministra cursos e palestras sobre a tecnologia Java e desenvolve sistemas distribuídos de grande disponibilidade com esta tecnologia.



  1. FredRicci
    Posts:189


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Jean, não entendi uma coisa,

    as chamadas do mótodo de checar permissoes estão escondidas onde estão os pointcuts??Isso é apenas visual?? Tipo se eu o gerar o código java a partir do class desta classe Banco eu vou ver as chamadas lá??
    _________________



  1. jrodrigues
    Posts:1360


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    [quote="FredRicci"]Jean, não entendi uma coisa,

    as chamadas do mótodo de checar permissoes estão escondidas onde estão os pointcuts??Isso é apenas visual?? Tipo se eu o gerar o código java a partir do class desta classe Banco eu vou ver as chamadas lá??



    Não verá não.
    Na verdade, somente durante a execução isso será percebido.

    O compilador do AspectJ irá colocar todo o código necessário (leia-se byte codes para chamadas dos métodos do aspecto em questão) nos lugares em que for necessário (pointcuts).



  1. YellowBike
    Posts:16


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Alguns advices recebem parametros, minha pergunta é quando e como ele recebe esses parametros????
    _________________



  1. Ronaldo
    Posts:222


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Então esse AspectJ é um outro compilador? Como funciona isso? Quando instala ele no Eclipse ele monitora a compilação e acrescenta as chamadas?
    Então só é possível usar AOP usando algum outro produto que intercepta a geração do byte code? Apenas com o java não tem como?
    _________________

    Vamos pescar de caiaque?
    Sou representante dos caiaques lontra. São bons para pesca e mergulho.
    http://www.caiaquelontras.com.br/



  1. daltoncamargo
    Posts:8900


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Tem sim, usando o pattern "proxy" (ainda ontem Ronald e eu conversamos muito sobre isso). Que nada mais é do que usar algum framework que te possibilite a criação de interceptors sem precisar usar um pós-compiler como é feito com o AspectJ.

    Eu te recomendaria o Spring



  1. Ronaldo
    Posts:222


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vi que o spring é para ser usado e para facilitar o desenvolvimento de aplicaçãoes j2ee. Minha aplicação é um programa j2se c/ swing. Creio que o spring não seria aplicável a mim.

    Teria como implementar os interceptors sem algum framework? Ou seria mais aconselhável usar o AspectJ?
    _________________

    Vamos pescar de caiaque?
    Sou representante dos caiaques lontra. São bons para pesca e mergulho.
    http://www.caiaquelontras.com.br/



  1. daltoncamargo
    Posts:8900


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Você pode usar o Spring AOP apenas

    http://www.javafree.com.br/home/modules.php?name=News&file=article&sid=2665



  1. Relacionados