Aop?

Olá pessoal!

Como anda o desenvolvimento usando AOP (Aspect-Oriented Programming) no Brasil? Alguem tem estatísticas, casos de sucesso ou algo do gênero pra compartilhar? Quero ter certeza de que eu nao sou o unico xarope a usar isso por aqui :slight_smile:

[]'s
-cv

usar a filosofia AOP tem muita gente usando. qualquer interceptador, filtro, etc ta usando crosscutting de uma maneira ou outra.

agora, usar alguma ferramenta, como o aspectj, em um projeto comercial, ouvi apenas boatos.

em especial porque o aspectj gera o bytecode da sua classe diferente, o aspecto nao vai existir em bytecode, sux.

se voce usar o bcel ou outro gerador de bytecode em cojunto, ai ateh pode sair algo mais real, porem mesmo assim nao vai ser a virtual machine que estara interceptando os pointcuts. sux denovo, nao?

por exemplo, voce escreveu um aspecto, e agora adicionou outra classe sozinha, o aspecto nao vai pegar essa classe se voce nao compila-la junto com o aspecto. um crime.

eu acho que tem futuro, mas nao agora.

Desculpem a ignorância … mas, será que vocês tem algum link pra eu ler a respeito? (não das ferramentas, mas do conceito)

Só pra eu saber do que se trata este tópico :frowning:

Obrigado

http://www.aosd.net/ site sobre AOP em geral
http://www.aspecj.org/ implementacao de aspectos para java

Mais algumas informações, caso alguém esteja com a mesma preocupação que eu: fiz uma pequena experiência “treinando” um desenvolvedor Java em AOP esse fim-de-semana.

Aqui vão alguns trechos do diálogo:

  • AOP é simplesmente estender a visão da orientação a objetos para acomodar o conceito de “cross-cutting concerns”, que são preocupações que todos, ou muitos dos objetos no seu sistema têm. Logging é um exemplo clássico disso: quase todos os objetos no seu sistema tem que chamar alguma rotininha pra logar coisas…

  • Pois é, mas no que o AOP me ajuda com logging, por exemplo?

  • Então, supondo que vc queira logar todas as entradas e saídas de um determinado conjunto de métodos, por exemplo, todos os getters de um bean, vc cria um “aspecto” que dá uma mãozinha aos getters, e ajuda eles a logar coisas. Essa “mãozinha” é chamada de advice, e os advices podem executar qualquer coisa antes da chamada de um método, ou depois da chamada. No caso do logging, vc vai querer fazer as duas coisas – um log na entrada e outro na saída…entendeu?

  • Hmmm…é, sem pensar na implementação disso, parece simples…

  • E a implementação disso é simples! A maioria dos frameworks de AOP pra Java funcionam usando os Dynamic Proxies introduzidos pela JDK 1.3, ou trabalham “off-line” alterando dinamicamente os bytecodes das classes já compiladas para adicionar os advices.

  • Ah, já tem framework pra isso? Po, legal, entao eu nem preciso me preocupar tanto com implementação…

  • Pois é, voltando à teoria da coisa, então: outro conceito bem bacana do AOP é o de mix-ins. Mix-ins são nada mais do que implementações adicionais adicionadas a seus objetos. Por exemplo, suponha que vc queira adicionar um método getVersion() para todos os objetos, que retorna a versão atual de sua implementação ou o serialVersionUID, ou algo do gênero. Voce escreve uma interface, digamos, GetVersionMixin, e uma implementacao, por exemplo, GetVersionMixinImpl, que implementa a interface GetVersionMixin, e adiciona esses mixins a seus objetos. Automaticamente, seus objetos implementarão a interface GetVersionMixin, e quando o metodo getVersion() for chamado, o codigo existente em GetVersionMixinImpl será executado.

  • Ou seja…reinventaram a herança múltipla… :evil:

  • Não é bem herança múltipla…não dá pra sobrescrever métodos, então não é nem herança… RELAXA, EU TAMBÉM NÃO GOSTO DE C++ :slight_smile:

  • Ok, já tou mais calmo…

