martes, agosto 01, 2006

AOP: ¡Enriquece tus programas con aspectos!

Lo primero pedir disculpas por no haber escrito en el blog desde hace tanto tanto tiempo. La vida moderna de trabajador junto con las actividades extralaborales hacen complicado dedicarle tiempo a escribir artículos. La verdad es que fue una sorpresa encontrarme con un compañero recién llegado a mi antigua empresa que me contó que leía mi blog (¡hay gente que me lee!).
He decidido cambiar de aires, y cambio de trabajo y de casa (aunque no de ciudad). Aire nuevo aspecto nuevo, ¿no?
La programación orientada a aspectos no deja de ser una abstracción más a las abstracciones que se han ido realizando para crear lenguajes que cada vez son de más alto nivel. Igual que la orientación a objetos es un paso más de la programación procedural, los aspectos son el siguiente paso. No sé como se encontró el lector cuando paso de procedural a oop, pero yo recuerdo que durante un tiempo se me puso cara de no terminar de entender nada y encontrarme en un mar de dudas. Y la verdad es que en cierta manera me ha pasado lo mismo cuando he pasado de oop a aop.
¿Qué necesidad hay para la AOP? Cuando uno se pone a programar una aplicación se da cuenta de que hay una serie de cosas que se repiten en la mayor parte de los componentes de la aplicación. Por ejemplo, el traceo o logueo de mensajes, la seguridad, la caché, las transacciones... Son todos conceptos que tocan muchas partes de la aplicación que no tienen nada en común. En inglés, a este concepto se le llama crosscutting concerns (conceptos concernientes a distintas partes de la aplicación).
Para entender mejor la AOP conviene definir unos conceptos básicos: join points, point cuts, advices y aspects.

Join Point (punto de unión): lugar de la aplicación donde puede producirse una unión entre el aspecto y el programa. Son lugares que el compilador de aspectos puede reconocer y donde pueden introducirse advices. Como ejemplos podemos citar constructores, llamadas a métodos, asignaciones de variables...

Point cuts (Cortes de punto): Para definir en qué join point queremos actuar deberemos definir los point cuts. Un point cut no deja de ser una expresión regular (con sus particularidades) que indica en qué puntos de unión queremos meter los distintos advices.

Advices (avisos): Un advice en AOP se puede comparar a un método en OOP, aqui otra vez encontramos peculiaridades. Hay distintos tipos de advices: before, around y after y estos se pueden definir de manera que refinen más todavía el momento de actuación respecto al point cut asociado. Imaginemos que tenemos un point cut para un método de determinada clase pero solo queremos que nuestro advice actue cuando dicho método lance una excepción... Este tipo de refinamiento es posible en la declaración del advice.

Aspect (aspecto): Un aspecto en AOP viene a ser lo que un objeto en OOP. Un aspecto se compone de los point cuts, los advices y todo el código que se quiera. Dentro de un aspecto podemos usar objetos, de manera que dentro de un advice podemos tener la lógica de, por ejemplo, el traceo de la aplicación (haciendo las importaciones adecuadas, p.e. log4j).

¿Y todo esto como se come? Pues después de habernos hecho nuestros aspectos pasamos a usar el compilador de aspectos. Un compilador de aspectos lo que hace es tejer (weave) el código del programa con el de los aspectos, dando como resultado un código compatible con la tecnología (en caso de aspectj y java, no da un bytecode compatible).

Por supuesto, esto solo es una introducción a la programación orientada a aspectos, pero espero que sirva a alguno para introducirse en tan fantástica tecnología.

No hay comentarios: