Programacion Orientada a Aspectos

Introduccion

La '''Programación Orientada a Aspectos''' (AOP) es un paradigma de programación que surje para resolver una de las limitaciones del paradigma de la programación orientada a objetos: una deficiente separación de conceptos para aquellos "aspectos" de un programa que escapan del alcance de la funcionalidad del dominio del problema: gestión de conexiones a bases de datos o servidores, tratamiento de sistemas de logs o trazas de mensajes, etc. Este código está disperso a lo largo de diferentes objetos del programa (siendo buena parte de las veces el mismo código repetido) lo que dificulta su mantenimiento.

La programación orientada a aspectos surge para resolver el problema de la "dispersión de código" existente en la programación orientada a objetos para aquellos aspectos de un programa que no tienen que ver directamente con el dominio de negocio del problema: gestión de conexiones, trazas de mensajes, sincronización y concurrencia, manejo de errores y excepciones, etc.

Otro problema que puede aparecer, es que un mismo módulo implemente múltiples comportamientos o aspectos del sistema de forma simultánea. Este problema se conoce como código enmarañado, y afecta a la cohesión del módulo. El hecho es que hay ciertas decisiones de diseño que son difíciles de capturar, debido a que determinados problemas no se pueden encapsular claramente de igual forma que los que habitualmente se resuelven con funciones u objetos.Con las descomposiciones tradicionales no se aislan bien estos otros aspectos,
sino que quedan diseminados por todo el sistema enmarañando el código que implementa la funcionalidad básica, y yendo en contra de la claridad del mismo. Se puede afirmar entonces que las técnicas tradicionales no soportan bien la separación de competencias para aspectos distintos de la funcionalidad básica de un sistema, y que esta situación claramente tiene un impacto negativo en la calidad del software.

La programación orientada a aspectos (POA) es una nueva metodología de programación que aspira a soportar la separación de competencias para los aspectos antes mencionados. Es decir, que intenta separar los componentes y los aspectos unos de otros, proporcionando mecanismos que hagan posible abstraerlos y componerlos para formar todo el sistema. En definitiva, lo que se persigue es implementar una aplicación de forma eficiente y fácil de entender.

POA es un desarrollo que sigue al paradigma de la orientación a objetos, y como tal, soporta la descomposición orientada a objetos, además de la procedimental y la descomposición funcional. Pero, a pesar de esto, POA no se puede considerar como una extensión de la POO, ya que puede utilizarse con los diferentes estilos de programación ya mencionados.

Objetivos básicos de la AOP.

Entre los objetivos que se ha propuesto la programación orientada a aspectos están principalmente el de separar conceptos y el de minimizar las dependencias entre ellos. Con el primer objetivo se consigue que cada cosa esté en su sitio, es decir, que cada decisión se tome en un lugar concreto, con el segundo se tiene una pérdida del acoplamiento entre los distintos elementos. De la consecución de estos objetivos se pueden obtener las siguientes ventajas:

  • Un código menos enmarañado, más natural y más reducido.
  • Una mayor facilidad para razonar sobre las materias, ya que están separadas y tienen una dependencia mínima.
  • Más facilidad para depurar y hacer modificaciones en el código.
  • Se consigue que un conjunto grande de modificaciones en la definición de una materia tenga un impacto mínimo en las otras.
  • Se tiene un código más reusable y que se puede acoplar y desacoplar cuando sea necesario.

Concepto de Aspecto.

Un aspecto es una abstracción soportada por un lenguaje orientado a aspectos que permite representar aquellos elementos que se diseminan por todo el sistema.

Una de las primeras definiciones que aparecieron del concepto de aspecto fue publicada en 1995, y se describía de la siguiente manera: Un aspecto es una unidad que se define en términos de información parcial de otras unidades.

La definición de aspecto ha evolucionado a lo largo del tiempo, pero con la que se trabaja actualmente es la siguiente: Un aspecto es una unidad modular que se disemina por la estructura de otras unidades funcionales.