Argh…chega de digitar por enquanto…mais tarde eu continuo o diálogo :slight_smile:

[]'s
-cv

vai ser legal quando implementarem nativamente e tal. pra ter uma puta performance e padronizado.

bem que eh legal ficar gerando bytecode compativel, neh? porque ai funciona em qualquer JVM. eh que nem generics que vai provavelmente conseguir rodar em java < 1.5. pelo menos eles desejam :slight_smile:

a gente ta assistindo a mesma coisa que nossos pais e professores assistiram a 20 anos atras, a mudanca de paradigma. tirem fotos para a posterioridade!

Yup, mas acho difícil o Java ganhar essas coisas “na linguagem”, pode ser overkill pra definição da linguagem e ia dar ainda mais trabalho do que os generics pra implementar nos compiladores (putz, coitada da galera do Jikes e Eclipse…)

Curioso que, a cada mudança de paradigma, tem menos e menos gente seguindo as novidades… quando assembly era o top, C e outras linguagens conseguiram convencer rapidamente o pessoal de que eram mais eficientes… hoje, ainda tem muita gente programando em C coisas que não precisariam ser feitas em linguagens tão low-level…falar de AOP ou programação funcional (heyyy Haskell!) parece loucura pra muitos… :mrgreen:

Olah, existe uma lista de discussao sobre AOP e correlatos…eh uma lista de baixo trafego, contando com cerca de 50 pessoas cadastradas…segue a descricao da lista:

"Este grupo foi criado para reunir pessoas do Brasil (estrangeiros também são bem-vindos) interessadas em discutir sobre Advanced Separation of Concerns no desenvolvimento de software e suas diversas abordagens (Aspect-oriented Software Development, Multi-Dimensional Separation of Concerns, Composition Filters, Meta-object Protocols etc). "

Para se inscrever na lista: asoc-br-subscribe@yahoogroups.com
ou pelo site do yahoo…

T+
Eduardo Piveta

Valeu pela dica, Eduardo! :slight_smile:

Espero que não fiquem chateados comigo por ter recuperado um tópico tão velho, eu não resisti porque a pergunta do cv para mim continua muito atual. Como está o desenvolvimento com Orientação a Aspectos no Brasil? Alguém está usando, quais resultados vocês têm obtido?

Abraços a todos!

Eu uso… a implementação do AspectJ é muito boa. Tem os drawbacks que o Paulo comentou, mas não acho isso impeditivo na adoção do framework. O que gosto é a integração com o Eclipse. Ele destaca os métodos que sofrem atuação de advices e se você olhar o aspecto ele também te diz todos os métodos adviced.

Atualmente tenho usado para fazer DI, Logging, Tracing. Na semana passada estava com um probleminha. Quando você está usando o Hibernate Validator e manda um manager.persist(entity) com uma entidade inválida o EntityManager gospe um RuntimeException que encerra a transação JTA. Minha aplicação precisava que os erros de validação simplesmente fossem uma RuntimeException mas @ApplicationException. Resolví com um Aspecto que observava os métodos do EntityManager (uma solução bem melhor que implementar um EntityManagerFactory).

Depois que você aprende você começa a enxergar uma outra dimensão nos objetos e começa a aplicar AOP.

Eai pessoal,

Estou avaliando a utilização de AOP, mas pelo que percebi, não tem muita gente utilizando… Brinquei um pouco com aspectJ e queria brincar um pouco com o JBOSS AOP.
Alguem aqui usa algum dos frameworks em projetos comerciais?

Gostei do aspectJ mas tive dificuldades para utilizá-lo com o maven… não achei nenhum plugin descente.
Pretendo avaliar o JBOSS AOP agora e ver se vale a pena…

Alguma sugestão?

[]s

[quote=Paulo Silveira]vai ser legal quando implementarem nativamente e tal. pra ter uma puta performance e padronizado.

