Llegué tarde al juego, pero proporciono esto para desarrolladores posteriores que podrían tropezar con esta pregunta.
Recomiendo encarecidamente contra AOP si su aplicación depende de que funcione correctamente. Los aspectos funcionan así:
- Se aplica asesoramiento (comportamiento adicional) a
- Unir puntos (lugares donde se puede adjuntar el código adicional, como comenzar o finalizar un método, o cuando se desencadena un evento determinado)
- ... donde pointcut (un patrón que detecta si un punto de unión dado coincide) patrones coinciden
Para cualquiera que haya estado usando computadoras durante mucho tiempo, el hecho de que se usen patrones podría ser algo que se debe observar de cerca. Así que aquí hay un ejemplo de un punto de corte que coincide con cualquier método nombrado set
independientemente de los argumentos:
call(* set(..))
Entonces, ese es un punto de corte bastante amplio y debe quedar claro que se recomienda manejar esto con cuidado (sin juego de palabras) porque está aplicando consejos a muchas cosas.
O diablos, ¡apliquemos consejos a todo , independientemente de su nombre o firma!
execution(* *(..))
Claramente, deberíamos tener cuidado porque hay mucho poder aquí, pero este no es un argumento en contra de los aspectos: es un argumento de precaución porque hay mucho poder aquí y la coincidencia de patrones puede salir mal fácilmente (simplemente presione su motor de búsqueda favorito para Aop bugs y diviértete).
Así que aquí está lo que parece un punto de corte relativamente seguro:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
Eso proporciona consejos explícitamente si se encuentran métodos nombrados setX
o setY
en un Point
objeto. Los métodos solo pueden recibir int
sy deben ser void
. Parece bastante seguro, ¿verdad? Bueno, eso es seguro si existen esos métodos y has aplicado los consejos correctos. Si no, muy mal; silenciosamente falla.
Para dar un ejemplo, un amigo estaba tratando de depurar una aplicación Java en la que todos, de vez en cuando, devolvían datos incorrectos. Fue una falla infrecuente y no parecía estar correlacionada con ningún evento en particular o datos en particular. Fue un error de subprocesamiento, algo que es notoriamente difícil de probar o detectar. Como resultado, estaban usando aspectos para bloquear métodos y hacerlos "seguros para subprocesos", pero un programador renombró un método y un corte de punto no coincidió, lo que provocó una interrupción silenciosa de la aplicación.
Por lo tanto, les digo a las personas que si deben usar AOP, para tratar aspectos como excepciones: en un sistema bien diseñado y si nada sale mal, pueden eliminarse y el software aún funciona correctamente. Sin embargo, si la funcionalidad del programa depende de AOP, introduce una fragilidad en su programa que no está justificada.
Por lo tanto, el registro, la depuración y el seguimiento son excelentes ejemplos de comportamientos que son perfectos para aspectos, pero ¿seguridad? No Hilo de seguridad? No
Para una alternativa robusta al AOP, vea los rasgos . En lugar de estar atornillados al lenguaje, se integran directamente en él, no necesitan un IDE "con reconocimiento de rasgos" (aunque puede ayudar) y tienen fallas en tiempo de compilación si los métodos que necesita no están presentes. Los rasgos hacen un trabajo mucho más limpio al manejar la separación de preocupaciones porque el problema se definió mejor desde el principio. Los uso ampliamente y son fantásticos.