Programação Orientada à Aspectos ---> AspectJ

Fala Galera!

Gostaria de saber se alguém tem experiência com Programação Orientada à Aspectos, o que vocês acham do assunto, se isso tem futuro, etc. . .
Enfim, a opinião de todos sobre o assunto.

Eu andei lendo um pouco sobre o assunto e estou tentando começar a programar em POA, mas não estou conseguindo instalar o plugin no meu Eclipse . . .
Mas isso já está quase resolvido…

Valeu pessoal.

Em geral a AOP é utilizada para auxiliar a OOP em tarefas que nao fazem parte do dominio/regras de negocio da aplicacao.
Na pratica se utiliza muito AOP para geracao de Logs e gerenciamento transacional.

Um topico do GUJ dedido a AOP.

http://www.guj.com.br/posts/list/13316.java

:wink:

Cheguei a mexer um pouco e achei muito legal, quase até fiz meu TCC usando o AspectJ. O que posso te dizer é o seguinte: o AspectJ é uma excelente ferramenta e o eclipse agora apresenta tb umas coisas bem legais, como por exemplo, apresentar em suas classes os pointcuts que um aspecto está interceptando. Recomendo também ler ter noção sobre Reflection, que aliado ao Aspecto, vai aumentar bastante seu poder de fogo.
Vc vai encontrar em geral muito material na net falando sobre a teoria dos aspectos e a razão para ele existir, mas exemplos concretos vao ser bem repetidos, como fazer log de sistema ou controle de acesso com aspectos.
Então o que te digo hj em dia é o seguinte: Aspecto é uma tecnologia jã madura para ser usada, em geral nós desenvolvedores que ainda temos que chegar em um maior nível de maturidade para fazer bom uso da mesma.
Na facu cheguei a usar aspecto pra fazer uma Gambi pesada, o professor queria que toda exceção fosse mostrada na tela, com seu nome e descricao no JOptionPane. Como estava sem tempo, resolvi com um aspecto de poucos linha e corri pro abraço. O código estava com muitas classe e se eu fosse fazer o tratamento em cada uma que lançasse exceção ia ser um caos.
Enfim, vc vai ver tb que para uma melhor utilização tb, é interessantes definir convenções de nomenclatura em seu projeto, e manter isso bem documentado. Isso por duas razoes:
1)Vc já pode escrever suas classes pensando em um aspecto que já está pronto (poderia por exemplo, no caso de log, todo método começar com logBlaBlaBla)
2)Evita que pessoas utilizem essa convenção de nomes em classes que nao necessitem de interceptação pelo Aspecto

Como essa é uma área que gosto, se kiser trocar umas idéias, fique a vontade para me contatar via msg privada.

Muita boa essa implementação em excessões…

Você disse que usou isso na sua Facul, certo ?

Será que você não pode me mandar umas apostilas ou uns exemplos de códigos ???

É que eu estou tentando começar a programar. . .

Ah!, já consegui instalar tudo direitinho no eclipse.

Agora vou olhar os links que me passaram. . .

Cara, eu fiz um aspecto bem simples, só peguei todos os métodos de interesse, que lançassem Excessao e capturava a expressao e colocava num JOptionPane. Depois disso dei uma lida no livro AspectJ in Action. Recomendo ele, tem vários exemplos bacanas lá. O código de facu eu nem tenho mais…

Quanto aos links, agradeço muito.

Mas queria alguns exemplos de códigos . . .

É só pra eu ter alguns exemplos a mais de utilização e conseguir entender melhor a sintaxe. . .

Se alguém poder me mandar, fará um grande favor.

Opa, utilizei AOP para implementar uma parte do meu trabalho de conclusão de curso. Devido a isso, elaborei um exemplo de código que pode ser útil para ti. É um exemplo didático baseado em um livro sobre programação com aspectos e casos de uso.

A seguir segue a seção do meu trabalho com esse exemplo:

[color=darkblue]Essa secão pretende aplicar alguns conceitos explicados até agora no desenvolvimento de
um aspecto. O programa desse exemplo é um sistema de gerenciamento de um hotel. Nesse
sistema deseja-se registrar toda vez que um cliente reserva ou libera um quarto. Esse comportamento
?corta? por vários componentes, logo é uma área de dispersão que pode ser implementada
com aspectos elegantemente. Nomeia-se esse aspecto de RoomLogging.

Analisando o novo comportamento, verifica-se que ele impactara mudanc¸as em duas classes
do sistema: ReserveRoomHandler e ReleaseRoomHandler. Essas classes sao respons´aveis
por reservar e liberar quartos respectivamente. Os metodos que fazem essas tarefas sao: reserveRoom()
na classe ReserveRoomHandler e releaseRoom() na classe ReleaseRoomHandler.
Se esse comportamento fosse implementado apenas com POO seria necessario modificar cada
uma dessas classes nesses dois metodos. Implementando com POA utilizando a linguagem AspectJ,
pode-se criar um aspecto que ira inserir o novo comportamento em tempo de compilaçao.

O aspecto para inserir esse novo comportamento tera tres pontos de corte (pointcuts): um
referindo-se ao escopo (classeAlvo()) e outros dois aos tipos dos pontos de junçao (reservaDeQuarto()
e liberacaoDeQuarto()). O ponto de corte que define o escopo diz que as execuçoes de metodo
dentro das classes ReserveRoomHandler e ReleaseRoomHandler serao monitoradas. Ja os pontos
de corte que definem os tipos dizem que apenas as execuçoes de metodos que reservam ou
liberam um quarto serao monitoradas.

