PROGRAMACIÓN ORIENTADA A ASPECTOS.
Introducción.
A lo largo de la historia de la ingeniería de software se ha pasado por ciertas "etapas" en las que se hace uso de un concepto básico de la programación e incluso la vida diaria, dividir una gran tarea en pequeñas tareas manejables es mucho más sencillo que intentar realizar el todo, "divide y vencerás". En un inicio se tenía el código sin división alguna, datos y funcionalidades estaban mezcladas por todo el código, a esta etapa se le llama la generación del código "espaghetti":

Las formas tienen la función de representar los datos y los colores representan la funcionalidad, de ésta manera la imagen ilustra a lo que le llamamos el código "espaghetti".
Luego de ésta generación de caos en el código llegó el primer gran paso en el uso del concepto "divide y vencerás". Los desarrolladores comenzaron a identificar las partes más manejables del código y lo expresaron como funciones definidas dentro del dominio del problema:

De ésta manera se consiguió encapsular de cierta manera las funcionalidades y haciendo que el incluir una nueva función fuera mucho mas sencillo, no obstante todavía existían inconvenientes ya que la claridad de las funciones era pobre debido a la utilización de datos compartidos, por otro lado el agregar un nuevo tipo de dato se convertía en una tarea de modificar cuanta función estuviera involucrada con el nuevo dato.
Finalmente, en un intento por solucionar los problemas que dejaban los datos esparcidos por todo el código, nace la Programación Orientada a Objetos, la cual supuso un gran avance que es visible hasta el día de hoy siendo éste uno de los paradigmas de programación más importantes y usados de los últimos años. Su descomposición en objetos es mucho más acertada en el entorno real que la descomposición funcional.

Aunque la programación orientada a objetos es un paradigma de programación que resuelve bastantes problemas de la programación tradicional como el integrar nuevos datos, no es perfecta y posee innumerables problemas dado a que las funciones continúan esparcidas por todo el código y para agregar una función nueva es necesario revisar y modificar objetos.
Además, el diseño e ingeniería de software no se trata simplemente de tratar las funcionalidades básicas del problema, existen muchos otros conceptos que en la descomposición funcional y en la programación orientada a objetos son aproximados de manera poco eficiente, por ejemplo:
- La Sincronización.
- La Distribución.
- El Manejo de Errores.
- La Optimización de Memoria.
- La Gestión de la Seguridad.
Todos estos conceptos se encuentran diseminados por todo el código, a veces incluso implementados múltiples veces, por cada objeto o clase que necesite de las mismas. Un código normal, implementado con paradigmas actuales puede lucir de la siguiente manera:

La no separación de los conceptos transversales en la programación ocasiona distintos tipos de problemas como pueden ser:
- Baja correspondencia: La implementación simultánea de varios conceptos oscurece la correspondencia entre un concepto y su implementación.
- Baja productividad: Al intentar implementar varios conceptos en un mismo módulo existe la posibilidad de que el desarrollador pierda el rumbo del concepto principal por concentrarse en conceptos periféricos.
- Baja reusabilidad: Al tener en un mismo módulo implementados varios conceptos, resulta en un código poco reusable.
- Baja calidad de código: El código con múltiples conceptos entrelazados en un mismo módulo produce un código propenso a errores, por otro lado, al tener como objetivo demasiados varios conceptos es posible que se haga una mejor o peor implementación de los mismos por considerarlos más o menos importantes.
- Evolución más dificultosa: Con una implementación que no esté completamente modularizada los futuros cambios en un requerimiento implican revisar y modificar cada uno de los módulos donde esté presente ese requerimiento.
REFERENCIAS.
- Quintero, A. M. R. (2000). Visión General de la Programación Orientada a Aspectos. Departamento de Lenguajes y Sistemas Informáticos. Universidad de Sevilla.
- Gupta, L. (2015). Spring AOP – AspectJ Annotation Config Example – HowToDoInJava. [online] Howtodoinjava.com. Available at: http://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/ [Accessed 15 May 2016].
- Stackoverflow.com. (2016). Spring AOP: What's the difference between JoinPoint and PointCut?. [online] Available at: http://stackoverflow.com/questions/15447397/spring-aop-whats-the-difference-between-joinpoint-and-pointcut [Accessed 15 May 2016].
- Spinczyk, O., & Lohmann, D. (2007). The design and implementation of AspectC++. Knowledge-Based Systems, 20(7), 636-651.
- Asteasuain, F., & Contreras, B. E. (2002). Programación Orientada a Aspectos Análisis del paradigma. Departamento de Ciencias e Ingeniería de la Computación.