ventajas - ¿Utiliza AOP(Programación Orientada a Aspectos) en el software de producción?
programacion orientada a aspectos ventajas y desventajas (10)
Python admite AOP permitiéndole modificar dinámicamente sus clases en tiempo de ejecución (que en Python se suele llamar monopatching en lugar de AOP). Estos son algunos de mis casos de uso de AOP:
Tengo un sitio web en el que cada página se genera mediante 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 que se llame a cada función, hago la comprobación de sesión apropiada y la redirecciono si es necesario.
Me gustaría hacer un poco de registro y creación de perfiles en un conjunto de funciones en mi programa durante su uso real. AOP me permite calcular el tiempo y los datos de impresión para registrar archivos sin modificar realmente ninguna de estas funciones.
Tengo un módulo o clase lleno de funciones que no son seguras para subprocesos y me encuentro utilizándolo en algunos códigos de subprocesos múltiples. Algunos AOP agregan bloqueo alrededor de estas llamadas a funciones sin tener que ingresar a la biblioteca y cambiar nada.
Este tipo de cosas no aparece muy a menudo, pero cada vez que lo hace, monkeypatching es MUY útil. Python también tiene decoradores que implementan el patrón de diseño Decorator ( http://en.wikipedia.org/wiki/Decorator_pattern ) para lograr cosas similares.
Tenga en cuenta que las clases que modifican dinámicamente también pueden permitirle solucionar errores o agregar funciones a una biblioteca de terceros sin tener que modificar esa biblioteca. Casi nunca necesito hacer esto, pero las pocas veces que ha salido ha sido increíblemente útil.
AOP es un paradigma de programación interesante en mi opinión. Sin embargo, no ha habido discusiones al respecto aquí en stackoverflow (al menos no pude encontrarlos). ¿Qué piensas al respecto en general? ¿Usas AOP en tus proyectos? ¿O crees que es más bien una tecnología de nicho que no existirá por un largo tiempo o no se convertirá en la corriente principal (como hizo OOP, al menos en teoría)?
Si usa AOP, infórmenos qué herramientas usa también. ¡Gracias!
Sí.
Las preocupaciones ortogonales, como la seguridad, se hacen mejor con intercepción tipo AOP. Si eso se hace automáticamente (a través de algo así 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 del método estilo AOP. Usted decora sus métodos de prueba con estos atributos, y justo antes y después de que se ejecute el método de prueba, se invoca su código. Se puede usar para cosas como configurar una base de datos y retrotraer los resultados, cambiar el contexto de seguridad en el que se ejecuta la prueba, etc.
Otro ejemplo: los atributos de filtro en ASP.NET MVC también actúan como interceptores de método estilo AOP especializados. Una, por ejemplo, le permite decir cómo deben tratarse los errores no administrados, 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 la caja" o mediante el uso de extensiones.
Usamos aspectJ en uno de mis grandes proyectos durante bastante tiempo. El proyecto estaba compuesto por varios servicios web, cada uno con varias funciones, que era el front-end para un complicado sistema de procesamiento / consulta de documentos. En algún lugar alrededor de 75k líneas de código. Usamos aspectos para dos piezas de funcionalidad relativamente menores.
Primero fue el seguimiento del flujo de aplicaciones. Creamos un aspecto que se ejecutó antes y después de cada llamada de función para imprimir la función "ingresada" y la función "salir". Con el selector de función (¿no es que recuerde el nombre correcto?), Pudimos utilizarlo como una herramienta de depuración, seleccionando solo las funciones que queríamos rastrear en un momento dado. Este fue un buen uso para los aspectos de nuestro proyecto.
Lo segundo que hicimos fue métricas específicas de la aplicación. Ponemos aspectos en torno a nuestros métodos de servicio web para capturar el tiempo, la información del objeto, etc. y volcar los resultados en una base de datos. Esto estuvo bien 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 acerca de algunas buenas soluciones que los aspectos pueden traer a la mesa, pero aún no estoy convencido de que realmente puedan hacer algo que usted no podría hacer (tal vez mejor) con tecnología "normal". Por ejemplo, no podía pensar en ninguna característica o funcionalidad importante que necesitaran ninguno de nuestros proyectos que no se pudiera hacer tan fácilmente sin aspectos, donde he encontrado aspectos útiles que son el tipo de cosas menores que he mencionado .
Uso mucho AOP en mis aplicaciones de C #. No soy un gran fanático de tener que usar Attributes, entonces usé Castle DynamicProxy y Boo para aplicar aspectos en el tiempo de ejecución sin contaminar mi código
En Terracotta utilizamos la instrumentación AOP y bytecode bastante extensamente para integrar e instrumentar software de terceros. Por ejemplo, nuestra integración de primavera se logra en gran parte mediante el uso de aspectwerkz . En pocas palabras, debemos interceptar las llamadas a los frijoles Spring y las fábricas de frijoles en varios puntos para agruparlas.
Entonces, AOP puede ser útil para integrar con código de terceros que de otra manera no se puede modificar. Sin embargo, descubrimos que hay un gran escollo; si es posible, solo use la API pública de terceros en sus puntos de unión; de lo contrario, corre el riesgo de que su código se interrumpa mediante un cambio a algún método privado en la siguiente versión menor, y se convierta en una pesadilla de mantenimiento.
AOP y demarcación de transacciones es una combinación hecha en el cielo. Usamos las anotaciones de Spring AOP @Transaction, lo que hace que la dexicación de tx sea más fácil e intuitiva que nunca.
Utilizamos AOP en nuestra fachada de sesión para proporcionar un marco coherente para que nuestros clientes personalicen nuestra aplicación. Esto nos permite exponer un único punto de personalización sin tener que agregar soporte manual para cada método.
Además, AOP proporciona un único punto de configuración para la configuración de transacciones adicionales y el desmontaje, y las cosas de registro habituales. En total, 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 le permite al host examinar las propiedades de un script antes de decidir si cargar el script en el dominio de aplicación o no. Como algunos de los scripts son bastante engorrosos, esto hace que la carga sea mucho más rápida en el tiempo de ejecución.
También usamos y planeamos utilizar un número significativo de atributos para cosas como el control del compilador, el control del flujo y la depuración del IDE, que no necesitan ser parte de la aplicación final distribuida.
No entiendo cómo uno puede manejar preocupaciones transversales como el registro, la seguridad, la gestión de transacciones, el manejo de excepciones de manera limpia sin usar AOP.
Cualquiera que use el marco Spring (probablemente alrededor del 50% de los desarrolladores empresariales Java) está usando AOP, lo sepan o no.
Usamos PostSharp para nuestra solución de AOP. Tenemos aspectos de caché, manejo de errores y reintento de la base de datos que usamos actualmente y estamos en el proceso de hacer que nuestras comprobaciones de seguridad sean un Aspecto.
Funciona muy bien para nosotros A los desarrolladores realmente les gusta la separación de las preocupaciones. A los arquitectos realmente les gusta tener la lógica de nivel de plataforma consolidada en un solo lugar.
La biblioteca PostSharp es un compilador de publicaciones que realiza la inyección del código. Tiene una biblioteca de intercepciones predefinidas que son fáciles de implementar. Se siente como un cableado en los controladores de eventos.