Chegando atrasado para o jogo, mas forneço isso para desenvolvedores posteriores que podem se deparar com essa pergunta.
Eu recomendaria fortemente contra o AOP se o seu aplicativo depender dele para funcionar corretamente. Aspectos funcionam assim:
- O conselho (comportamento adicional) é aplicado a
- Pontos de junção (locais onde o código extra pode ser anexado, como início ou fim do método ou quando um determinado evento é acionado)
- ... onde os padrões pointcut (um padrão que detecta se um determinado ponto de junção corresponde) correspondem aos padrões
Para quem trabalha com computadores há muito tempo, o fato de os padrões serem usados pode ser algo para examinar de perto. Então, aqui está um exemplo de um pointcut que corresponde a qualquer método nomeado, set
independentemente dos argumentos:
call(* set(..))
Portanto, esse é um argumento bastante abrangente e deve ficar claro que é recomendável lidar com isso com cuidado (sem trocadilhos), porque você está aplicando conselhos a muitas coisas.
Ou, diabos, vamos aplicar conselhos a tudo , independentemente do nome ou assinatura!
execution(* *(..))
Então, claramente, devemos ter cuidado porque há muito poder aqui, mas este não é um argumento contra aspectos - é um argumento para cautela, porque há muito poder aqui e a correspondência de padrões pode facilmente dar errado (basta pressionar o seu mecanismo de busca favorito para aop bugs e divirta-se).
Então, aqui está o que parece ser um argumento relativamente seguro:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
Isso fornece conselhos explicitamente se forem encontrados métodos nomeados setX
ou setY
em um Point
objeto. Os métodos podem receber apenas int
s e devem ser void
. Parece bem seguro, certo? Bem, isso é seguro se esses métodos existirem e você aplicou o conselho correto. Se não, muito ruim; falha silenciosamente.
Para dar um exemplo, um amigo estava tentando depurar um aplicativo Java em que todos de vez em quando retornavam dados incorretos. Foi uma falha infreqüente e não parecia estar correlacionada com nenhum evento ou dados em particular. Foi um bug de segmentação, algo notoriamente difícil de testar ou detectar. Acontece que eles estavam usando aspectos para bloquear métodos e torná-los "seguros para threads", mas um programador renomeou um método e um pointcut falhou em correspondê-lo, causando uma interrupção silenciosa do aplicativo.
Assim, digo às pessoas que, se precisam usar AOP, para tratar aspectos como exceções: em um sistema bem projetado e se nada der errado, eles podem ser removidos e o software ainda funciona corretamente. No entanto, se a funcionalidade do programa depender da AOP, você introduzirá uma fragilidade injustificada no seu programa.
Assim, o log, a depuração e o rastreamento são ótimos exemplos de comportamentos perfeitos para aspectos, mas segurança? Não. Segurança de rosca? Não.
Para uma alternativa robusta à AOP, consulte Características . Em vez de serem apegados ao idioma, eles são integrados diretamente a ele, não precisam de um IDE "sensível a características" (embora possa ajudar) e apresentam falhas no tempo de compilação se os métodos necessários não estiverem presentes. As características fazem um trabalho muito mais limpo ao lidar com a separação de preocupações, porque o problema foi melhor definido desde o início. Eu os uso extensivamente e eles são fantásticos.