Programación Orientada A Aspectos:POA Ejemplos con AspectJ con eclipse Carlos A. Escobar González. cescobargonzalez@gmail.com CONTENIDO • Introducción. • Programación orientada a aspectos (POA). • Conceptos básicos • Lenguajes de Aspectos • AspectJ INTRODUCCIÓN • Técnicas de programación imperativa • Código donde no existía separación de conceptos, datos y funcionalidad se mezclaban sin una línea divisoria clara. Funciones y datos entremezclados. Etapa código spaghetti Software= Datos(formas) + Funciones(colores) INTRODUCCIÓN • Programación Funcional • Luego se aplicó la llamada descomposición funcional, ‘divide y vencerás’, identificando partes como funciones que definen en el dominio del problema. Ventaja: fácil integrar funciones. Desventajas: datos compartidos, y datos esparcidos por todo el código. Software= Datos(formas) + Funciones(colores) INTRODUCCIÓN • Programación OO • Principio de descomposición, se ajusta mejor a problemas del dominio real. Ventaja: fácil integrar nuevos datos. Desventajas: Funciones esparcidas por todo el código. Software= Datos(formas) + Funciones(colores) INTRODUCCIÓN • Separación de Incumbencias(separation of concerns) • Incumbencias: diferentes temas, asuntos o aspectos de los que es necesario ocuparse para resolver un problema determinado. • Ejemplos: La función específica de la aplicación, persistencia, distribución, replicación, sincronización, logging, autenticación, seguridad, entre otros. • Objetivo: calidad de Software (adaptabilidad, fácil mantenimiento, reusabilidad y extensibilidad) INTRODUCCIÓN • Incumbencias Transversales(crosscuting concerns) • Conceptos diseminados en el código atravesando partes del sistema no relacionados en el modelo. • Ejemplos: Logging o registro de la actividad de una aplicación, acceso a base de datos, temas relacionados con la seguridad, concurrencia, etc. INTRODUCCIÓN • Logging en apache tomcat(no es modular) •Líneas rojas: código que maneja Logging •No está en un solo lugar •No siempre en número pequeño de lugares INTRODUCCIÓN • Problemas de Diseño código disperso (scattered code) Un mismo servicio es invocado de manera similar desde muchas partes del programa código enmarañado (tangled code). Una misma operación tiene que acceder a varios servicios (logging, locking, transporte, presentación, autenticación, seguridad, etc), además de cumplir con su función específica. INTRODUCCIÓN • Una Solución POA. Código disperso y enredado Aspectos PROGRAMACIÓN ORIENTADA A ASPECTOS Programación Orientada a Aspectos (POA) es un paradigma cuya intención es permitir una adecuada modularización de las aplicaciones, posibilitando mejor separación de incumbencias. Separa componentes de aspectos creando un mecanismo para abstraerlos y componerlos para formar todo el sistema. AOP, “Aspect-Oriented Programming” o AOSD, por Aspect-Oriented Software Development Introducido por colaboración de: Cristina Lopes y Karl J. Lieberherr con Gregor Kiczales y su grupo PROGRAMACIÓN ORIENTADA A ASPECTOS • Un componente es aquella propiedad que se puede encapsular claramente en un procedimiento(un objeto, un método, un API), mientras que un aspecto no se puede encapsular en un procedimiento con los lenguajes tradicionales. Software= Datos(formas) + Funciones(colores) Descomposición en Aspectos PROGRAMACIÓN ORIENTADA A ASPECTOS ASPECTO: • Cada funcionalidad común se encapsulará en una entidad (Aspecto). • Unidad modular del programa que aparece en otras unidades funcionales del programa (G. Kiczales). • Una incumbencia transversal modularizada. • Los aspectos son propiedades que afectan al rendimiento o la semántica de los componentes. • Ejemplos: los patrones de acceso a memoria, la sincronización de procesos concurrentes, el manejo de errores, etc. PROGRAMACIÓN ORIENTADA A ASPECTOS Fundamentos de la POA • Un lenguaje para definir la funcionalidad básica, conocido como lenguaje base. El mismo puede ser un lenguaje imperativo, o no. Por ejemplo C++, Java, PHP, Python, Perl, etc. • Uno o varios lenguajes de aspectos, para especificar el comportamiento de los distintos aspectos. Algunos ejemplos son AspectJ, AspectC, phpAspect, Aspyct, Aspect, Cool, RIDL, etc. • Un tejedor de aspectos, del inglés weaver, que se encarga de combinar los lenguajes (componentes y aspectos) en tiempo de ejecución o de compilación. PROGRAMACIÓN ORIENTADA A ASPECTOS Estructura de un Programa Orientado a Aspectos PROGRAMACIÓN ORIENTADA A ASPECTOS Programa Lenguaje Compilador/Intérprete Ejecutable Estructura tradicional Programa de componentes Lenguaje base Programa de aspectos ... Programa de aspectos Lenguaje de aspectos ... Lenguaje de aspectos Tejedor (Weaver) Ejecutable Estructura con aspectos PROGRAMACIÓN ORIENTADA A ASPECTOS Programa Base TEJEDOR Sistema Final aspectos PROGRAMACIÓN ORIENTADA A ASPECTOS class Framew orks sistema base Sistema aspectual «merge» «flow» BD PROGRAMACIÓN ORIENTADA A ASPECTOS Conceptos básicos Aspect (aspecto) es la funcionalidad que se cruza a lo largo de la aplicación y que se va a implementar de forma modular y separada del resto del sistema. Joint point (punto de enlace) es el punto de ejecución dentro del sistema donde un aspecto puede ser conectado. Puede ser una llamada a un método, el lanzamiento de una excepción o la modificación de un campo. Pointcut (punto de corte) define los Advice (consejos) que se aplicarán a cada punto de enlace. PROGRAMACIÓN ORIENTADA A ASPECTOS Conceptos básicos Advice (consejo) es la implementación del aspecto. Introducciones (introduction) permiten cambiar la estructura de clases de un programa agregando o extendiendo interfaces y clases con nuevos atributos, constructores o métodos LENGUAJES DE ASPECTOS • Lenguajes de aspectos de dominio específico: soportan uno o más de los aspectos mencionados en secciones anteriores (distribución, coordinación, manejo de errores, etc), pero no pueden soportar otros aspectos distintos de aquellos para los que fueron diseñados. Restringen el lenguaje base. Ejemplo: COOL (aspectos de sincronización) y RIDL (aspectos de distribución) define qué datos y cómo éstos son enviados en invocaciones de métodos entre distintos ambientes de ejecución LENGUAJES DE ASPECTOS • Lenguajes de aspectos de dominio general: diseñados para ser utilizados con cualquier clase de aspecto, no solamente con aspectos específicos. Por lo tanto, no pueden imponer restricciones en el lenguaje base. • • • • • Ejemplo: AspectJ que utiliza Java como Base. Aspect (http://search.cpan.org/perldoc?Aspect) Perl phpAspect (http://phpaspect.org/) Php Aspyct AOP (http://aspyct.sourceforge.net/) Python SpringFramework 2.5 • (http://static.springframework.org/spring/docs/2.5.x/reference/aop.html) AspectC, AspectC++, AspectS de Squeak/Smalltalk PROGRAMACIÓN ORIENTADA A ASPECTOS Ventajas: • Código menos enmarañado, más natural y más reducido. • Mayor facilidad para razonar sobre los conceptos, ya que están separados y tienen una dependencia mínima. • Facilidad en depurar y modificar el código. • Modificaciones grandes en la definición de una materia tenga un impacto mínimo en las otras. • Código más reusable y que se puede acoplar y desacoplar cuando sea necesario. PROGRAMACIÓN ORIENTADA A ASPECTOS Desventajas: • El diseño de los puntos de enlace entre los aspectos es más complejo. • Se debe tener en cuenta el análisis de nuevas características dentro del desarrollo de sistemas. • Surgen nuevos problemas de choque entre el lenguaje base y el lenguaje funcional. • Pueden existir problemas de herencia de un aspecto a otro. ASPECTJ (I) AspectJ es una extensión orientada a aspectos de Java que permite el diseño modular de incumbencias transversales. El proyecto AspectJ Development Tools desarrollado por Eclipse ofrece una herramienta basada en el apoyo a DSOA con AspectJ: AJDT. ANATOMÍA DE UN ASPECTO aspect MyCrosscuttingConcern{ //Attributes //Methods //Poincuts //Advices } JOINPOINTS (I) • Los puntos de unión son puntos en la ejecución de un programa. • Es importante recalcar que los puntos de unión no son posiciones en el código fuente (ni dentro de una instrucción, ni entre instrucciones), sino en la ejecución del programa – Método de ejecución – Método de llamado – Construcción de objetos JOINPOINTS (II) Método de ejecución El joinpoint por método de ejecución identifica ciertas ejecuciones de métodos en el programa. La firma es la siguiente: execution(method_modifiers ClassName.MethodName(ParametersNumber)) JOINPOINTS (III) Método de llamado El joinpoint por método de llamado identifica ciertos llamados de métodos en el programa. La diferencia con el joinpoint por método de ejecución es el contexto: este joinpoint accede al contexto del llamado y no mira el contexto de ejecución La firma es la siguiente: call(method_modifiers ClassName.MethodName(ParametersNumber)) JOINPOINTS (IV) Joinpoint de construcción Este joinpoint identifica las construcciones de objetos en el programa. La firma puede ser como sigue: call(new(ClassName (ParametersNumber))) execution(new(ClassName (ParametersNumber))) POINTCUTS (I) Basados en la enumeración explícita de un conjunto de firmas de métodos. Por ejemplo: call(void MiClase.metodoX(int)) Elige cada punto de enlace que es un llamado (call) al método con la firma void MiClase.metodoX(int)es decir, el método void metodoX de MiClase con un único parámetro int. POINTCUTS (II) Un pointcut puede componerse de otros pointcuts con and, or, y not (&&, ||, y !). Por ejemplo: call(void MiClase.metodoX(int)) || Call(void MiClase.metodoY(int)) Elige cada punto de unión que es un llamado al método metodoX(int)o al método metodoY de MiClase con un único parámetro int. POINTCUTS (III) Los pointcuts pueden identificar los puntos de enlace de muchos tipos diferentes. Por ejemplo: call(void MiClase.metodoX(int)) || call(void MiClase.metodoY(int)) || call(void MiOtraClase.metodoXY(int,int))|| call(void TuClase.metodoZ(MiClase)) || call(void TuClase.metodoW(MiClase)); selecciona cada punto de enlace que es una llamada a uno de los cinco métodos . POINTCUTS (IV) En el ejemplo el pointcut mi_pointcut captura todos los puntos de enlace. pointcut mi_pointcut(): call(void MiClase.metodoX(int)) || call(void MiClase.metodoY(int)) || call(void MiOtraClase.metodoXY(int,int))|| call(void TuClase.metodoZ(MiClase)) || call(void TuClase.metodoW(MiClase)); POINTCUTS (V) Property-based crosscutting AspectJ también proporciona mecanismos que permiten especificar un pointcut en términos de propiedades de métodos distintos de su nombre exacto; usando un comodín (*) en ciertos campos del nombre del método. POINTCUTS (VI) Por ejemplo: call(void MiClase.metodo*(..)) Selecciona cada punto de unión que es un llamado a un método sin valor de retorno definido en MiClase cuyo nombre inicia con "metodo" sin importar los parámetros del método. Implica el llamado de los métodos metodoX y metodoY ADVICE (I) Para implementar efectivamente el comportamiento transversal, usamos advice. Es el comportamiento adicional que se añade a la estructura de ejecución; permite definir qué hacer, es un mecanismo similar a un método de una clase. Reúne un pointcut (para elegir puntos de enlace) y un cuerpo de código (para que se ejecute en cada uno de los puntos de enlace). ADVICE (II) Before advice Se ejecuta antes de que se alcance un punto de enlace; before(): mi_pointcut() { // cuerpo adicional } ADVICE (III) After advice en un punto de enlace particular se ejecuta después de que el programa proceda con ese punto de enlace. after(): mi_pointcut() { // cuerpo adicional } package ejemplo; public class HW { private String mensaje; public HW() { this.mensaje = “Hello World“; } public void setMensaje(String M) { this.mensaje = M; } public String getMensaje() { return this.mensaje; } public void showMensaje() { System.out.println(this.mensaje); } } public class HelloWorld { public static void main(String[] args) { HW H; H= new HW(); H.showMensaje(); } } EJEMPLO public aspect Aspecto { pointcut mensajesAImprimir() : call (void HW.showMensaje()); before(): mensajesAImprimir() { System.out.println(“Hola a todos"); } after(): mensajesAImprimir() {System.out.println(“Chao a todos"); } } JAVA BASE EJEMPLO COOL ASPECTJ EJEMPLO Conclusión Se trata de permitir que los programadores escriban programas que, en todo lo que sea posible, se parezcan a su diseño Gregor Kiczales RECURSOS +Info sobre POA: http://www.aosd.net/ http://www.eclipse.org/aspectj/ Eclipse: http://www.eclipse.org/ AJDT: http://www.eclipse.org/ajdt/ APLAUSOS GRACIAS