Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Monografia Programacion Orientada A Aspectos
Monografia Programacion Orientada A Aspectos
Ambientes de Programacin
Integrantes:
Janice Martnez
Steven Martnez
Nstor Martnez
Abdiel Martnez
Introduccin............................................................................................................3
Separacin de Asuntos (Separation of Concerns).................................................4
Programacin Orientada a Aspectos......................................................................7
Lenguajes Programacin Orientado a Aspectos..................................................11
AspectJ..................................................................................................................11
AspectJ Puntos de Unin..................................................................................13
Aplicacin de AspectJ...........................................................................................14
Estudiar la Solucin Convencional primero..................................................14
2 Limitar la implementacin...........................................................................15
3 Generalizar la Solucin..............................................................................15
AspectJ y las Fases de Desarrollo.......................................................................15
Diseo............................................................................................................15
Implementacin.............................................................................................16
Fase de Pruebas...........................................................................................18
Ejemplo de AspectJ..............................................................................................18
Requerimientos.................................................................................................18
Implementacin Java.....................................................................................19
Implementacin en C#...................................................................................21
Implementacion C# con registro de sucesos en consola..............................22
Implementacin usando AspectJ...................................................................24
Implementacin de Aspecto en .Net C#...............................................................26
Ejemplo de Rastreo (Tracing) de Alto Nivel por Aspecto..............................26
Implementacin de XTraceMethodBoundaryAttribute..................................27
Inicializacin en Tiempo de Compilacin......................................................27
Mtodos en Tiempo de Ejecucin.................................................................29
Conclusin............................................................................................................30
Referencias...........................................................................................................31
Introduccin
La industria de desarrollo de software ha evolucionado grandemente en los ltimos
aos. Algunas veces como desarrollador es difcil mantenerse al da con las nuevas
tecnologas o procesos que cada da se incorporan. Sin embargo a pesar de todos los
avances que se estn dando existen problemas para los cuales todava no se tiene una
solucin ideal. Uno de estos problemas es la correcta modularizacin, en especial,
cuando se lidia con un sistema complejo y grande. La adopcin de OOP (siglas en
ingles) ha ayudado grandemente a que se avance para subsanar este dilema; sin
embargo, no es suficiente. La programacin orientada a aspectos va un paso ms all y
aunque lejos de ser una solucin ideal, subsana algunos deficiencias del modelado que
se logra por medio de OOP .
Podemos definir asuntos como los diferentes temas o asuntos de los que es necesario
ocuparse para resolver el problema. Una de ellos es la funcin especfica que debe
realizar una aplicacin, pero tambin surgen otros como por ejemplo distribucin,
persistencia, replicacin, sincronizacin, etc. Usualmente asuntos son equivalentes con
caractersticas o comportamientos del programa.
La Separacin de Asuntos es la base que promovi el desarrollo de los lenguajes
orientados a objetos, en donde dado un buen diseo es posible alcanzar mayores
niveles de reutilizacin, independencia. Con miras a conseguir una mayor productividad,
tambin se han creado patrones de desarrollo que ayudan a alcanzar una mejor
separacin de asuntos. Podemos mencionar Modelo Vista- Controlador(Model View
Controller).
Los asuntos transversales dan lugar a cdigo disperso y enredado (scattering and
tangling).
Los asuntos transversales se pueden clasificar en: Compaeros (Peers). Estos son
asuntos que se distinguen claramente uno de otros. Los mismos tienen el mismo nivel
de importancia. En el ejemplo familiar del ATM, retiro de efectivo, depsito, transferencia
de fondos todos son asuntos transversales compaeros (Peers).1 Estos asuntos se
pueden desarrollar como sistemas independientes, sin embargo al desarrollarse dentro
del mismo sistema nos encontramos con el hecho de que existe sobreposicin en la
codificacin de los mismos.
denomina cdigo de unin (glue code). No importa que tan bueno sea el diseo, con las
tcnicas de modelado convencionales, el cdigo de unin es necesario.
Para superar estas limitaciones es necesaria una nueva metodologa modular que nos
permita: alcanzar verdadera separacin de los asuntos, incluyendo los asuntos
transversales, en todas las fases de desarrollo de software (requerimientos, anlisis,
Pointcut (Puntos de Corte) define los Consejos que se aplicarn a cada Punto
de Cruce. Se especifica mediante Expresiones Regulares o mediante patrones
de nombres (de clases, mtodos o campos), e incluso dinmicamente en tiempo
de ejecucin segn el valor de ciertos parmetros. Un ejemplo sencillo se puede
aplicar a clases que representen figuras geomtricas. En
10
AspectJ
Es una extensin multi-propsito de Java que implementa la programacin orientada a
aspectos. Est formada por una serie de herramientas que permiten a los
desarrolladores de Java administrar mejor los problemas inherentes de los sistemas
11
Es un lenguaje prctico que provee, en un paquete compatible con Java, un set slido
de caractersticas de Programacin Orientada a Aspectos. No est diseado para ser
una encarnacin en blanco de las ideas de Programacin Orientada a Aspectos, no es
una implementacin formal ni un estudio agresivo del dominio y las oportunidades de la
POA.
12
La
Llamada de un mtodo
Llamade de un constructor
mtodo
Recepcin
llamado
constructor
de
un
Ejecucin de un mtodo
13
Ejecucin de un constructor
invocado.
Ejecucin
de
un
manejo
excepcin
-
Inicializacin de un objeto
clase,
si
estn
presentes,
son
Aplicacin de AspectJ
Estudiar la Solucin Convencional primero En este paso, se diagrama,
disea, e incluso se crea un prototipo de la solucin convencional. La solucin
convencional resalta las ventajas de la solucin que provee AspectJ, el propsito
principal es ayudar a entender el diseo necesario para una mejor solucin con AspectJ.
La idea es identificar el cdigo disperso y enredado (scattering and tangling) y luego
modularizarlo. Una vez se logra suficiente experiencia en este paso, se puede reducir la
importancia del mismo o incluso eliminarlo..
14
Diseo
Al igual que cualquier proceso de desarrollo de software un buen diseo es la piedra
angular para que el proyecto se desarrolle de manera exitosa; disear software usando
AspectJ no es la excepcin a la regla. Al considerar el uso de AspectJ desde las etapas
inciales del diseo se obtiene los mayores beneficios de la utilizacin del mismo, ya
que se garantiza que los asuntos transversales son manejados correctamente e
integrados efectivamente por medio de los aspectos.
La manera tpica de utilizar AspectJ en la fase de diseo incluye:
3
(Laddad, 2003)
15
Reconocer los asuntos transversales. Este paso es parte del mapeo necesario
de requerimientos a mdulos. Una manera sencilla de identificar estos asuntos
es la utilizacin de frases como: cada vez, en todo lugar. Si nos encontramos
utilizando estas frases para describir parte de las funcionalidades en distintos
mdulos, tenemos ante nosotros un asunto transversal. Reconocer los asuntos
transversales a tiempo, permite que estos sean delegados a aspectos que se
Implementacin
En general el proceso de implementar un sistema utilizando AspectJ no es muy
diferente que cuando se utiliza un lenguaje de orientacin a objetos. Hay algunas
consideraciones bsicas en las cuales se debe hacer ms nfasis como:
-Separar en mdulos correctamente el cdigo: idealmente cada operacin debe
corresponder con una funcionalidad. La unidad granular para definir los puntos de unin
son los mtodos. Es importante que cada mtodo tenga una funcin clara y concisa. De
esta manera el aplicar un aspecto ser pan comido.
-Uniformidad en la nomenclatura: Esta es una regla que se debe aplicar
independientemente si se est trabajando con AspectJ o no. Toma incluso ms
relevancia cuando se utiliza AspectJ. Una de las ventajas de AspectJ es que se pueden
definir puntos de unin mediante el uso de comodines. Si somos consistentes con la
nomenclatura podremos aplicar eficientemente los puntos de unin.
16
fase de diseo)
Buscar activamente secciones de cdigo que se presenten repetidas (scattering)
o enredadas (tangling).
Identificar los puntos de unin. Una vez se ha determinado la existencia de un
asunto transversal, se tiene que identificar ya de una manera tangible los puntos
en cdigo que requieren la aplicacin del asunto transversal. De igual forma se
debe determinar cul es la mejor manera de expresar el punto de corte que
sistema.
Disear los aspectos. Se puede considerar utilizar patrones como plantillas para
disear los aspectos. Tambin es necesario aplicar una nomenclatura
consistente a los aspectos en s. Esto facilitar la aplicacin e puntos de unin
dentro de los aspectos si as se requiera. Es vlido tambin determinar si los
mismos aspectos se pueden reutilizar en otros sistemas que presenten los
Fase de Pruebas
AspectJ provee una serie de escenarios que ayudan a automatizar el proceso de
pruebas de la aplicacin. Debido a la naturaleza no intrusiva de los aspectos se puede:
Crear casos de usos: Por medio del uso de aspectos privilegiados se puede acceder a
los elementos privados de una clase. Esto permite que se creen programas de prueba
sin que se modifiquen la clase original que se quiere probar. Una vez se haya
garantizado que las pruebas dan los resultados esperados, los aspectos se pueden
sacar del sistema fcilmente.
Pruebas de desempeo: Para tal fin se pueden crear aspectos que ayuden a monitorear
el desempeo de la aplicacin cuando este en la versin beta.
Reporte de errores: se pueden usar aspectos que brinden informacin adicional acerca
del contexto de los errores. El contexto no slo incluye el stacktrace sino toda la
17
informacin que est disponible en el punto de unin donde se dio el error. En este
sentido los reportes de errores son superiores a la informacin estndar que proveen
los compiladores.
Ejemplo de AspectJ
Haciendo alusin al asunto transversal sobre registros de sucesos. Presentamos el
siguiente ejemplo. Es una pequea aplicacin que tiene como objetivo simular algunos
flujos existentes en un saln de clases.
Requerimientos
Los requerimientos del micro sistema son:
- Permitir a los estudiantes registrar clases
- Permitir a los profesores asignar tareas
- Permitir a los profesores fracasar estudiantes
- Listar la lista de tareas asignadas a una clase
- Listar la lista de estudiantes registrados en una clase
- Permitir al estudiantes que se retire de la clase
- Asignar a un profesor con determinada clase
- Registrar los sucesos que ocurran en el sistema
Debido a que este es un ejemplo prctico enfocado en mostrar las diferencias bsicas y
ventajas de utilizar AspectJ, la parte grfica del micro sistema no ser desarrollada. El
ejemplo se enfocar en crear las clases necesarias que satisfagan los requerimientos
antes sealados.
El siguiente diagrama de clases muestra el diseo inicial con el cual se pretende cumplir
con todos los requerimientos antes mencionados.
18
Como se puede observar en el diagrama la clase principal del sistema es la clase Class.
A continuacin podemos ver la implementacin del cdigo en AspectJ y posteriormente
la implementacin del cdigo en C#.
Implementacin Java
package com.object.model;
import java.util.ArrayList;
import java.util.*;
public class Class {
private ArrayList<Task> ActiveTasks;
private ArrayList<Student> RegisteredStudents;
private String _ClassName;
private Professor _Professor;
public Class()
{
ActiveTasks = new ArrayList<Task>();
RegisteredStudents = new ArrayList<Student>();
}
public void SetClassName(String name)
{
_ClassName = name;
}
public String GetClassName()
{
return _ClassName;
}
public void AddStudent(Student newStudent)
{
RegisteredStudents.add(newStudent);
}
public void RemoveStudent(Student newStudent)
{
RegisteredStudents.remove(newStudent);
}
public void AddTask(String name, Date dueDate)
{
Task newTask = new Task();
newTask.SetName(name);
newTask.SetDueDate(dueDate);
ActiveTasks.add(newTask);
}
public void RemoveTask(Task taskToRemove)
{
19
if(ActiveTasks.contains(taskToRemove))
{
ActiveTasks.remove(taskToRemove);
}
}
public void ListStudents()
{
for(int i = 0; i < RegisteredStudents.size(); i ++)
{
System.out.println("Student name: "
+ RegisteredStudents.get(i).GetName()
+ " " + RegisteredStudents.get(i).
GetLastName() );
}
}
public void ListTasks()
{
for(int i = 0; i < ActiveTasks.size(); i ++)
{
System.out.println("Task name: "
+ ActiveTasks.get(i).GetName()
+ " Due date: " + ActiveTasks.get(i).
GetDueDate().toString() );
}
}
public void SetProfessor(Professor newProfessor)
{
_Professor = newProfessor;
}
public Professor GetProfessor()
{
return _Professor;
}
}
Implementacin en C#
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ObjectModel
{
public class Class
{
List<Student> RegisteredStudents;
List<Task> ActiveTasks;
20
Professor _Professor;
public string ClassName
{
get;
set;
}
public Class()
{
RegisteredStudents = new List<Student>();
ActiveTasks = new List<Task>();
}
public void AddStudent(Student newStudent)
{
RegisteredStudents.Add(newStudent);
}
public void RemoveStudent(Student newStudent)
{
RegisteredStudents.Remove(newStudent);
}
public void AddTask(string name, DateTime dueDate)
{
Task newTask = new Task();
newTask.Name = name;
newTask.DueDate = dueDate;
ActiveTasks.Add(newTask);
}
public void RemoveTask(Task taskToRemove)
{
if (ActiveTasks.Contains(taskToRemove))
{
ActiveTasks.Remove(taskToRemove);
}
}
public void ListTasks()
{
foreach (var tempTask in ActiveTasks)
{
Console.WriteLine("Taks name: " + tempTask.Name + " due
date " + tempTask.DueDate);
}
}
public void ListStudents()
{
foreach (var tempStudent in RegisteredStudents)
{
Console.WriteLine("Student name: " + tempStudent.Name +
" " + tempStudent.LastName);
}
}
}
21
Las dos implementaciones son muy parecidas y en apariencia cumplen con los
requerimientos sealados. Existen algunas diferencias inherentes al syntaxis propios de
los lenguajes, pero en teora la implementacin es la misma.
No obstante, si
System;
System.Collections.Generic;
System.Linq;
System.Text;
namespace ObjectModel
{
public class Class
{
List<Student> RegisteredStudents;
List<Task> ActiveTasks;
Professor _Professor;
public string ClassName
{
get;
set;
}
public Class()
{
Console.WriteLine("CTor init");
RegisteredStudents = new List<Student>();
ActiveTasks = new List<Task>();
Console.WriteLine("CTor end");
}
public void AddStudent(Student newStudent)
{
Console.WriteLine("AddStudent init");
RegisteredStudents.Add(newStudent);
Console.WriteLine("AddStudent init");
}
public void RemoveStudent(Student newStudent)
{
Console.WriteLine("RemoveStudent init");
RegisteredStudents.Remove(newStudent);
22
Console.WriteLine("RemoveStudent end");
23
que solo es copiar y pegar lo que lo hace fcil de implementar. No obstante este no es
el nico problema que esta implementacin presenta. Supongamos que se decide
cambiar de estrategia y ya no se quiera desplegar los registros de sucesos en consola,
sino que se quieran grabar en un archivo de texto o en una base de datos. Habra que
cambiar todos los llamados en las clases. Este proceso es ineficiente y distrae al
programador de la implementacin de las funcionalidades principales.
Por medio del uso del aspecto LogginAspect podemos incluir registros de sucesos en
todas las clases. Hemos modularizado exitosamente el asunto transversal. Ya que hay
un slo lugar donde se maneja el registros de suceso, sera muy sencillo cambiar el
mtodo consola por log4j o la librera estndar de Java para registrar sucesos
AspectJ tambin nos presenta una herramienta muy til con la que se pueden ver los
puntos de unin que cumplen la condicin.
24
Por medio del uso de esta herramienta podemos tener una idea exacta de cuantos
puntos de unin se han identificado para cada uno de los puntos de corte.
25
26
Implementacin de XTraceMethodBoundaryAttribute
Como queremos insertar cdigo antes y despus del cuerpo del mtodo, vamos a
derivar nuestro atributo personalizado de OnMethodBoundaryAspect e implementamos
los mtodos OnEntry, OnSuccess y OnException.
El esqueleto de nuestro atributo personalizado es:
[Serializable]
public sealed class XTraceMethodBoundaryAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionEventArgs context)
{
}
public override void OnSuccess(MethodExecutionEventArgs eventArgs)
{
}
public override void OnException(MethodExecutionEventArgs eventArgs)
{
}
}
27
28
de
vuelta
nuestro
esqueleto
de
nuestra
clase
29
Conclusin
Por medio del desarrollo de esta monografa se ha podido apreciar las ventajas que
AspectJ y PostSharp brindan en el desarrollo de un sistema. Descartando el esfuerzo
necesario para aprender sobre la sintaxis requerida para especificar los puntos de
cortes de los diferentes aspectos que se han querido introducir al sistema, el uso
correcto de garantiza un menor tiempo escribiendo cdigo. Si bien es cierto que esta
labor sera un proceso mecnico, por medio de estos marcos de trabajo se puede
eliminar el mismo.
30
Referencias
Gael Fraiteur. Bringing AOP to .NET, PostSharp.
[En lnea]
http://www.postsharp.org/
An Overview of AspectJ. Kiczales, Gregor, y otros. 2001. Berlin : Springer
Berlin / Heidelberg, 2001. pgs. 327-354. 978-3-540-42206-8.
Eisenberg, Andrew. 20009. Aspects Everywhere: Language Extensibility
for JDT through Equinox Aspects. [En lnea] 23 de marzo de 20009. [Citado el:
21 de junio de 2009.] http://www.eclipsecon.org/2009/sessions?id=648.
Gonzlez, Abdiel E. Cceres. 2004. Programacin Orientada a Aspectos.
Mexico : Centro de Investigacin y de Estudios Avanzados Mexico, 2004.
Jacobson, Ivar y Ng, Pan-Wei. 2004. Aspect-Oriented Software
Development with Use Cases. s.l. : Addison Wesley Professional, 2004. 0-32126888-1.
Laddad, Ramnivas. 2003. AspectJ in Action - Practical Aspect-Oriented
Programming. New York : Manning, 2003.
Safonov, Vladimir. 2005. Aspect.NET: Aspect-Oriented Programming for
Microsoft.NET in Practice. [En lnea] 28 de julio de 2005. [Citado el: 17 de
junio de 2009.] http://dotnet.sys-con.com/node/113337?page=0,1.
Wikimedia Foundation. 2009. Aspect Oriented Programming, Wikipedia.
[En lnea] 2 de junio de 2009. [Citado el: 4 de junio de 2009.]
http://en.wikipedia.org/wiki/Aspect_oriented_programming.
. 2009. Separation of Concerns. [En lnea] 2 de mayo de 2009. [Citado el: 1
de junio de 2009.] http://en.wikipedia.org/wiki/Separation_of_concerns.
31