Proyecto integrador. Las TIC en la sociedad S4.pptx
Programación orientada a aspectos
1. Programación Orientada a
Aspectos (POA)
Expositor: Alex
http://javatutoriales.blogspot.com/
Se permite hacer preguntas en cualquier momento.
2. Agenda
31/01/2015 Alex – Programación Orientada a Aspectos2
• ¿Qué la POA?
• Objetivo de la POA
• Problemas de Otros Paradigmas
• AspectJ
• Anatomía de un Aspecto
• Ejemplos y Conceptos Importantes
3. ¿Qué es la POA?
Es un paradigma de Programación cuya intención
es permitir una adecuada modularización de las
aplicaciones y posibilita una adecuada separación
de conceptos.
31/01/2015 Alex – Programación Orientada a Aspectos3
Complemento de POO
4. Objetivo de la POA
El principal objetivo de la POA es la separación
de las funcionalidades dentro del sistema.
31/01/2015 Alex – Programación Orientada a Aspectos4
•Por un lado las funcionalidades comunes
utilizadas a lo largo de la aplicación
•Por otro lado las funcionalidades propias de
cada modulo
5. ¿Qué es un Aspecto?
Es un proceso realizado dentro de una clase pero
que no es parte de la misma.
La verificación de permisos es un aspecto, el
registro de bitácora es un aspecto, el manejo de
errores es un aspecto.
El proceso que no es inherente a una sola clase y
que tiene identidad propia.
31/01/2015 Alex – Programación Orientada a Aspectos5
6. Problemas de Otros Paradigmas
• Código disperso (Scattered code): El mismo
código distribuido por toda, o gran parte de la
aplicación.
• Código enmarañado (Tangled code): Un
mismo módulo implementa múltiples
comportamientos de forma simultanea.
31/01/2015 Alex – Programación Orientada a Aspectos6
7. Problemas de Otros Paradigmas (2)
En la POO, se tiene una clase que un momento
dado necesita la funcionalidad de otra.
Para ello crea un nuevo objeto de dicha clase y
utiliza los métodos proporcionados.
31/01/2015 Alex – Programación Orientada a Aspectos7
8. Conceptos Cruzados
public class ClaseDeNegocio
{
public void metodoNegocio()
{
//Asegurar autorización
//Asegurar que la información cubra con los requerimientos
//Bloquear el objeto para asegurar la concurrencia
//Registrar en la bitácora el inicio de la operación
//Realizar la operación de negocio
//Registrar en la bitácora el fin de la operación
//Desbloquear el objeto
}
}
31/01/2015 Alex – Programación Orientada a Aspectos8
9. Código Enmarañado (Tangling)
31/01/2015 Alex – Programación Orientada a Aspectos9
Seguridad
Registro de eventos
Manejo de errores
Verificación de datos
Lógica del Negocio
10. Código Disperso (Scattering)
Código Duplicado
31/01/2015 Alex – Programación Orientada a Aspectos10
Verificar Acceso
Autorizado
Contaduría
ContaduríaContaduría Banca por Internet
Atención a Clientes
Operaciones ExternasOperaciones ExternasOperaciones Externas
11. Código Disperso (Scattering) - (2)
Código Complementario
31/01/2015 Alex – Programación Orientada a Aspectos11
Usuarios
autenticados
Control de
Acceso
Administración
de permisos
Manejo de
sesión
Autorización
12. AspectJ
Es una extensión de Java para el desarrollo de
aplicaciones orientadas a aspectos.
Tiene un compilador especial que genera archivos
.class válidos para cualquier JVM.
31/01/2015 Alex – Programación Orientada a Aspectos12
13. Anatomía de un Aspecto
• Aspecto (Aspect)
• Punto de unión (Join Point)
• Consejo (Advice)
• Punto de corte (Pointcut)
• Destinatario (Target)
• Tejido (Weaving)
31/01/2015 Alex – Programación Orientada a Aspectos13
14. Primer Ejemplo de Uso de Aspectos
public class ComunicadorMensajes
{
public void muestraMensaje(String mensaje)
{
S.o.p(mensaje);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos14
15. El método main
public class Prueba
{
public static void main(String[] args)
{
ComunicadorMensajes cm = new ComunicadorMensajes();
cm.muestraMensaje (“Hola, ¿quieres aprender AspectJ?”);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos15
16. Nuestro Aspecto
public aspect AspectoModales
{
pointcut entregaMensaje():
call(* ComunicadorMensaje.muestraMensaje(..));
before(): entregaMensaje()
{
S.o.p(“Hola! “);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos16
17. Anatomía del Aspecto - Aspecto
Es la funcionalidad transversal (crosscutting) que
se va a implementar de forma modular y separada
del resto del sistema.
31/01/2015 Alex – Programación Orientada a Aspectos17
18. Anatomia del Aspecto – Aspecto (2)
public aspect AspectoModales
{
pointcut entregaMensaje():
call(* ComunicadorMensaje.muestraMensaje(..));
before(): entregaMensaje()
{
S.o.p(“Hola! “);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos18
19. Anatomía del Aspecto - Advice
Es la implementación del aspecto, es decir,
contiene el código que implementa la nueva
funcionalidad. Se inserta en la aplicación en los
puntos de cruce.
También definen el momento en el que se
ejecutará este código.
31/01/2015 Alex – Programación Orientada a Aspectos19
20. Anatomía del Aspecto – Advice (2)
public aspect AspectoModales
{
pointcut entregaMensaje():
call(* ComunicadorMensaje.muestraMensaje(..));
before(): entregaMensaje()
{
S.o.p(“Hola! “);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos20
21. Anatomía del Aspecto – Referencias
• thisJoinPoint
• thisJoinPointStaticPart
• thisEnclosingJoinPointStaticPart
31/01/2015 Alex – Programación Orientada a Aspectos21
22. Anatomía del Aspecto - Pointcut
Define las partes de nuestro código Java en el que
se aplicarán los advices. Se especifican mediante
expresiones regulares o patrones de nombres, e
incluso dinámicamente en tiempo de ejecución
según el valor de ciertos parámetros.
Es el “¿dónde se ejecutará el aspecto?”
31/01/2015 Alex – Programación Orientada a Aspectos22
23. Anatomía del Aspecto – Pointcut (2)
public aspect AspectoModales
{
pointcut entregaMensaje():
call(* ComunicadorMensaje.muestraMensaje(..));
before(): entregaMensaje()
{
S.o.p(“Hola! “);
}
}
31/01/2015 Alex – Programación Orientada a Aspectos23
24. Anatomía del Aspecto – Weaving
Es el proceso de aplicar aspectos a los objetos y
clases Java para crear nuevos objetos en los
puntos de cruce. Este proceso puede ocurrir a lo
largo del ciclo de vida del destinatario:
31/01/2015 Alex – Programación Orientada a Aspectos24
• En tiempo de compilación.
• En tiempo de carga de las clases.
• En tiempo de ejecución.
25. Anatomía del Aspecto – Join Pont
Es un punto de ejecución dentro del sistema
donde el aspecto puede ser insertado, como una
llamada a un método, el lanzamiento de una
excepción, la modificación de un campo, etc.
El join point es definido dentro del pointcut.
31/01/2015 Alex – Programación Orientada a Aspectos25
pointcut entregaMensaje():call(* ComunicadorMensaje.muestraMensaje(..));
26. Join Points por Tipo
31/01/2015 Alex – Programación Orientada a Aspectos26
Categoría de Join Point Sintaxis
Ejecución de Método execution(FimaMetodo)
Llamada a Método call(FirmaMetodo)
Ejecución de Constructor execution(FirmaConstructor)
Llamada a Constructor call(FirmaConstructor)
Inicialización de Clase staticinitialization(FirmaTipo)
Lectura de un atributo get(FirmaAtributo)
Escritura de un atributo set(FirmaCampo)
Ejecución de manejo de Excepción handler(FirmaTipo
Inicialización de Objeto initialization(FirmaConstructor)
Pre-Inicialización de Objetos preinitialization(FirmaConstructor)
Ejecución del Advice adviceexecution()
27. Otros Pointcuts Importantes
Pointcut Descripción
within(PatronTipo) Cualquier join point dentro del scope de la clase indicado
o uno de sus subtipo.
withincode(PatronTipo) Cualquier join point dentro del scope de la clase
indicada, o clases anidadas.
this(FirmaTipo) Todos los join points donde la referencia “this” es del
tipo indicado, o sus subclases.
target(FirmaTipo) Todos los join points donde el objeto en el que se invoca
el método es del tipo indicado o sus subclases.
args(PatronTipo) Los join points en todos los métodos donde se reciban
los argumentos indicados.
if(condiciones) Todos los join points donde la condición indicada se
cumple.
31/01/2015 Alex – Programación Orientada a Aspectos27
28. Anatomía del Aspecto – Join Pont(2)
public static void main(String[] args)
{
ComunicadorMensajes cm = new ComunicadorMensajes();
cm.muestraMensaje (“Alan, ¿quieres aprender AspectJ?”);
}
31/01/2015 Alex – Programación Orientada a Aspectos28
pointcut entregaMensaje():
call(* ComunicadorMensaje.muestraMensaje(..));
29. Anatomía del Aspecto – Join Pont(3)
pointcut entregaMensaje():
execution(* ComunicadorMensaje.muestraMensaje(..));
31/01/2015 Alex – Programación Orientada a Aspectos29
public class ComunicadorMensajes
{
public void muestraMensaje(String mensaje)
{
S.o.p(mensaje);
}
}
30. ¿Cómo logra AspectJ hacer esto?
Esta es, a grandes rasgos, la forma en la que
trabaja AspectJ:
31/01/2015 Alex – Programación Orientada a Aspectos30
1. Los aspectos son mapeados a clases Java.
2. Los advices se mapean a uno o más métodos.
3. Las llamadas a estos métodos se insertan en
los join points adecuados.
31. Advice
Ayuda a definir el “qué hacer”. Es una
construcción parecida a un método.
Existen tres tipos de advice:
31/01/2015 Alex – Programación Orientada a Aspectos31
• before: Se ejecuta antes del join point
• after: Se ejecuta después del join point
• around: Rodea la ejecución del advice. Este
advice es especial ya que tiene la habilidad de
evitar que el método se ejecute
32. Advice After
Se ejecuta después del join point. Existen tres
variaciones de este tipo de advice:
31/01/2015 Alex –Programación Orientada a Aspectos32
• Después de un regreso de una ejecución
normal.
• Después de un regreso por lanzarse una
excepción.
• Después de un regreso de cualquiera de las
formas anteriores.
33. Advice After
after(): call(* Cuenta.*(..)) {….}
after() returning : (* Cuenta.*(..)) {….}
after throwing : call(* Cuenta.*(..)) {….}
31/01/2015 Alex – Programación Orientada a Aspectos33
36. Ejemplo 4
Manejo de Excepciones
31/01/2015 Alex – Programación Orientada a Aspectos36
37. Sintaxis de los Join Points
Los pointcuts identifican los join points en el flujo
del programa. Además exponen el contexto del join
point.
Los point cuts pueden ser anónimos o con nombres.
Los point cuts también son usados en cruzamientos
estáticos para declarar errores y warnings en tiempo
de compilación, así como para suavizar excepciones
31/01/2015 Alex – Programación Orientada a Aspectos37
38. Join Points con Nombre
Los point cuts con nombre son elementos que
pueden ser referenciados en múltiples lugares,
haciéndolos reutilizables.
31/01/2015 Alex – Programación Orientada a Aspectos38
pointcut operacionesContables() : call(* Cuenta.*(..));
before(): operacionesContables()
{
…
}
39. Join Points Anónimos
Son expresiones que se definen en el momento
de su uso. Como son anónimos, no pueden ser
referenciados en otro lugar a donde son definidos
31/01/2015 Alex – Programación Orientada a Aspectos39
before(): call(* Cuenta.*(..))
{
…
}
40. Patrones de Firmas en Pointcuts
Algunas veces un pointcut especifica un joinpoint
usando una forma particular, pero otras, identifica
join points por multiples firmas que estan
agrupados usando patrones de coincidencia.
31/01/2015 Alex – Programación Orientada a Aspectos40
• “*” cualquier número de caracteres, excepto puntos
• “..” Cualquier número de caracteres, incluyendo
puntos
• “+” Cualquier subclase o subinterface de un tipo
dado
41. Operadores
AspectJ proporciona 3 operadores:
• “!” Negación
• “||” or lógico
• “&&” and lógico
31/01/2015 Alex – Programación Orientada a Aspectos41
42. Patrones de Firmas en Pointcuts (2)
Existen tres tipos de patrones de firmas:
• Patrones de Tipos (clases, interfaces)
• Patrones de Métodos y Constructores
• Patrones de Atributos
31/01/2015 Alex – Programación Orientada a Aspectos42
43. Patrones de Tipos
Patrón de Firma Tipos Encontrados
Cuenta Tipos con nombre “Cuenta”
Cuenta* Tipos con nombre iniciado en “Cuenta” como
“CuentaAhorros” o “CuentaCheques”
java.*.Date “java.util.Date” y “java.sql.Date”
java..* Paquete “java” o subpaquetes a cualquier nivel
javax..*Model+ Paquete “javax” o subpaquetes con tipos terminados
en “Model” y sus subclases
!Vector Todos los tipos que NO son “Vector”
Vector || Hashtable Los tipos “Vector” o “Hashtable”
java.util.RandomAccess+
&& java.util.List+
Todos los tipos que implementen las dos interfaces
indicadas. En este caso “java.util.ArrayList”
31/01/2015 Alex – Programación Orientada a Aspectos43
44. Patrones de Métodos
Patrón de Firma Métodos Encontrados
public void Collection.clear() Directo
public void Cuenta.debito(float)
throws ExcepcionBalanceInsuficiente
Directo
public void Cuenta.set*(*) Métodos de la clase “Cuenta” que inician
con “set” y reciben un solo argumento de
cualquier tipo
public void Cuenta.*() Todos los métodos “public” de la clase
“Cuenta” que no tomen argumentos
public * Cuenta.*(..) Todos los métodos de la clase “Cuenta”
sin importar el tipo de retorno o los
argumentos que recieban
* java.io.Reader.read(char[], ..)
* javax..*.add*Listener(EventListener+)
* *.*(..) throws RemoteException
31/01/2015 Alex – Programación Orientada a Aspectos44
45. Patrones de Constructores
Patrón de Firma Constructores Encontrados
public Cuenta.new() Invocación del constructor de la clase “Cuenta”
public Cuenta.new(int) Invocación del constructor de la clase “Cuenta”
que reciba un solo argumento de tipo “int”
public Cuenta.new(..) La invocación un constructor de la clase
“Cuenta” que reciba cualquier número de
argumentos
31/01/2015 Alex – Programación Orientada a Aspectos45
Como un constructor no tiene un tipo de retorno, no
hay un valor permitido. Además como los
constructores no tienen nombre como los métodos
normales, el método es sustituido por “new”.
46. Patrones de Atributos
Debe especificar el nombre del campo, el tipo, y
los modificadores.
31/01/2015 Alex – Programación Orientada a Aspectos46
Patrón de Firma Atributos Encontrados
private float Cuenta.balance Campo privado “balance” de la clase “Cuenta”
* Cuenta.* Todos los campos de la clase “Cuenta” sin importar
su modificador de acceso, tipo o nombre
!public static * banco.. *.* Todos los campos static no públicos de “banco” y
sus subpaquetes directos e indirectos
public !final *.* Los campos públicos no final de todas las clases
47. Pasando el Contexto de un Join
Point a un Advice
before(Cuenta cuenta, float cantidad) :
call(void Cuenta.credito(float))
&& target(cuenta)
&& args(cantidad)
{
S.o.p(“Acreditando “ + cantidad + “ a “ +
cuenta);
}
31/01/2015 Alex – Programación Orientada a Aspectos47
48. Pasando el Contexto de un Join
Point a un Advice (2)
pointcut operacionCredito(Cuenta cuenta, float cantidad):
call(void Cuenta.credito(float))
&& target(cuenta)
&& args(cantidad);
before(Cuenta cuenta, float cantidad) :
operaciónCredito(cuenta, cantidad)
{
S.o.p(“Acreditando ” + cantidad + “ a “ + cuenta);
}
31/01/2015 Alex – Programación Orientada a Aspectos48
49. Pasando el Contexto de un Join
Point a un Advice (3)
after() throwing(RemoteException ex) :
call(* *.*(..) throws RemoteExcption
{
S.o.p(“Exception “ + ex + “ cuando se
ejecutaba ” + thisJoinPoint);
}
31/01/2015 Alex – Programación Orientada a Aspectos49
50. Ejemplo 5
Valor de las Variables
31/01/2015 Alex – Programación Orientada a Aspectos50
55. Gracias
31/01/2015 Alex - Programación Orientada a Aspectos55
programadorjavablog@gmail.com
http://javatutoriales.blogspot.com/
Java Tutoriales en Facebook