El aspecto de distribución de PRISMA
Josep Silva, Nour Hussein, José Á. Carsí, Isidro Ramos
Departamento de Sistemas Informáticos y Computación
Universidad Politécnica de Valencia
Camino de Vera s/n
E-46021 Valencia – España
{jsilva, nourali, pcarsi, iramos}@dsic.upv.es
Resumen. Las arquitecturas software permiten el desarrollo de software basado
en componentes; uno de sus objetivos es la reutilización, que se consigue a
través del desarrollo de artefactos software que puedan funcionar en distintos
sistemas sin necesidad de ser reespecificados o reimplementados para ser
usados en el nuevo contexto. Por otra parte, la combinación del desarrollo
orientado a aspectos con el desarrollo orientado a componentes aborda la
construcción de componentes software desde puntos de vista diferentes que
realizan una funcionalidad específica y que pueden ser desarrollados de manera
independiente. Este artículo presenta un modelo de desarrollo de software que
combina ambas aproximaciones para la especificación de aspectos en la
arquitectura PRISMA. Se propone una plantilla de especificación de aspectos
que permite la definición de patrones de comportamiento de una manera
totalmente independiente del componente. Esto permite la total reutilización no
sólo de componentes sino también de aspectos en la arquitectura. El artículo
presenta las plantillas de especificación y configuración de aspectos en la
arquitectura PRISMA e incluye un ejemplo completo para el caso del aspecto
de distribución.
Palabras Clave: Desarrollo orientado a aspectos, Desarrollo orientado a
componentes, Arquitecturas software, Distribución.
1 Introducción
Muchos sistemas y procesos frecuentemente necesitan ser distribuidos o
redistribuidos total o parcialmente por necesidades de la organización. Estos cambios
en la distribución usualmente se realizan con la finalidad de mejorar la velocidad, la
tolerancia a fallos o la interoperación entre componentes, para equilibrar la carga, o
también, para satisfacer nuevos requisitos del sistema. Existen muchas propuestas
para la especificación de sistemas distribuidos, algunas de ellas con la propiedad de
ser independientes del sistema, como CORBA [1] y OSF DCE [2], mientras que otras
específicamente diseñadas para un lenguaje o sistema operativo, como Java RMI [3] o
Microsoft DCOM [4]. El principal inconveniente de estas propuestas es que la
especificación de la distribución interfiere con la especificación de la funcionalidad.
Desde nuestro punto de vista, la especificación de la funcionalidad de un sistema es
una tarea suficientemente compleja, y no debería ser mezclada con la especificación
de la distribución de sus componentes. El analista/programador debería pensar en qué
hacen los componentes y cómo lo hacen, sin preocuparse de dónde serán ejecutados
esos componentes.
Existen propuestas [5,6,7] que incluyen lenguajes específicos para la
especificación de los aspectos de distribución de un sistema. Estas propuestas
usualmente tratan de separar la especificación de la funcionalidad de la especificación
de la distribución. En muchas de estas propuestas, uno de los principales
inconvenientes que emergen cuando se desarrolla un sistema distribuido es que los
módulos distribuidos (o componentes) rompen la uniformidad del modelo no
solamente por el hecho de estar especificados en un lenguaje distinto, sino porque a
menudo interfieren en las tareas del resto de módulos del sistema de una manera poco
transparente. Esto particularmente ocurre en el paradigma orientado a objetos, donde
los objetos tienen que conocer la dirección de los servidores de nombres, y además
deben de informarles si cambian de ubicación (esto significa además que tienen que
estar asociados a un servidor de nombres). También deben registrar sus servicios, etc.,
con la pérdida de transparencia y reutilización que esto implica.
En la programación orientada a aspectos este problema ha sido parcialmente
resuelto [8,9,10] gracias a la separación del aspecto de distribución del aspecto
funcional. Sin embargo, ambos aspectos deben ser sincronizados para compartir
atributos, eventos y otras propiedades. Esta sincronización limita en gran medida la
reutilización del código. La arquitectura PRISMA [11] combina técnicas de
reutilización de arquitecturas basadas en componentes con técnicas de reutilización de
la programación orientada a aspectos. En este artículo, se propone un modelo de
especificación del aspecto de distribución para la arquitectura PRISMA que permite la
especificación de patrones de comportamiento de componentes distribuidos de una
manera totalmente independiente del componente dónde ese comportamiento será
utilizado. Este hecho permite una reutilización total de la especificación en otros
componentes. Además, se introduce la particularidad de utilizar herencia entre
aspectos en el modelo. El modelo será presentado con un ejemplo completo a lo largo
del artículo. Se ha tomado como ejemplo de especificación el aspecto de distribución,
sin que ello limite la aplicabilidad de las ideas aquí propuestas a cualquier otro
aspecto de la arquitectura.
El artículo ha sido dividido en 5 secciones: El apartado 2 provee una breve revisión
del estado del arte en el desarrollo de sistemas distribuidos, particularmente en la
programación orientada a aspectos. En el apartado 3, se presenta una introducción a la
arquitectura PRISMA y a su modelo de aspectos. En el apartado 4, presentamos las
plantillas de definición y configuración del aspecto de distribución considerando las
extensiones necesarias que deben ser realizadas en el lenguaje PRISMA. Finalmente,
las conclusiones del artículo son presentadas en el apartado 5.
2 Estado del arte
La distribución y la intercomunicación de los componentes de un sistema, muchas
veces es una cuestión que no afecta a la funcionalidad de los mismos.
Aproximaciones como CORBA y Java RMI [1,3], hacen la distribución parcialmente
transparente para el desarrollador proveyendo a las aplicaciones con una capa
intermedia o ‘middleware’ (i.e. el Object Request Broker (ORB)) que oculta la
distribución, pero los objetos deben ser registrados en el inicio a través de llamadas al
ORB como parte de la funcionalidad de los mismos. Por otra parte, los programadores
deben saber qué objetos estarán distribuidos y desarrollar interfaces para generar stubs
e integrarlos en el ORB. En estas aproximaciones se consigue que el programador
pueda definir sus componentes sin preocuparse de problemas propios de la
distribución como el desarrollo de servidores de nombres. No obstante, no se aborda
el problema de poder especificar el comportamiento de un objeto ante eventos
ocurridos en el ORB (i.e. indicar que un componente debe clonarse al recibir cierta
carga de mensajes en una unidad de tiempo). Problemas de este tipo deben ser
resueltos por el programador.
El grupo CLIP propuso una extensión para el lenguaje Ciao Prolog para especificar
la distribución de sus módulos [12]. En ese sistema, todos los módulos son
especificados como si fueran locales; y la distribución es configurada con una nueva
especificación utilizando el mismo lenguaje (con la extensión propuesta). Después de
ello, el compilador sabe qué módulos deben ser distribuidos y estos son compilados
de un manera particular. Es importante remarcar que el programador no mezcla
funcionalidad con distribución, y solamente utiliza un lenguaje.
La programación orientada a aspectos tiene como principal objetivo la división del
código fuente de las aplicaciones en diferentes módulos dedicados a resolver una
parte concreta del problema tratado, la cual es llamada aspecto (i.e. distribución,
evolución, coordinación, etc.). Esta división se realiza de tal forma que cada uno de
los aspectos puede ser desarrollado de manera independiente al resto del código, lo
cual beneficia la modularidad y reutilización del mismo. Muchas de las
aproximaciones existentes hoy en día [9,10] son aproximaciones que tratan de aplicar
esta disciplina a un lenguaje en particular como Java, C o Visual Basic. Otras
aproximaciones [8,11,13], por el contrario abordan el problema desde un nivel de
abstracción mayor en un lenguaje de análisis o de diseño y a partir del mismo realizan
una compilación a otro de implementación como pueda ser Java. En este último caso
se habla de análisis o diseño orientado a aspectos. La principal ventaja de estas
aproximaciones radica en que la separación en aspectos se realiza en una etapa más
temprana del ciclo de vida, pudiéndose obtener ventajas como la reutilización de
aspectos en los diagramas de análisis.
En este artículo, se propone un modelo orientado a aspectos donde la
especificación de la funcionalidad y la distribución se realizan separadamente pero en
un mismo lenguaje. Nuestro modelo permite especificar los patrones de distribución
de manera independiente de la funcionalidad de los componentes, pero además
permite que esa especificación de la distribución pueda ser reutilizada en otros
componentes. En particular, se divide el aspecto de distribución en dos secciones, una
sección totalmente reutilizable que especifica la distribución del componente, y otra
parte dedicada a coordinar el aspecto de distribución con el resto de aspectos del
componente y con el propio componente. De esta manera, se consigue poder reutilizar
totalmente la especificación del aspecto de distribución pudiendo llegar incluso a
utilizar mecanismos de reutilización entre aspectos como la herencia.
3 La arquitectura orientada a aspectos PRISMA
PRISMA [11] es un modelo arquitectónico para definir sistemas de información
complejos a partir de la definición y configuración de artefactos software. Los
artefactos PRISMA se definen a partir de la composición de distintos aspectos:
funcional1, calidad, distribución, coordinación, etc. Estos pueden variar en función del
tipo de artefacto y sistema de información que se pretenda definir. Cualquier artefacto
(componente, conector, sistema) del modelo arquitectónico de PRISMA puede ser
visto como un prisma (véase figura 1). Cada cara del prisma define un aspecto del
artefacto; cada aspecto tiene a su vez un nivel base y puede tener un nivel meta para
dar cuenta de su propia evolución.
Figura 1: Un artefacto PRISMA es un prisma compuesto a partir de sus aspectos.
Un artefacto PRISMA puede ser de tres tipos:
Un Componente: es un tipo de artefacto que encapsula funcionalidad y que no
actúa como coordinador entre otros artefactos. Consecuentemente, no puede tener el
aspecto de coordinación, pero necesariamente debe contener un aspecto funcional.
Un Conector: es un tipo de artefacto que actúa como coordinador entre otros
artefactos. Su función es enlazar y sincronizar la comunicación entre componentes,
sistemas y otros conectores. Consecuentemente debe contener un aspecto de
coordinación, pero no un aspecto funcional.
Un Sistema: es un artefacto que agrega un conjunto de conectores, componentes y
otros sistemas conectados adecuadamente entre sí. Cada sistema tiene sus propios
puertos y por lo tanto puede ser tratado como un componente. Adicionalmente, un
sistema define enlaces entre sus propios puertos y los de sus componentes agregados.
1
En PRISMA la funcionalidad de un artefacto es vista como un aspecto independiente.
Cada artefacto PRISMA se compone de un conjunto de aspectos que especifican su
comportamiento global, y de puertos de entrada y salida para poder conectar el
artefacto a otros artefactos y a través de ellos establecer la comunicación. Cada puerto
implementa una interfaz específica que provee un conjunto de atributos y servicios. A
través de los puertos de entrada, el artefacto recibe peticiones del entorno externo
(comportamiento servidor). En contraste, a través de los puertos de salida, el artefacto
realiza peticiones al entorno externo (comportamiento cliente). En ambos casos el
componente no necesita saber con quién se comunica, sino que interactúa con la
interfaz a través de sus puertos pudiendo estar conectado a varios componentes al
mismo tiempo sin que este hecho pueda condicionar su comportamiento.
Entre los aspectos más importantes que un artefacto puede obtener en función de
su tipo destacan:
El Aspecto Funcional: Captura la semántica del sistema de información
definiendo su estructura y comportamiento.
El Aspecto de Coordinación: Establece las reglas de negocio y la sincronización
durante la comunicación entre artefactos. Además, especifica la coreografía y los
protocolos de comunicación, extendiendo el concepto de “contrato” [14].
El Aspecto de Distribución: Especifica las causas y consecuencias de la ubicación
dinámica de las instancias de los artefactos.
En PRISMA existen dos lenguajes –ambos extensiones de OASIS 3.0 [15]– para
especificar modelos arquitectónicos: El lenguaje de definición de componentes y el
lenguaje de configuración de sistemas. El primero define los tipos de artefactos de la
arquitectura; el segundo especifica como interconectarlos estableciendo una topología
determinada. Ambos lenguajes establecen como constructores de primer orden
interfaces, aspectos, componentes y conectores; de tal manera que cualquier interfaz
puede ser reutilizada por diferentes aspectos, y cualquier aspecto puede ser reutilizado
por diferentes artefactos.
Como resumen, los componentes son ignorantes de a quién están conectados en la
arquitectura. Simplemente envían y reciben peticiones mediante sus puertos sin
conocer el origen o destino de las mismas. La conexión de distintos componentes se
realiza a través de un conector que sí es consciente de los componentes que coordina.
Teniendo en cuenta esta característica, en el aspecto de distribución, serán los
conectores los únicos artefactos que conocen la ubicación de los artefactos a los que
se conectan, permaneciendo esta información oculta para los componentes.
4 El aspecto de distribución de PRISMA
En este apartado se va a presentar el aspecto de distribución de la arquitectura
PRISMA. En su definición se han preservado las características del modelo PRISMA
permitiendo que la especificación del aspecto sea independiente de la arquitectura del
sistema concreto donde ese aspecto funcionará (i.e. en la definición del aspecto no es
preciso conocer con qué otros artefactos será interconectado). Además, la definición
del aspecto es independiente del propio artefacto donde este será insertado (i.e. en la
definición del aspecto no es preciso conocer la definición del propio artefacto ni del
resto de aspectos que este incluirá). De esta manera se consigue maximizar la
reutilización de las especificaciones realizadas en otros componentes.
Figura 2: Reutilización de aspectos a partir de su sincronización en componentes
La especificación del aspecto de distribución de PRISMA está dividida en dos
partes: la primera parte especifica qué comportamiento tiene este aspecto en el
sistema distribuido (i.e. qué patrones de distribución satisface este aspecto); la
segunda parte especifica cómo sincronizar el comportamiento del aspecto de
distribución con el comportamiento del resto de aspectos. Esta división permite que la
primera parte del aspecto sea totalmente independiente del componente en el que ese
aspecto va a ser incluido, lo cual permite la reutilización de aspectos.
En la figura 2 se muestra como un conjunto de aspectos ya definidos pueden ser
reutilizados incluyéndolos en un componente de tal manera que para acoplar el
aspecto en el componente solamente es necesario especificar la sincronización entre el
aspecto y el componente (b). El resto de la especificación es independiente del
componente y consecuentemente reutilizable. En consecuencia, una especificación
completa consta de dos partes, la parte definición la cual es independiente del
componente y la parte sincronización la cual está totalmente ligada al componente.
Las letras a y b también indican el orden de desarrollo de las distintas partes del
componente. Concretamente, no es posible desarrollar la parte de sincronización de
un aspecto sin tener previamente desarrolladas las especificaciones del componente
base y del propio aspecto. Es evidente que este mecanismo puede ser incorporado en
todos los aspectos de la arquitectura, sin embargo este trabajo está orientado a la
especificación del aspecto de distribución.
Como ya se ha comentado en el apartado 3, existen modelos [13] que permiten
componer un componente complejo a partir de aspectos parcialmente independientes;
ahora bien, si el arquitecto deseara reutilizar un aspecto de distribución concreto para
definir otro aspecto más complejo no podría hacerlo. Esto se debe a que en la mayoría
de las aproximaciones no existe la herencia entre aspectos, puesto que el nivel de
granularidad en la reutilización es el aspecto completo. En nuestra propuesta estas
limitaciones se ven solventadas gracias a la separación introducida entre
especificación y sincronización que hace que la primera parte de la especificación sea
totalmente independiente del componente.
Figura 3: Proceso de desarrollo de sistemas en PRISMA
El mecanismo de herencia obliga a incluir en la plantilla de definición del aspecto
de distribución un mecanismo de identificación propio y del resto de aspectos para
poder determinar de cual de ellos se heredan propiedades. Sin embargo, la herencia
también permite poder realizar una composición de aspectos incremental a partir de
patrones de comportamiento ya definidos, permitiendo así que la reutilización no solo
se realice en el momento de crear componentes, sino también en el momento de
componer aspectos. De esta manera, el arquitecto dispondría, para el caso del aspecto
de distribución, de una colección de patrones para componer aspectos de distribución
y de una colección de aspectos para componer componentes (véase figura 3).
Cada patrón de comportamiento consiste en una especificación de aspecto que
captura la semántica de un patrón elemental que se repite con frecuencia. Gracias al
mecanismo de herencia la composición de aspectos puede realizarse a partir de
librerías de patrones ya especificados reutilizándolos en cada especificación. La figura
4 presenta las plantillas de definición y configuración de aspectos para el caso del
aspecto de distribución. Posteriormente, se presenta un ejemplo completo de
especificación usando ambas plantillas en el que se aprecia el mecanismo de herencia.
Las plantillas de la figura 4 dividen la especificación del aspecto de distribución en
dos secciones. La primera sección define el comportamiento del aspecto a partir de la
semántica del lenguaje OASIS 3.0 [15]; a partir de ella, dicha definición establece el
comportamiento cliente-servidor autodefiniendo todos los atributos y servicios sobre
los que se quiera establecer una observación. La segunda plantilla asocia estos
servicios y atributos con los correspondientes de los aspectos del componente en el
que el aspecto de distribución se inserte. De esta manera, la primera especificación
define el comportamiento independientemente del componente, y la segunda parte lo
configura y sincroniza con el resto de aspectos. Adicionalmente, permite especificar
una URL donde el aspecto comenzará su ejecución.
Distribution Aspect (Definición)
Identifier
AID
Inheritance
List of AIDs
Constant Attributes
CAtrib1: String; CAtrib2: Int towards (1, 1); ...
Variable Attributes
VAtribute1: Boolean; VAtribute2: Boolean; ...
Services
Service1; Service2; ...
Valuations
Event1 [Cond1] Instr1; Event2 [Cond2] Instr2;
Triggers
Trigger1; Trigger 2; ...
Distribution Aspect (Configuración)
Location
URL
Matching with
Functional Aspect
Ext_Event() ->Event()
...
Coordination Aspect
Ext_Event() ->Event()
...
End Distribution Aspect
End Distribution Aspect
Figura 4: Plantillas de definición y configuración del aspecto de distribución
La figura 5 muestra la especificación de dos patrones de comportamiento AID1 y
AID2 del aspecto de distribución. El patrón AID1 ofrece el servicio ‘move’ al resto de
componentes del sistema, permitiendo así que otros componentes puedan mover2 al
componente que posee este patrón en su plantilla. El patrón AID2 ofrece el servicio
‘clone’ que crea una copia del componente que posee este patrón en la URL
especificada. Adicionalmente mantiene una lista de las copias creadas. Reutilizando
los patrones AID1 y AID2 a partir de una relación de herencia se ha definido el
aspecto de distribución AID3, el cual hereda el comportamiento especificado en AID1
y AID2 y además extiende dicho comportamiento especificando que cuando el
servicio ‘Ext_event’ sea invocado 100 veces entonces el aspecto de distribución
supondrá que existe un elevado tráfico en la red producido por invocaciones a ese
servicio y consecuentemente creará una copia de ese componente a través del servicio
‘clone’; de esta manera la carga puede repartirse entre ambos componentes. Como
puede apreciarse, la definición de los aspectos que se ha realizado es totalmente
independiente del componente en el que ese aspecto vaya a ser insertado. Cada
definición de aspecto únicamente especifica un conjunto de servicios que el aspecto
ofrece, y la manera en que el aspecto debe comportarse ante una llamada a los
mismos. La interacción entre un aspecto particular y el resto de aspectos de un
componente se realiza en la plantilla de configuración del aspecto. Para el caso del
ejemplo, la plantilla de configuración que se ha especificado puede apreciarse en la
figura 5. Concretamente, en dicha plantilla se especifica, además de la dirección
inicial de ejecución del componente, que el servicio ‘Ext_event’ sobre el que se desea
realizar una observación se corresponde con el servicio ‘Copyfile’ del aspecto
funcional. De esta manera, el acoplamiento entre la especificación del
comportamiento y el resto de aspectos del componente se realiza en una
especificación independiente permitiendo su total reutilización.
2
La instrucción System.move(URL) es una llamada al middleware PRISMA que básicamente
crea una instancia en la URL especificada igual al componente invocador a través del
servicio ‘create’, y a continuación invoca al servicio ‘destroy’ de ese mismo componente.
Distribution Aspect (Definición)
Attributes
Address:URL;
Identifier
AID1
Services
Move(location: URL);
Valuations
[Move(location)] Address = location;
Triggers
System.move(location) if Move(location);
End Distribution Aspect
Distribution Aspect (Definición)
Identifier
AID3
Inheritance
AID1, AID2;
Variable Attributes
NumEvent: nat (0);
Limit:nat(100);
Services
Init();
Ext_Event(); Imported
Valuations
[Init()] NumEvent = 0;
[Ext_Event()] NumEvent = NumEvent + 1;
Triggers
Init() & Clone(Address) if NumEvent =Limit;
End Distribution Aspect
Distribution Aspect (Definición)
Identifier
AID2
Variable Attributes
Clones: List of URL;
Services
Clone(location: URL);
Valuations
[Clone(location)] Clones.add(location);
Triggers
new System.this.create(location) if
Clone(location);
End Distribution Aspect
Distribution Aspect (Configuración)
Address = www.dsic.upv.es
Matching with
Functional Aspect
Ext_Event() ->CopyFile()
Distribution Aspect
Figura 5: Ejemplo de definición y configuración del aspecto de distribución
5. Conclusiones
La especificación de la distribución constituye una importante tarea en el desarrollo
de sistemas de información. En la actualidad, existen trabajos en los cuales dicha tarea
se realiza de una manera independiente de la especificación de la funcionalidad. En
particular, esto ocurre en el paradigma orientado a aspectos donde la distribución y la
funcionalidad son especificadas en aspectos separados.
En este trabajo se presenta una propuesta que combina arquitecturas software con
desarrollo orientado a aspectos, elevando de esta forma el nivel de abstracción en la
especificación de la distribución. Se han introducido las plantillas de especificación y
configuración del aspecto de distribución de la arquitectura PRISMA. En la plantilla
de especificación se indican qué patrones de comportamiento de distribución satisface
el aspecto. Dicha especificación es independiente del componente y del resto de
aspectos del mismo; permitiendo ser totalmente reutilizada en otros componentes. La
plantilla de configuración es la encargada de sincronizar la especificación con el resto
de aspectos. La separación introducida entre definición y configuración ha permitido
utilizar mecanismos como la herencia en la plantilla de especificación de aspectos.
A partir del modelo presentado, actualmente se está elaborando la taxonomía de
patrones de comportamiento que formará los elementos básicos de composición en la
arquitectura. Las implementaciones realizadas sobre las ideas presentadas en el
artículo, así como de los patrones ya desarrollados pueden encontrarse en la dirección:
http://www.dsic.upv.es/~jsilva/dea
Referencias
1. CORBA Official Web Site of the OMG Group: http://www.corba.org/
2. DCE
documentation
of
Open
Software
Foundation
(OSF):
http://www.transarc.ibm.com/Library/documentation/dce/1.1/index.html
3. JAVA Remote Method Invocation (RMI) Specification of SUN Microsistems:
http://java.sun.com/j2se/1.4/docs/guide/rmi/spec/rmiTOC.html
4. Distributed Component Object Model (DCOM) at Microsoft Web site:
http://www.microsoft.com/com/tech/dcom.asp
5. Kermarrec, Y., Nana, L., Pautet, L., and Tardieu, S.; “GNATDIST : a configuration
language for distributed Ada 95 applications” In ACM, editor, ACM Tri Ada conference,
Philadelphia, Pages 63-72, 1996.
6. Haridi, Seif, Van Roy, Peter; Smolka, Gert. “An Overview of the Design of Distributed Oz”.
Proceedings of the Second International Symposium on Parallel Symbolic Computation
(PASCO '97), p.176-187, Maui, Hawaii, USA. July 1997.
7. Álvaro López Ortega; “Programación distribuida con ADA95 bajo GNU/Linux (I)”;
Editorial Hispalinux, Valencia, España. 2001.
8. Herrero J. L., “Propuesta de una Plataforma, Lenguaje y Diseño, para el Desarrollo de
Aplicaciones Orientadas a Aspectos”. Tesis Doctoral, Extremadura, Mayo 2003.
9. Samtani Sergio Soares and Paulo Borba. “PaDA: A Pattern for Distribution Aspects”. In
Second Latin American Conference on Pattern Languages Programming —
SugarLoafPLoP, Itaipava, Rio de Janeiro, Brazil, August 2002.
10. Sérgio Soares, Eduardo Laureano and Paulo Borba. “Implementing Distribution and
Persistence Aspects with AspectJ”. Proceedings of the 17th ACM Conference on ObjectOriented programming systems, languages, and applications, OOPSLA'02, páginas 174190, ACM Press. 2002, Seattle, WA, EUA. ACM SIGPLAN Notices 37(11).
11. Pérez J., Ramos I.,Lorenzo A., Letelier P., Jaén J., “PRISMA: PlatafoRma OASIS para
Modelos Arquitectónicos”, Actas VII Jornadas de Ingeniería del Software y Bases de Datos,
JISBD, Escorial (Madrid), Noviembre 2002.
12. J. Correas, F. Bueno. “A Configuration Framework to Develop and Deploy Distributed
Logic Applications”. ICLP01 Colloquium on Implementation of Constraint and Logic
Programming Systems, November 2001.
13. M. Pinto, L. Fuentes, M. E. Fayad, J. M. Troya, Separation of coordination in a dynamic
aspect oriented framework, Proceedings of the 1st international conference on Aspectoriented software development, Enschede, The Netherlands, Pages: 134 – 140. 2002.
14. L.Andrade and J.Fiadeiro; "Interconnecting Objects via Contracts", in UML'99 -Beyond
the Standard, R.France and B.Rumpe (eds), LNCS 1723, pp. 566-583, Springer Verlag
1999.
15. P.Letelier, P.Sánchez, I.Ramos, O.Pastor. “OASIS 3.0: Un enfoque formal para el
modelado conceptual orientado a objeto”, Servicio de Publicaciones Universidad
Politécnica de Valencia, SPUPV -98.4011, ISBN 84-7721-663-0, 1998.