Download Programación Orientada A Aspectos:POA Aspectos:POA

Document related concepts
no text concepts found
Transcript
Programación Orientada A
Aspectos:POA
Ejemplos con AspectJ con eclipse
Carlos A. Escobar González.
[email protected]
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