La programación orientada a aspectos (POA) es un paradigma de programación que basa su filosofía en tratar las obligaciones transversales de nuestros programas como módulos separados (aspectos) para lograr una correcta separación de responsabilidades. Una obligación transversal es aquella que se repite en varias partes de un programa independientemente de si las secciones en las que aparece tienen relación directa; imagina un método que actualice lo que se muestra en la pantalla de un programa de dibujo, este puede ser llamado desde los métodos encargados de dibujar algo en pantalla, hasta métodos encargados de recortar, redimensionar, guardar, exportar, deshacer, etc.
Información de la POA
Aunque es un paradigma relativamente moderno, tuvo muchas influencias que le ayudaron a marcar unas bases muy sólidas, entre las que cabe resaltar la reflexión computacional, programación adaptativa y la programación orientada a objetos (POO).
Con la programación orientada a objetos (POO) cambiamos nuestra forma de pensar para abstraer problemas de una forma más simbólica para el humano, ahora los objetos eran los que manipulaban los datos, y las clases son las que nos ofrecen sus funcionalidades. Con la POA tomamos un enfoque un tanto parecido al de la POO pero con la sutil diferencia que la POA nos dice que si alguna funcionalidad de nuestro código se repite en diferentes módulos, lo mejor sería extraerla del programa principal y hacer de ella un aspecto en lugar de crear jerarquías complicadas.
A primera impresión pareciera que la POA es un intento desesperado de complicarnos la POO puesto que las interfaces, la herencia y algunos otros enfoques podrían suplir “fácilmente” lo que nos ofrecen los aspectos… Pero eso no es completamente cierto. Aunque puedes modificar cualquier código que usa POA para que no haga uso de ella, o simplemente puedes ignorar su existencia y no programar nunca en ese paradigma, hay ciertas ventajas que esta nos proporciona que otros paradigmas no nos brindan.
Continuemos con el ejemplo de la pantalla que necesita ser actualizada. Imagina que estás desarrollando un programa de dibujo profesional; cada que realizas un cambio en el lienzo, necesitas actualizarlo para que muestre los cambios efectuados. Podrías crear un método update() que sea llamado después de que se ejecuten aquellos encargados de modificar algo en pantalla. Si tu programa permite utilizar 100 formas de dibujo diferentes (entre líneas, formas geométricas, mano alzada, etc.), estaríamos hablando de que tendrías que agregar 100 llamados a update(). Por si eso fuera poco, aún te faltan agregar los llamados después de que se apliquen filtros, recortes, insertes imágenes, borres contenido, etc. Para no repetir todas esas líneas de código o agregar jerarquías confusas y complicadas, la POA nos dice que el método update() debería ser separado del código principal para transformarlo en un aspecto y, de ese modo, poder decirle al compilador o intérprete:
Después de un método cuyo identificador inicie con ‘set’ o ‘draw’, haz un llamado al aspecto update
De ese modo nos ahorramos las líneas de código que hubieran resultado de hacer uso de herencia, interfaces, ciclos anidados, validaciones o cualquier alternativa que se te ocurra.
El fuerte de la POA se obtiene al combinarla con otros paradigmas de programación, así compensamos las deficiencias de uno con las fortalezas de otro. Entre todos los paradigmas, la POO es el más popular con el que se suele combinar, es por eso que puedes encontrar fácilmente implementaciones de POA para C++, Java y Perl.
Conceptos de POA
Los siguientes 3 conceptos son los más importantes de la programación orientada a aspectos general:
- Aspecto (aspect): funcionalidad transversal (se repetirá a lo largo del sistema) que será implementada de forma separada. Es el concepto principal de este paradigma puesto que representa la sección de código que se separó del resto del programa.
- Punto de corte (pointcut): es el que se encarga de especificar mediante expresiones regulares (regex) en qué parte del programa se debe de insertar un aspecto.
- Consejo (advice): es el código que ejecutará el aspecto (cuerpo del algoritmo).
Ventajas y desventajas (pros y contras) de la POA
Como cualquier paradigma, este tiene una serie de ventajas y desventajas. Una de las principales desventajas que vale la pena mencionar aparte de las demás es que sufre de un antipatrón de diseño: acciones a distancia. Esto ocurre porque algunas partes de código (los aspectos) están en contacto con varias secciones de código completamente diferentes, lo cual vuelve muy complicado identificar operaciones de una parte del programa que pudieron haber realizado una tarea errónea, o simplemente vuelve muy complicado identificar el orden de ejecución del mismo. En seguida te presento una serie de ventajas y desventajas generales de la POA:
Ventajas:
- Provee una fuerte herramienta para modularizar programas sin importar lo extensos y complicados que estos sean.
- Vuelve más limpio el código fuente.
- Permite agilizar el proceso de creación de programas cuando muchas personas están involucradas en el mismo proyecto, y/o están en lugares geográficos diferentes.
- Puede mezclarse con cualquier otro paradigma de programación.
- Permite la comunicación entre diferentes lenguajes de programación que comparten aspectos.
Desventajas:
- Sufre de un antipatrón de diseño: acciones a distancia.
- Vuelve difícil de comprender el código puesto que el programa hace tareas que no están en los métodos que deberían estar.
- Es un poco complicado identificar cuándo es óptimo utilizar POA de forma eficiente.
Enlaces de interés
Te comparto unas implementaciones de POA para algunos lenguajes de programación que podrían interesarte:
¿Cuál sería la diferencia entre usar la POA y la programación funcional? Según veo, la POA es como intentar darle características del paradigma funcional a la POO.
Hola, Luis.
Son dos paradigma completamente distintos. En la POA podemos decir que «cortas» repeticiones de código de tu programa para crear un Aspecto. Pero no agregas una «llamada» a él en cada parte de tu programa principal de donde «cortaste» código, sino que especificas mediante reglas en qué partes del código se va a repetir este Aspecto.
Por otro lado la programación funcional es cambiar un poco (o «un mucho») tu forma de ver el problema para ahora tratarlo puramente como expresiones y declaraciones matemáticas sin cambiar estados o variables mutables.
Creo que la confusión podría venir de que cuando escuchamos Programación «Funcional», podemos pensar de inmediato que se trata de hacer programas usando funciones… Y hasta cierto punto es cierto, sin embargo, estas funciones siguen unas reglas y conceptos un tanto diferentes basados en fundamentos matemáticos, a pesar de que su propósito principal pueda ser el mismo que el que tendrían en otros paradigmas de programación.
Si tienes cualquier otra duda o aclaración no dudes en expresarla y te responderé a la brevedad.
¡Gracias por leernos!