Assim, combinando os tres pontos de corte, obtem-se o codigo de aspecto que pode ser conferido no código abaixo:

Observa-se nesse aspecto a presenc¸a de um aviso (advice) que executara
antes (before) da reserva ou liberaçao de um quarto. Assim, resta apenas codificar o comportamento
que executara no corpo do aviso. Esse comportamento sera provavelmente registrar a
reserva ou liberaçao de um quarto em um repositorio ou um arquivo.
[/color]
Estudei bastante sobre aspectos e por isso começei a postar sobre o assunto em minha página pessoal (que tem um blog). Se tu quiser acessar pretendo colocar algumas informações lá também: http://www.pedroghilardi.rg3.net

Abraços,
Pedro

Pessoal,

estou com um problema quanto ao uso de AspectJ.

Preciso criar uma aplicação em AspectJ em um JAR.
Fiz esta aplicação no Eclipse e nele roda tudo ok. Porém, ao tentar gerar o JAR, eu não consigo definir o ponto inicial do programa (aspecto que tem o método public static void main(String[] args)).

Pelo que eu entendo de AspectJ, classes não podem chamar aspectos. Somente aspectos podem chamar aspectos, sendo que aspectos podem também chamar classes. Assim, no Eclipse, eu tive que criar um aspecto com um método main para que este fosse o ponto de início do programa. Ao mandar o eclipse rodar essa aplicação, ele roda tranquilamente.

Porém eu preciso criar um JAR para esta aplicação. Eu criei o manifesto e atribui ao atributo “Main-Class” o valor “performance.Program” (o caminho completo do aspecto de nome Program que contém o método main). Porém, ao executar o JAR, dá erro.

Por mais loucura que isto possa parecer, não estou usando aspectos para logs, depurações e etc. Estou usando para programar mesmo. Isto porque, estou fazendo um trabalho acadêmico que utiliza Aspectos para mapear associações entre classes. Estou utilizado a biblioteca RAL para isto, assim as classes ficam independentes das associações, aumentando a coesão e diminuindo o acoplamento. Sendo assim, todo comando de acesso as associações estão dentro de aspectos e desta maneira, meu programa precisa ser escrito em aspectos.

Para auxiliar vocês a depurarem um possível erro meu, sergue o código do aspecto que possui o método main:

[code]package performance;

//imports…

public final aspect Program {
public static void main(String[] args) {

  // código da aplicação

}
}[/code]

Agora, o código do arquivo de manifesto (presente dentro do JAR em META-INF/MANIFEST.MF):

Manifest-Version: 1.0 Main-Class: performance.Program Class-Path: C:\Program Files\AspectJ-1.6\lib\aspectjtools.jar;D:\iuri\Documents\SVN\svn.inf.ufsc.br\Mestrado\projeto\Object-Relation Language\produção\AspectJ\PerformanceAspectJ\lib\ral.jar

Segue o comando digitado no console após a geração do JAR (chamado de PerformanceRAL.jar):

java -jar PerformanceRAL.jar 

E por fim, o erro retornado no console:

Erro: Não foi possível localizar nem carregar a classe principal performance.Program

Qualquer solução para este problema é bem vinda!

Obrigado

Pessoal,

estou com um problema quanto ao uso de AspectJ.

Preciso criar uma aplicação em AspectJ em um JAR.
Fiz esta aplicação no Eclipse e nele roda tudo ok. Porém, ao tentar gerar o JAR, eu não consigo definir o ponto inicial do programa (aspecto que tem o método public static void main(String[] args)).

Pelo que eu entendo de AspectJ, classes não podem chamar aspectos. Somente aspectos podem chamar aspectos, sendo que aspectos podem também chamar classes. Assim, no Eclipse, eu tive que criar um aspecto com um método main para que este fosse o ponto de início do programa. Ao mandar o eclipse rodar essa aplicação, ele roda tranquilamente.

Porém eu preciso criar um JAR para esta aplicação. Eu criei o manifesto e atribui ao atributo “Main-Class” o valor “performance.Program” (o caminho completo do aspecto de nome Program que contém o método main). Porém, ao executar o JAR, dá erro.

Por mais loucura que isto possa parecer, não estou usando aspectos para logs, depurações e etc. Estou usando para programar mesmo. Isto porque, estou fazendo um trabalho acadêmico que utiliza Aspectos para mapear associações entre classes. Estou utilizado a biblioteca RAL para isto, assim as classes ficam independentes das associações, aumentando a coesão e diminuindo o acoplamento. Sendo assim, todo comando de acesso as associações estão dentro de aspectos e desta maneira, meu programa precisa ser escrito em aspectos.

Para auxiliar vocês a depurarem um possível erro meu, sergue o código do aspecto que possui o método main:

[code]package performance;

//imports…

public final aspect Program {
public static void main(String[] args) {

  // código da aplicação

}
}[/code]

Agora, o código do arquivo de manifesto (presente dentro do JAR em META-INF/MANIFEST.MF):

Manifest-Version: 1.0 Main-Class: performance.Program Class-Path: C:\Program Files\AspectJ-1.6\lib\aspectjtools.jar;D:\iuri\Documents\SVN\svn.inf.ufsc.br\Mestrado\projeto\Object-Relation Language\produção\AspectJ\PerformanceAspectJ\lib\ral.jar

Segue o comando digitado no console após a geração do JAR (chamado de PerformanceRAL.jar):

java -jar PerformanceRAL.jar 

E por fim, o erro retornado no console:

Erro: Não foi possível localizar nem carregar a classe principal performance.Program

Qualquer solução para este problema é bem vinda!

Obrigado