¿Utiliza AOP (Programación Orientada a Aspectos) en el software de producción?

StackOverflow https://stackoverflow.com/questions/20663

  •  09-06-2019
  •  | 
  •  

Pregunta

POA Es un paradigma de programación interesante en mi opinión.Sin embargo, todavía no ha habido discusiones al respecto aquí en stackoverflow (al menos no pude encontrarlas).¿Qué opinas al respecto en general?¿Utilizas AOP en tus proyectos?¿O crees que es más bien una tecnología de nicho que no existirá por mucho tiempo o que no se generalizará (como lo hizo la programación orientada a objetos, al menos en teoría;))?

Si utiliza AOP, infórmenos qué herramientas utiliza también.¡Gracias!

¿Fue útil?

Solución

Sí.

Las cuestiones ortogonales, como la seguridad, se solucionan mejor con la interceptación estilo AOP.Si eso se hace automáticamente (a través de algo como un contenedor de inyección de dependencia) o manualmente no es importante para el objetivo final.

Un ejemplo:los atributos "antes/después" en xUnit.net (un proyecto de código abierto que ejecuto) son una forma de interceptación de métodos estilo AOP.Usted adorna sus métodos de prueba con estos atributos y, justo antes y después de que se ejecute ese método de prueba, se llama a su código.Se puede utilizar para cosas como configurar una base de datos y revertir los resultados, cambiar el contexto de seguridad en el que se ejecuta la prueba, etc.

Otro ejemplo:los atributos de filtro en ASP.NETMVC También actúan como interceptores de métodos especializados de estilo AOP.Uno, por ejemplo, le permite decir cómo se deben tratar los errores no controlados, si ocurren en su método de acción.

Muchos contenedores de inyección de dependencia, incluidos Castle Windsor y Unity, admiten este comportamiento ya sea "en el cuadro" o mediante el uso de extensiones.

Otros consejos

Python admite AOP al permitirle modificar dinámicamente sus clases en tiempo de ejecución (lo que en Python generalmente se llama monopatching en lugar de AOP).Estos son algunos de mis casos de uso de AOP:

  1. Tengo un sitio web en el que cada página es generada por una función de Python.Me gustaría tomar una clase y hacer que todas las páginas web generadas por esa clase estén protegidas con contraseña.AOP viene al rescate;Antes de llamar a cada función, realizo la verificación de sesión adecuada y redirijo si es necesario.

  2. Me gustaría registrar y crear perfiles en un montón de funciones en mi programa durante su uso real.AOP me permite calcular el tiempo e imprimir datos para registrar archivos sin modificar ninguna de estas funciones.

  3. Tengo un módulo o clase lleno de funciones que no son seguras para subprocesos y me encuentro usándolo en algún código multiproceso.Algunos AOP agregan bloqueo alrededor de estas llamadas a funciones sin tener que ir a la biblioteca y cambiar nada.

