Estou iniciando em um projeto de grande porte bancário, e gostaria de saber a experiência de vocês em relação ao Uso da Orientação a Aspecto, gostaria de saber as vantagens e desvantagens do uso em programação orientado a obejto.
Cara to fazendo o meu TCC sobre isto e acho que é muito bom, precisa ver se o pessoal da equipe conhece, se bem que a curva de aprendizado é bem pequena, você quer colocar o AspectJ para trabalhar qual responsabilidade ?
A programação a aspectos separa responsabilidades como OO, mas na prática a ideia é remover do código partes que são necessárias para a aplicação mas não tem necessáriamente relação com a lógica daquele metodo ou função.
Um exemplo simples é a adição de log, temos logs no código pois ele é necessário mas não tem relação especifica com a lógica a ser executada.
Na prática mesmo, no seu dia a dia, vai depender da ferramenta de aspecto que você escolher pois elas trabalham de maneira diferente, algumas necessitam de alteração nas suas classes (definição de pontos de corte) outros como o Spring se utiliza de um proxy dynamico para que algo seja executado antes ou depois do seu metodo.
Por cima, mas assim bem por cima mesmo, é algo assim:
// Estou inventando essa sintax apenas pro exemplo
public void doStuff(){
# Log:inicio
System.out.prinln("Oi!");
# Log:fim
}
No codigo acima criamos um metodo e definimos dois pontos de corte, um “Log:inicio” e outro “Log:fim”, poderiamos chamar de dois aspectos sendo o inicio e o fim de metodos.
Ai criamos o seguinte pedaço codigo em outro arquivo:
# Log:inicio
System.out.println("iniciou o metodo");
e esse outro tb:
# Log:fim
System.out.println("finalizou o metodo");
Na sequencia utilizamos um compilador de aspectos que mescla todos os arquivos (e já compila o class):
public void doStuff(){
System.out.println("iniciou o metodo");
System.out.prinln("Oi!");
System.out.println("finalizou o metodo");
}
Com isso, caso queiramos mudar o esquema de log do sistema inteiro apenas alteramos os aspectos, e eles serão alterados em todos os pontos de corte.
Outra caso pratico seria utililizar aspectos para demarcacao de transacao (que alias, eh o unico que eu uso mesmo).
Como minha aplicação usa Spring o que fazemos é definir quais os metodos terão
<!-- definimos os transaction manager -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="DataServiceException"/>
</tx:attributes>
</tx:advice>
<!-- definimos os point cuts por pacote, classe e metodo -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* br.com.acme.calculadora.dao..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>
Quando um bean que tenha uma classe do pacote br.com.acme.calculadora.dao for injetado o Spring insere um proxy dynamico para ele, ai quando os metodos forem chamados chamados ele cria uma transação.
Eu particularmente nao gosto muito de magia negra, prefiro o codigo mais linear e facil e entender, minha experiencia pessoal nao foi das melhores, tive um monte de problemas usando aspectos em projetos e hoje soh uso para transacoes com Spring.