aop - programming - programacion orientada a aspectos ventajas y desventajas
¿Cuáles son las desventajas de la programación orientada a aspectos(AOP)? (7)
¿Cuáles son las desventajas posibles y críticas de la programación orientada a aspectos?
Por ejemplo: depuración críptica para novatos (impacto de legibilidad)
Con respecto al argumento de mantenimiento / depuración, la programación orientada a aspectos tiende a ir de la mano con todos los demás aspectos de las prácticas ágiles de desarrollo de software.
Estas prácticas tienden a eliminar la depuración de la imagen, reemplazándola con pruebas de unidad y desarrollo basado en pruebas.
Además, puede ser mucho más fácil mantener una huella de código pequeña y clara con un consejo que una huella de código grande e incomprensible sin consejos (el consejo es lo que transforma una huella de código grande e incomprensible en una huella de código pequeña y clara).
Creo que el mayor problema es que nadie sabe cómo definir la semántica de un aspecto , o cómo declarar puntos de unión de forma no procesal .
Si no puede definir qué hace un aspecto independientemente del contexto en el que se incrustará, o defina los efectos que tiene de tal manera que no dañe el contexto en el que está incrustado, usted (y las herramientas) ) no puede razonar sobre lo que hace de forma fiable. (Notará que el ejemplo más común de aspectos es el "registro", que se define como "escribir algunas cosas en una secuencia de registro de la que la aplicación no sabe nada", porque es bastante seguro). Esto viola el concepto clave de la ocultación de información de David Parnas. Uno de los peores ejemplos de aspectos que veo son los que insertan primitivas de sincronización en el código; esto afecta a la secuencia de posibles interacciones que el código puede tener. ¿Cómo puede saber que esto es seguro (no se bloqueará? ¿No livelock? ¿No dejará de protegerlo? Es recuperable ante una excepción lanzada en un socio de sincronización?) A menos que la aplicación solo haga cosas triviales.
Los puntos de unión ahora se definen normalmente proporcionando algún tipo de comodín de identificación (por ejemplo, "ponga este aspecto en cualquier método llamado" DataBaseAccess * ". Para que esto funcione, las personas que escriben los métodos afectados deben indicar la intención de que su código sea aspecto al nombrar su código de una manera divertida; eso no es modular. Peor aún, ¿por qué la víctima de un aspecto tiene que saber que existe? Y considere lo que sucede si simplemente cambia el nombre de algunos métodos; el aspecto ya no se inyecta donde es necesario, y su aplicación se rompe. Lo que se necesita son especificaciones de puntos de unión que son intencionales ; de alguna manera, el aspecto tiene que saber dónde se necesita sin que los programadores coloquen un letrero de neón en cada punto de uso (AspectJ tiene algo relacionado con el flujo de control). puntos de unión que parecen un poco mejores en este sentido).
Así que los aspectos son una idea bastante interesante, pero creo que son tecnológicamente inmaduros. Y esa inmadurez hace frágil su uso. Y ahí es donde radica el problema. (Soy un gran fanático de las herramientas de ingeniería de software automatizadas [ver mi biografía] pero no de esta manera).
Creo que la mayor desventaja es usar AOP bien. La gente lo usa en lugares donde no tiene sentido, por ejemplo, y no lo usa donde lo hace.
Por ejemplo, un patrón de fábrica es obviamente algo que AOP puede hacer mejor, ya que DI también puede hacerlo bien, pero el patrón de observador es más simple cuando se usa AOP, al igual que el patrón de estrategia.
Será más difícil realizar una prueba unitaria, especialmente si realiza el tejido en tiempo de ejecución.
Si se teje en el tiempo de ejecución, también se obtiene un impacto de rendimiento.
Tener una buena manera de modelar lo que sucede cuando se mezcla AOP con clases es un problema, ya que UML no creo que sea un buen modelo en ese momento.
A menos que esté utilizando Eclipse, las herramientas sí tienen problemas, pero con Eclipse y AJDT AOP es mucho más fácil.
Todavía usamos junit y nunit, por lo que tenemos que modificar nuestro código para permitir que se ejecuten las pruebas unitarias, cuando el uso del modo privilegiado AOP podría realizar mejores pruebas unitarias al probar métodos privados, y no tenemos que cambiar nuestros programas solo Para hacerlos trabajar con pruebas unitarias. Este es otro ejemplo de no entender realmente cómo AOP puede ser útil. Todavía estamos encadenados al pasado con marcos de prueba de unidad e implementaciones de patrones de diseño actuales y no vemos cómo AOP podría ayudarnos a hacer una mejor codificación.
Debido al poder de AOP, si hay un error en su corte transversal, puede causar problemas generalizados. Por otra parte, alguien podría cambiar los puntos de unión en un programa, por ejemplo, cambiando el nombre o moviendo los métodos, de una forma que el escritor del aspecto no esperaba, con consecuencias no deseadas. Una de las ventajas de las preocupaciones de modularización transversal es permitir que un programador afecte fácilmente todo el sistema.
Mantenimiento y depuración. Con aop, de repente tiene un código que se está ejecutando en un punto determinado (entrada de método, salir, lo que sea) pero solo con mirar el código, no tiene ni idea de que incluso se está llamando, especialmente si la configuración de aop está en otro archivo , como xml config. Si el consejo causa algunos cambios, entonces al depurar una aplicación, las cosas pueden parecer extrañas sin una explicación. Esto no afecta solo a los novatos.
No lo llamaría una desventaja crítica, pero el mayor problema que he visto es el de la experiencia del desarrollador y la capacidad de adaptación. No todos los desarrolladores entienden la diferencia entre programación declarativa e imperativa.
Hacemos uso del bloque de aplicación de inyección de políticas en EntLib 4.1, así como de Unity para DI, y no es algo que se hunda rápidamente para algunas personas. Me encuentro explicando una y otra vez a las mismas personas por qué la aplicación no se comporta de la forma que ellos esperan. Por lo general, los comienzan explicando algo y yo digo "vea esa declaración sobre el método". :) Algunas personas lo entienden de inmediato, lo aman y se vuelven extremadamente productivos; otras luchan.
La curva de aprendizaje no es exclusiva de AOP, pero parece tener una curva de aprendizaje más alta que otras cosas con las que se encuentra su desarrollador promedio.
- Escasa compatibilidad con las cadenas de herramientas: es posible que los depuradores, perfiladores, etc. no conozcan el AOP y que funcionen en el código como si todos los aspectos hubieran sido reemplazados por un código de procedimiento.
- Inflamación de código: una fuente pequeña puede llevar a un código objeto mucho más grande ya que el código se "entrelaza" en toda la base de código