bem que eh legal ficar gerando bytecode compativel, neh? porque ai funciona em qualquer JVM. eh que nem generics que vai provavelmente conseguir rodar em java < 1.5. pelo menos eles desejam :slight_smile:

a gente ta assistindo a mesma coisa que nossos pais e professores assistiram a 20 anos atras, a mudanca de paradigma. tirem fotos para a posterioridade![/quote]

Realmente Paulo, pois tentei montar um esquema de Log automatizado no meu projeto atual, que usa o WebLogic, além da configuração com o servidor ser árdua, a performance do bichinho não é lá essas coisas, acabou inviabilizando minha implementação.

Costumo pensar em aspectos somente para interesses ortogonais. Esse insight que o CV deu sobre Mix-ins, despertou minha atenção para alguns outros casos, utilizá-lo também em negócios. Mas teríamos que ter nativamente, como você disse.

[quote=Kenobi][quote=Paulo Silveira]vai ser legal quando implementarem nativamente e tal. pra ter uma puta performance e padronizado.

bem que eh legal ficar gerando bytecode compativel, neh? porque ai funciona em qualquer JVM. eh que nem generics que vai provavelmente conseguir rodar em java < 1.5. pelo menos eles desejam :slight_smile:

a gente ta assistindo a mesma coisa que nossos pais e professores assistiram a 20 anos atras, a mudanca de paradigma. tirem fotos para a posterioridade![/quote]

Realmente Paulo, pois tentei montar um esquema de Log automatizado no meu projeto atual, que usa o WebLogic, além da configuração com o servidor ser árdua, a performance do bichinho não é lá essas coisas, acabou inviabilizando minha implementação.

Costumo pensar em aspectos somente para interesses ortogonais. Esse insight que o CV deu sobre Mix-ins, despertou minha atenção para alguns outros casos, utilizá-lo também em negócios. Mas teríamos que ter nativamente, como você disse. [/quote]

Mix-ins são realmente muito bons Kenobi e ajudam muito, contudo manter longe do negócio e mais perto das necessidades da infra me parece ser uma escolha mais interessante.

Por exemplo:

É comum em paginas que usam Datatables JSF, disponibilizar entidades com um atributo isSelect ou algo parecido, que leem e outros que setam um valor booleano que diz se a linha foi selecionada por um checkbox ou não. Normalmente para tal, insere-se um atributo booleano na Entidade ou cria-se um wrapper para ela. Na primeira um problema é misturar no objeto entidade coisas muito além da modelagem do domínio, como um campo referente a infra da apresentação… e no segundo approach o ruim é que ficar fazendo wrapper sempre que precisar de um conteúdo a ser exibido é um saco. Para isso, fazer “Introduction” de um campo inexistente na modelagem de domínio e um “Mix-in” de uma interface para estas entidades, com implementações de métodos para leitura destes novos campos, torna de maneira única bem simples este serviço para qualquer que seja a entidade. Aspectos de segurança também são bem comuns nesta mesma linha de abordagem.

Contudo, modelar aspectos para o negócio em sí, acho meio perigoso. Os métodos pertinentes ao domínio tem que ser explícitos neste, e não plugados.

Quanto ao que o CV disse, só uma observação, é possível sim sobrescrever métodos. Aliás, para classes que compartilham de mesma estratégia comum para equals e hashCode (projetos onde as igualdades podem ser submissas a IDs, por exemplo), um aspecto pode perfeitamente resolver este crosscuting fazendo as sobrescritas.

Na maioria das vezes é possível implementar ‘aspectos’ usando a infraestrutura existente dos frameworks ou containers, através de interceptors ou filters. Considere utilizar estas funcionalidades sempre que possível. Você pode acabar descobrindo que jamais vai precisar usar frameworks de aspectos.

Interceptor e Filters cobrem apenas uma perna da AOP, que é definição de pointcuts e joinpoints.