Los aspectos existen tanto en la etapa de diseño como en la de implementación. Un aspecto de diseño es una unidad modular del diseño que se entremezcla en la estructura de otras partes del diseño. Un aspecto de programa o de código es una unidad modular del programa que aparece en otras unidades modulares del programa (G. Kiczales).

De manera más informal podemos decir que los aspectos son la unidad básica de la POA, y pueden definirse como las partes de una aplicación que describen las cuestiones claves relacionadas con la semántica esencial o el rendimiento. También pueden verse como los elementos que se diseminan por todo el código y que son difíciles de describir localmente con respecto a otros componentes.

Se puede diferenciar entre un componente y un aspecto viendo al primero como aquella propiedad que se puede encapsular claramente en un procedimiento, mientras que un aspecto no se puede encapsular en un procedimiento con los lenguajes tradicionales.

Los aspectos no suelen ser unidades de descomposición funcional del sistema, sino propiedades que afectan al rendimiento o la semántica de los componentes. Algunos ejemplos de aspectos son, los patrones de acceso a memoria, la sincronización de procesos concurrentes, el manejo de errores, etc.

Puntos de enlace (join points).

Está claro que hay una relación entre los componentes y los aspectos, y que por lo tanto, el código de los componentes y de estas nuevas unidades de programación tienen que interactuar de alguna manera. Para que ambos (aspectos y componentes) se puedan mezclar, deben tener algunos puntos comunes, que son los que se conocen como puntos de enlace, y debe haber algún modo de mezclarlos.

Los puntos de enlace son una clase especial de interfaz entre los aspectos y los módulos del lenguaje de componentes. Son los lugares del código en los que éste se puede aumentar con comportamientos adicionales. Estos comportamientos seespecifican en los aspectos.

El código del aspecto será insertado en el flujo de ejecución de la aplicación para añadir su funcionalidad.

El tejedor

El encargado de realizar el proceso de mezcla del código de los aspectos con el código de los objetos que implementan la funcionalidad básicas del sistema se conoce como tejedor (del término inglés weaver). El tejedor se encarga de mezclar los diferentes mecanismos de
abstracción y composición que aparecen en los lenguajes de aspectos y componentes ayudándose de los puntos de enlace.

El entrelazado de clases y aspectos puede ser dinámico o estático.

Cortes (pointcut).

Un corte, dentro de la terminología de la orientación a aspectos, es un predicado que casa o está asociado a puntos de enlace. El corte tendrá asociado un aviso, que será ejecutado en cualquier enlace que case con el corte. El concepto de "enlace" como entidad asociada a cortes es uno de los conceptos claves de la AOP.

Avisos (advice).

Un aviso es una especie de trigger o función, desencadenada por un aspecto en un enlace (joint point) dterminado.
Las declaraciones de avisos (advice) definen partes de la implementación del aspecto que se ejecutan en puntos bien definidos. Estos puntos pueden venir dados bien por cortes con nombre, bien por cortes anónimos.

Introducciones.

Las introducciones (introduction) se utilizan para introducir elementos completamente nuevos en las clases dadas. Entre estos elementos podemos añadir:

  • Un nuevo método a la clase.
  • Un nuevo constructor.
  • Un atributo.
  • Varios de los elementos anteriores a la vez.
  • Varios de los elementos anteriores en varias clases.

Herramientas AOP

  1. AspectJ
  2. AOP con SpringFramework 2.5 es un framework Java que permite programar con Aspectos utilizando sintaxis Java.

Referencias bibliográficas.

G. Kiczales, J. Lamping, A. Mendhekar, C. Maeda, C. Lopes, J. Loingtier and J. Irwin, Aspect-Oriented Programming, Xerox Palo Alto Research Center, 1997

Visión General de la Programación Orientada a Aspectos. Antonia Mª Reina Quintero

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License