Programemos en AspectJ

De Wikilibros, la colección de libros de texto de contenido libre.

Introducción[editar]

La programación orientada al aspecto (de ahora en adelante AOP), viene a complementar a la programación orientada a objetos (OOP), dando un nuevo punto de vista para resolver ciertos problemas que se plantean en la programación. Al igual que entendemos cuál es la función de una propiedad en una clase, un método, o la definición de una clase abstracta, la AOP permite definir aspectos de una aplicación.

¿Qué es un Aspecto?[editar]

Es un proceso realizado dentro de una clase pero que no es propio de la misma. Una forma más claro de verlo es con un ejemplo.

Si se tiene una clase que representa a un Cliente, y dentro del método grabar se quiere registrar en un log todas las operaciones realizadas.

Figura 1.

class Cliente {
      private String _nombre;
   Cliente() {    }
   ...
   public void Grabar() {
     ... Inicio Log
     ... Grabar en base de datos
     ... Fin Log
   }}

La persistencia de los datos de un cliente es un aspecto, el introducir una traza dentro de un proceso es un aspecto. Resumiendo, se puede decir que se puede considerar un aspecto de una clase, aquel proceso que no es inherente a la misma y que tiene entidad propia.


¿Cómo se aplica un Aspecto?[editar]

En la programación tradicional OOP, se tiene una clase que en un momento dado necesita de la funcionalidad de otra. Para ello crea un nuevo objeto de dicha clase y utiliza los métodos proporcionados. Tal y como se comenta en el punto anterior, se puede considerar que ciertas funcionalidades no son inherentes a una clase y por ello se definen como aspectos. Ahora mismo puedes pensar, que se puede definir como otra clase para poderla utilizar, pero ahí radica el cambio. No se quiere utilizar funcionalidades definidas en otras clases, sino que se quiere aplicar ciertos aspectos a ciertas clases, y que a partir de ese momento la clase original tenga la funcionalidad nueva que se le ha definido a través de aspectos.

Simplemente con este pequeño cambio de concepto se proporciona mayor flexibilidad y reutilización del mismo código. En la idea original para poder volver a utilizar la clase Cliente se tiene que asumir que incluye un log, aunque en ese momento no se desee utilizar, o bien cambiar el código. En este caso ya no se está reaprovechando el código existente como se podría llegar a aprovechar.

Para ver como se puede hacer esto con aspectos hay que observar la siguiente figura.

Figura 2.

public aspect LogAspect {
   before() : execution(void Cliente.Grabar()) {
      System.out.println("... Inicio Log");
   }
   after() : execution(void Cliente.Grabar()) {
      System.out.println("... Fin Log");
   }}
class Cliente {
      private String _nombre;
   Cliente() {    }    ...
   public void Grabar() {
      ... Grabar en base de datos
  }}

En la línea que se escribe "public aspect LogAspect" se define el aspecto y en la línea que escribe "before() : execution(void Cliente.Grabar())" se indica donde se quiere aplicar el aspecto. Como se puede ver, si se quiere aprovechar la clase Cliente no se tiene ningún problema a la hora de copiarla, ya que toda la funcionalidad que tiene, es propia de dicha clase. Ahora se tiene el poder de decisión para copiar los aspectos para dicha clase o no.

Composición de un Aspecto[editar]

Un Aspecto se compone de su declaración, la definición de sus puntos de corte(Pointcut) y de sus puntos de ejecución (Advice).

Declaración del Aspecto(Aspect): permite indicar las características del aspecto. Si permite acceder a campos privados, si extiende una clase o otro aspecto abstracto, si implementa un interface o si es aplicable sólo para unos determinados puntos de corte (Pointcut).

Puntos de corte(Pointcut definitions): permite capturar o identificar puntos de unión en el flujo de un programa.

Declaración de puntos de ejecución (Advice): permite definir las acciones a tomar en el flujo del programa.

Puntos de Unión(Join Point): es una posición bien definida dentro del código principal. Un Join Point puede ser la llamada a un método, la ejecución de un constructor o la asignación de un miembro de un objeto.


Qué se debe saber[editar]

Dentro de un Aspecto puede declarar variables, y métodos. Salvo que se indique lo contrario la instancia de un Aspecto es utilizado por todas las clases, y la instancia pervive hasta la destrucción del último objeto. Un Aspecto puede extender tanto aspectos abstractos, clases e implementar interfaces. Los métodos creados dentro de un Aspecto sólo se pueden utilizar dentro del mismo Aspecto o por otro Aspecto. Nunca tendremos acceso a estos métodos desde una clase.


Enlaces externos[editar]

http://docs.google.com/leaf?id=0Bx1Aq3vYhs9QY2Q2YWUyZTktNDMzOC00M2Q3LTk1ODgtOWEyMjVjOTJmZTZm&hl=es Programemos en AspectJ.pdf