en la construcción de un programa sería el siguiente:
• En primer lugar, se construye una clase o componente mediante el empleo de un lenguaje de propósito general, del tipo de Java, C#, etc. en el que se modelan los atributos y funciones de negocio de la clase.
• Seguidamente, se construyen tantos aspectos como sean necesarios, mediante el empleo de un lenguaje de aspectos. Los lenguajes de aspectos permiten representar conceptos específicos de esta metodología de programación, como los puntos de unión, y pueden ser específicos o de propósito general. Un ejemplo de lenguaje de aspectos de propósito general es AspectJ, extensión de Java para programar con aspectos. También existen lenguajes de aspectos específicos, que sólo permiten crear un tipo de aspecto determinado. Tal es el caso del lenguaje COOL, desarrollado por Xerox cuya finalidad es el control de concurrencia en aplicaciones multitarea. Recientemente, incluso el excelente servidor de aplicaciones de carácter libre JBoss ha incluido una extensión para soportar programación orientada a aspectos. Esta extensión se basa en los mismos conceptos que AspecJ: pointcuts, advices, interceptors, introductions, etc.
La descomposición en aspectos que ofrece la programación orientada a aspectos
puede representarse Tróficamente como en la figura, Un aspecto es un concepto
de programación similar al de clase, pero a un nivel superior de abstracción
El lector podrá encontrar en el CD-ROM el Aspecto la principal implementación
de la programación orientada a aspectos.
En OOP se entremezcla código de negocio con código de soporte (errores, logging,
seguridad, etc.)
Por ultimo, hay que enlazar clases y aspectos, para construir una unidad compacta. Este proceso es realizado por el enlazador tal y como hemos comentado anteriormente.
Como paso previo al enlazado, hay que compilar las diferentes clases y aspectos en función de los lenguajes y enlazadores utilizados.
En principio, tanto clases como aspectos pueden escribirse con diferentes lenguajes.
El proceso de enlazado
El enlazado entre clases y aspectos para constituir un todo se puede realizar de dos formas distintas: estática y dinámica.
El enlazado estático implica la modificación del código fuente de una clase, mediante la inserción en sus puntos de unión de sentencias que permitan cubrir la funcionalidad representada
por el aspecto referenciado. Un ejemplo de enlazadores que trabajan de esta manera es el preprocesador de aspectos de AspecJ.
La principal ventaja de esta forma de enlazado es que no afecta al rendimiento del código ejecutable generado. La estructuración en aspectos pasa a ser un recurso para incrementar la legibilidad del código concentrando todas las sentencias de una determinada lógica bajo un mismo aspecto. Sin embargo, a la hora de ejecutar la aplicación, el enlazador genera los mismos archivos binarios que si hubiéramos empleado el paradigma orientado a objetos convencional.
El principal inconveniente de esta forma de trabajar es el hecho de que una vez enlazadas clases y aspectos, se pierde cualquier conocimiento sobre los aspectos puestos en juego, ya que estos han pasado a confundirse dentro del código de
las clases. Esto haría que la ligadura dinámica o el polimorfismo entre aspectos fuesen altamente ineficientes, por no decir imposibles de conseguir.
El enlazado dinámico, como se puede deducir fácilmente de su nombre, implica la ligadura entre clases y aspectos en tiempo de ejecución.
Esto implica que debe existir un conocimiento explícito de los aspectos, tanto en los procesos de compilación como de ejecución. Existen diferentes estrategias para alcanzar este fin, aunque la mayoría pasan por la composición de clases y
objetos en tiempo de ejecución.
Los aspectos en el diseño
Hasta este momento sólo nos hemos centrado en la influencia que tiene el paradigma orientado a aspectos sobre la fase de codificación, permitiendo un mayor grado de reutilización del código y una mayor legibilidad del mismo. No obstante, la orientación a aspectos también se puede llevar a fases anteriores, de forma que los aspectos pasen a ser considerados como soluciones de diseño. Esto permite realizar diseños con un mayor grado de abstracción, en el que interfaces y aspectos garanticen un mayor grado de independencia de las clases desarrolladas.
Para ello, es necesario incluir en el lenguaje UML elementos para representar aspectos (considerándolos como abstracciones del mismo nivel que las clases y las interfaces), asociaciones de generalización entre clases y aspectos (herencia de aspecto) y clases enlazadas con aspectos.
El siguiente paso natural sería la aparición de patrones de diseño de programación orientada a aspectos. En el cuadro "Enlaces de interés" podemos encontrar referencias a trabajos que tratan sobre este tema.
Beneficios adicionales de la orientación a aspectos Llegados a este punto, y antes de seguir profundizando en las características de la programación orientada a aspectos, ya nos encontramos en circunstancias de apuntar algunos de los beneficios de esta nueva metodología:
•El principal beneficio, que impulsó la creación de esta metodología, es el de evitar la presencia de código entrecruzado. La orientación a aspectos agrupa toda la funcionalidad que persigue un mismo fin bajo un mismo aspecto, obteniéndose implementaciones altamente modulares, aumentándose la cohesión y
reduciéndose el acoplamiento entre los módulos de código del sistema.
• Una consecuencia derivada es que se obtienen sistemas más fáciles de extender. Puesto que los aspectos están libres de código entrecruzado, cada vez que queramos extender la funcionalidad del sistema tan solo tendremos que crear nuevos aspectos, y asegurarnos de que se produce el enlazado con las clases a las que afecten durante la fase de compilación.
• Permite posponer algunas decisiones de diseño. Durante la fase de diseño, el analista se puede encontrar con dilemas que le obliguen a tomar decisiones sobre las que no se encuentra totalmente seguro. Por medio de la orientación a aspectos, estas decisiones se pueden retrasar hasta que lleguen nuevos
requerimientos que justifiquen la toma de estas decisiones. Hasta que llegue ese
momento, puede utilizar aspectos para modelar aquellos puntos de mayor incertidumbre.
Mayor reutilización del código. Puesto que los desarrollos con aspectos tienen una mayor medularidad, y están menos acoplados, resulta más fácil su reutilización, reduciéndose el número de líneas de código que forman el sistema.
Una implementación orientada a aspectos:
Aspectj
|