Este tipo de cosas no surgen muy a menudo, pero siempre que sucede, el parche de mono es MUY útil.Python también tiene decoradores que implementan el patrón de diseño Decorador (http://en.wikipedia.org/wiki/Decorator_pattern) para lograr cosas similares.

Tenga en cuenta que modificar clases dinámicamente también puede permitirle solucionar errores o agregar características a una biblioteca de terceros sin tener que modificar esa biblioteca.Casi nunca necesito hacer esto, pero las pocas veces que ha aparecido ha sido increíblemente útil.

No entiendo cómo se pueden manejar preocupaciones transversales como el registro, la seguridad, la gestión de transacciones y el manejo de excepciones de forma limpia sin utilizar AOP.

Cualquiera que utilice el marco Spring (probablemente alrededor del 50% de los desarrolladores empresariales de Java) está utilizando AOP, lo sepan o no.

En Terracota Usamos AOP y instrumentación de código de bytes de manera bastante extensa para integrar e instrumentar software de terceros.Por ejemplo, nuestro Integración de primavera se logra en gran parte mediante el uso aspectowerkz.En pocas palabras, necesitamos interceptar llamadas a Spring beans y a las fábricas de beans en varios puntos para poder agruparlos.

Por lo tanto, AOP puede ser útil para integrarse con código de terceros que de otro modo no se puede modificar.Sin embargo, hemos descubierto que existe un gran problema: si es posible, utilice únicamente la API pública de terceros en sus puntos de unión; de lo contrario, corre el riesgo de que su código se rompa al cambiar algún método privado en la próxima versión menor, y se convierta en Una pesadilla de mantenimiento.

AOP y la demarcación de transacciones son una combinación perfecta.Usamos anotaciones Spring AOP @Transaction, lo que hace que la demarcación de transmisión sea más fácil e intuitiva que nunca antes vista en ningún otro lugar.

Usamos aspectoJ en uno de mis grandes proyectos durante bastante tiempo.El proyecto constaba de varios servicios web, cada uno con varias funciones, que constituían la interfaz de un complicado sistema de procesamiento/consulta de documentos.Alrededor de 75.000 líneas de código.Usamos aspectos para dos piezas de funcionalidad relativamente menores.

Lo primero fue rastrear el flujo de aplicaciones.Creamos un aspecto que se ejecutaba antes y después de cada llamada a función para imprimir "función ingresada" y "función saliendo".Con el selector de funciones (¿tal vez pointcut?No recuerdo el nombre correcto) pudimos usar esto como herramienta de depuración, seleccionando solo funciones que queríamos rastrear en un momento dado.Este fue un uso realmente agradable para algunos aspectos de nuestro proyecto.

Lo segundo que hicimos fue aplicar métricas específicas.Ponemos aspectos en torno a nuestros métodos de servicio web para capturar tiempos, información de objetos, etc.y volcar los resultados en una base de datos.Esto fue bueno porque pudimos capturar esta información, pero aún así mantener todo ese código de captura separado del código "real" que hizo el trabajo.

He leído sobre algunas soluciones interesantes que los aspectos pueden aportar, pero todavía no estoy convencido de que realmente puedan hacer algo que no se podría hacer (tal vez mejor) con la tecnología "normal".Por ejemplo, no se me ocurre ninguna característica o funcionalidad importante que necesite cualquiera de nuestros proyectos que no pueda realizarse con la misma facilidad sin aspectos; donde he encontrado aspectos útiles son el tipo de cosas menores que he mencionado. .

Utilizo mucho AOP en mis aplicaciones C#.No soy un gran admirador de tener que usar Atributos, así que usé Castle DynamicProxy y Boo para aplicar aspectos en tiempo de ejecución sin contaminar mi código.

Usamos AOP en nuestra fachada de sesión para proporcionar un marco consistente para que nuestros clientes personalicen nuestra aplicación.Esto nos permite exponer un único punto de personalización sin tener que agregar soporte de enlace manual para cada método.

Además, AOP proporciona un único punto de configuración para la configuración y desmontaje de transacciones adicionales, y los elementos de registro habituales.En total, es mucho más fácil de mantener que hacer todo esto a mano.

La aplicación principal en la que trabajo incluye un host de script.AOP permite al host examinar las propiedades de un script antes de decidir si cargar o no el script en el dominio de aplicación.Dado que algunos de los scripts son bastante engorrosos, esto hace que la carga en tiempo de ejecución sea mucho más rápida.

También usamos y planeamos usar una cantidad significativa de atributos para cosas como el control del compilador, el control de flujo y la depuración en IDE, que no necesitan ser parte de la aplicación distribuida final.

Usamos PostSharp para nuestra solución AOP.Tenemos aspectos de almacenamiento en caché, manejo de errores y reintento de bases de datos que utilizamos actualmente y estamos en el proceso de convertir nuestras comprobaciones de seguridad en un Aspecto.

Funciona muy bien para nosotros.A los desarrolladores realmente les gusta la separación de preocupaciones.A los arquitectos les gusta mucho tener la lógica a nivel de plataforma consolidada en un solo lugar.

La biblioteca PostSharp es un postcompilador que inyecta el código.Tiene una biblioteca de intersecciones predefinidas que son fáciles de implementar.Se siente como cableado en controladores de eventos.

Sí, utilizamos AOP en la programación de aplicaciones.Preferiblemente uso AspectJ para integrar aop en mis aplicaciones Spring.Eche un vistazo a este artículo para obtener una perspectiva más amplia del mismo.

http://codemodeweb.blogspot.in/2018/03/spring-aop-and-aspectj-framework.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top