MDA Aplicado: Una Gramática de Grafos para la Transformación de Relaciones de
Asociación.
Javier MuñozJavier Muñoz, Marta Ruiz, Manoli Albert, Vicente Pelechano
Grupo OO-MethodDepartamento de Sistemas Informáticos y Computación
Universidad Politécnica de Valencia
I Taller sobre Desarrollo de Software Dirigido por
Modelos, MDA y Aplicaciones (DSDM'04)
Agenda Introducción
Caracterización de Relaciones de Asociación
Implementación de Relaciones de Asociación
Transformación de Relaciones de Asociación Gramáticas de Grafos
Metamodelos
La Gramática
Implementación
Conclusiones
Introducción MDA constituye un enfoque adecuado para realizar generación de
código siguiendo una estrategia basada en modelos.
Las transformaciones entre modelos se convierten en un elemento clave
SourceCode
PIM Model to ModelTransformation
PSM Model to CodeTransformation
Introducción
MDA no propone una técnica estándar
Están trabajando en ello (RFP QVT)
Se están proponiendo y estudiando varias técnicas Manipulación directa de los modelos Enfoques relacionales Gramáticas de grafos XSLT
Introducción
Aplicación TransformacionesAplicación Transformaciones
+Crear()+Destruir()
-DNI-Nombre-Puesto
Empleado
+Crear()+Destruir()
-CIF-Nombre
EmpresaTrabajaPara
+constructor()+destructor()
-ObjetoRelacionado1-ObjetoRelacionado2-RF-AS
MediadorAsociacion
+desconectar_enlace()+conectar_enlace()
-coleccionEnlaces-Min-Max-CT-PB-V-PI
DecoradorColega
+comprobar_reflexividad()+comprobar_antisimetria()
MediadorAsociacionTrabajaPara
Empleado
+constructor()+destructor()+crear_enlace()+borrar_enlace()+comprobar_multiplicidad_maxima()+comprobar_multiplicidad_minima()+comprobar_caracteristicas_temporales()
-objetoDecorado
DecoradorColegaEmpleado
Empresa
* 2
1
1
*
1
+constructor()+destructor()+crear_enlace()+borrar_enlace()+comprobar_multiplicidad_maxima()+comprobar_multiplicidad_minima()+comprobar_caracteristicas_temporales()
-objetoDecorado
DecoradorColegaEmpresa
1
1*
1
class Empleado{
String Nombre;
...
}
class Empresa {
String Nombre;
...
}
PIM
Modelado Conceptual Orientado a Objetos
Clases de Diseño
PSM
Relaciones de asociación
Los métodos de Desarrollo de Software Dirigido por modelos necesitan primitivas conceptuales precisas
La descripción que realiza UML de las relaciones de asociación, agregación y composición es ambigua y no es aceptada por la mayoría de la comunidad OO
En este trabajo se parte del marco conceptual propuesto en [Albert2003] presentado en CAiSE2003
Marco conceptual para relaciones de asociación Características Temporales
Dinámica/Estática
Multiplicidad Número min y max conectados
Propagación de Borrado Restrictivo/Cascada/Enlace
Visibilidad Visible/No visible
Proyección de Identificación Proyectado/No Proyectado
Reflexividad Reflexivo/No Reflexivo
Simetría Simétrica/Antisimética
Implementación de relaciones de asociación A partir del marco conceptual se realiza una propuesta
de implementación aplicando patrones de diseño ([Ruiz2004] en IDEAS’04)
Ideas básicas Una relación de asociación tiene semántica propia
Patrón Mediator Los objetos que participan tienen estructura y comportamiento
adicional Patrón Decorator
Las relaciones comparten estructura y estrategia de ejecución para la gestión de enlaces
Patrón Template Method
Implementación de relaciones de asociación
+Crear()+Destruir()
-DNI-Nombre-Puesto
Empleado
+Crear()+Destruir()
-CIF-Nombre
EmpresaTrabajaPara
+constructor()+destructor()
-ObjetoRelacionado1-ObjetoRelacionado2-RF-AS
MediadorAsociacion
+desconectar_enlace()+conectar_enlace()
-coleccionEnlaces-Min-Max-CT-PB-V-PI
DecoradorColega
+comprobar_reflexividad()+comprobar_antisimetria()
MediadorAsociacionTrabajaPara
Empleado
+constructor()+destructor()+crear_enlace()+borrar_enlace()+comprobar_multiplicidad_maxima()+comprobar_multiplicidad_minima()+comprobar_caracteristicas_temporales()
-objetoDecorado
DecoradorColegaEmpleado
Empresa
* 2
1
1
*
1
+constructor()+destructor()+crear_enlace()+borrar_enlace()+comprobar_multiplicidad_maxima()+comprobar_multiplicidad_minima()+comprobar_caracteristicas_temporales()
-objetoDecorado
DecoradorColegaEmpresa
1
1*
1
Clases decoradoras
Clasemediadora
Clases abstractas
(template method)
Transformación de modelos
Un modelo puede ser gestionado con un grafo Elementos = nodos etiquetados Relaciones = enlaces etiquetados entre nodos
Ventajas de las gramáticas de grafos Base de conocimiento existente Sintaxis gráfica Naturaleza declarativa Herramientas para su aplicación
Gramáticas de Grafos
Una gramática de grafos se compone de una serie de reglas
Cada regla define: En la parte izquierda (LHS) un subgrafo Patrón En la parte derecha (RHS) un subgrafo Sustitución
a : Integer = ???b : Boolean = ???
??? : A
c : String = ???
??? : B
a : Integer = >=10b : Boolean = ???
??? : A
c : String = match(2).c
match(2).name : B
x : Integer = match(3).a - 10
match(3).name : C
c : String = ''
match(1).name+match(2).name : B
:=
1)
4)
3')
2)
3)
2)
Gramáticas de Grafosa : Integer = ???b : Boolean = ???
??? : A
c : String = ???
??? : B
a : Integer = >=10b : Boolean = ???
??? : A
c : String = match(2).c
match(2).name : B
x : Integer = match(3).a - 10
match(3).name : C
c : String = ''
match(1).name+match(2).name : B
:=
1)
4)
3')
2)
3)
2)
a : Integer = 12b : Boolean = false
Objeto1 : A
c : String = 'hello'
Objeto2 : B
x : Integer = 3
Objeto3 : C
a : Integer = 7b : Boolean = true
Objeto4 : A
c : String = bye
Objeto5 : Ba : Integer = 2b : Boolean = true
Objeto6 : A
c : String = summer
Objeto7 : B
x : Integer = 2
Objeto1 : C
c : String = hello
Objeto2 : B
c : String = bye
Objeto15 : B
x : Integer = 3
Objeto3 : C
c : String = ''
Objeto1Objeto2 : B
a : Integer = 2b : Boolean = true
Objeto6 : A
c : String = summer
Objeto7 : B->
Transformación de Relaciones de Asociación
Estrategia a seguir:
1. Definir el metamodelo origen (metamodelo de análisis)
2. Definir el metamodelo destino (metamodelo de diseño)
3. Especificar la gramática para la transformación entre
metamodelos
Metamodelo de Análisis
Basado en el marco conceptual
-name : String
Analysis::Class
-CT : String-Min : Integer-Max : String-PB : String-V : Boolean-PI : Boolean
Analysis::AssociationEnd
-name : String-RF : Boolean-AS : Boolean
Analysis::Association
1
0..n
2 1-name : String-type : String
Analysis::Property
Analysis::StructuralFeature
Analysis::KeyProperty
Metamodelo análisis (ejemplo)
-NombreCompleto : String-Edad : Integer
Empleado
-CIF : String
Empresa
1..n 0..n
TrabajaPara
name : String = Empleado
Empleado : Analysis::Class
name : String = Empresa
Empresa : Analysis::Class
CT : String = dinamicaMin : Integer = 1Max : String = nPB : String = enlaceV : Boolean = falsoPI : Boolean = falso
Empl2Empr : Analysis::AssociationEnd
CT : String = dinamicaMin : Integer = 0Max : String = nPB : String = enlaceV : Boolean = ciertoPI : Boolean = falso
Empr2Empl : Analysis::AssociationEnd
name : String = TrabajaParaRF : Boolean = falseAS : Boolean = false
TrabajaPara : Analysis::Association
name : String = NombreCompletotype : String = String
NombreCompleto : Analysis::Property
name : String = Edadtype : String = Integer
Edad : Analysis::Propertyname : String = CIFtype : String = String
CIF : Analysis::Property
Metamodelo de Diseño
Elementos básicos de cualquier lenguaje orientado a objetos
Usando nomenclatura de C#
-name : String-abstract : Boolean
Design::Class
-name : String-visibility : String
Design::Attribute
Design::Reference Design::CollectionBase
10..n
1
0..n 0..n
1Design::DataType
0..n
1
Design::InitialValue
-name : String
Design::Atom
-content : String
Design::AtomicValue Design::CollectionBaseValue
1
0..n
-id : Long
Design::ObjectDesign::ReferenceValue
10..n
1
0..n
1
1
-specializes
1
-is_specialized
0..n
1
0..n
-name : String-body : String-visibility : String-override : Boolean-abstract : Boolean
Design::Operation-name : String
Design::Argument
Design::ReturnValue
1
0..n 1
0..n
1 0..1
0..n
1
0..n
1
Metamodelo de Diseño (ejemplo)
public class Persona
{
public String Nombre;
private Integer Edad;
private Persona Vecino;
public String [] Telefonos;
public void fijarEdad(Integer nueva_edad)
{
Edad = nueva_edad;
}
}
name : String = Personaabstract : Boolean = false
Persona : Design::Class
: Design::Reference
name : String = String
String : Design::Atom
name : String = Integer
Integer : Design::Atom
name : String = Nombrevisibility : String = public
Nombre : Design::Attribute
name : String = Edadvisibility : String = private
Edad : Design::Attribute
name : String = Vecinovisibility : String = private
Vecino : Design::Attribute
name : String = Telefonosvisibility : String = public
Telefonos : Design::Attribute
VString : Design::CollectionBase
name : String = fijarEdadbody : Stringvisibility : String = publicoverride : Boolean = falseabstract : Boolean = false
fijarEdad : Design::Operation
name : String = nueva_edad
nueva_edad : Design::Argument
body: Edad = nueva_edad;
La Gramática para Transformación de Relaciones de Asociación R1. Creación de tipos de datos atómicos R2. Transformación de clases de análisis R3. Creación de la estructura de las clases base R4. Creación de las operaciones de DecoradorColega R5. Creación de las operaciones de MediadorAsociacion R6. Transformación de los extremos de la asociación R7. Transformación de la asociación R8. Transformación de las propiedades clave con PI R9. Transformación de las propiedades clave sin PI R10. Transformación de las propiedades R11. Eliminación de enlaces innecesarios
R1. Creación de tipos de datos atómicos
name : String = ???
??? : Design::Atom
1)
:=
name : String = String
String : Design::Atom
name : String = Integer
Integer : Design::Atom
name : String = Boolean
Boolean : Design::Atom4)
3)
2)
name : String = Object
Object : Design::Atom5)
R3. Creación de la estructura de clases base
name : String = DecoradorColegaabstract : Boolean = ???
DecoradorColega : Design::Class
name : String = DecoradorColegaabstract : Boolean = true
DecoradorColega : Design::Class
name : String = DecoradorColegaabstract : Boolean = true
MediadorAsociacion : Design::Class
name : String = String
String : Design::Atom
name : String = Integer
Integer : Design::Atom
name : String = Boolean
Boolean : Design::Atom
name : String
String : Design::Atom
name : String = Integer
Integer : Design::Atom
name : String = Boolean
Boolean : Design::Atom
name : String = Minvisibility : String = protected
Min : Design::Attribute
name : String = Maxvisibility : String = protected
Max : Design::Attribute
name : String = CTvisibility : String = protected
CT : Design::Attribute
name : String = PBvisibility : String = protected
PB : Design::Attribute
name : String = Vvisibility : String = private
V : Design::Attributename : String = RFvisibility : String = private
RF : Design::Attribute
name : String = ASvisibility : String = private
AS : Design::Attribute
: Design::Reference : Design::Reference
name : String = coleccionEnlacesvisibility : String = private
coleccionEnlaces : Design::Attribute
name : String = ObjetoRelacionado1visibility : String = private
ObjetoRelacionado1 : Design::Attribute
name : String = ObjetoRelacionado2visibility : String = private
ObjetoRelacionado2 : Design::Attribute
name : String = Estadovisibility : String = protected
Estado : Design::Attribute
1)
2)
3)
4)
:=
1)
2)
3)
6)
7) 8)9)
10)
11)
12)
13)
14)
15)
16)
17)
18)
19)
name : String = Object
Object : Design::Atomname : String = ObjetoDecoradovisibility : String = public
ObjetoDecorado : Design::Attribute4)
21)
20)
name : String = Object
Object : Design::Atom
5)
R6. Transformación de los extremos de la asociación
CT : String = ???Min : Integer = ???Max : String = ???PB : String = ???V : Boolean = ???PI : Boolean = ???
??? : Analysis::AssociationEndname : String = DecoradorColegaabstract : Boolean = ???
DecoradorColega : Design::Class
name : String = Minvisibility : String = ???
Min : Design::Attribute
name : String = Maxvisibility : String = ???
Max : Design::Attribute
name : String = Vvisibility : String = ???
V : Design::Attribute
name : String = CTvisibility : String = ???
CT : Design::Attribute
name : String = PBvisibility : String = ???
PB : Design::Attribute
name : String = DecoradorColega+match(4).nameabstract : Boolean = false
DecoradorColega+match(4).name : Design::Class
name : String = DecoradorColegaabstract : Boolean = true
DecoradorColega : Design::Class
-specializes-is_specialized
name : String = Minvisibility : String = match(3).name
Min : Design::Attribute
name : String = Maxvisibility : String = match(4).name
Max : Design::Attribute
name : String = Vvisibility : String = match(5).name
V : Design::Attribute
name : String = CTvisibility : String = match(6).name
CT : Design::Attribute
name : String = PBvisibility : String = match(7).name
PB : Design::Attribute
content : String = match(2).Min
: Design::AtomicValue
content : String = match(2).Max
: Design::AtomicValue
content : String = match(2).V
: Design::AtomicValue
content : String = match(2).CT
: Design::AtomicValue
content : String = match(2).PB
: Design::AtomicValue
1)
3)
4) 5)
6)
7)
8)
1')
17)
2')
4)5)
6)
7)
8)
9)
3)
11)
12)
14)
:=
name : String = PIvisibility : String = ???
PI : Design::Attribute
2)
name : String = PIvisibility : String = match(8).name
PI : Design::Attribute
content : String = match(2).PI
: Design::AtomicValue
name : String = ???RF : Boolean = ???AS : Boolean = ???
??? : Analysis::Association
CT : String = ???Min : Integer = ???Max : String = ???PB : String = ???V : Boolean = ???PI : Boolean = ???
??? : Analysis::AssociationEnd
10)
9)
name : String = ???abstract : Boolean = ???
??? : Design::Class
name : String = ???abstract : Boolean = ???
??? : Design::Class
12)
11)
name : String = match(3).nameRF : Boolean = match(3).RFAS : Boolean = match(3).AS
match(3).name : Analysis::Association
name : String = DecoradorColega+match(5).nameabstract : Boolean = false
DecoradorColega+match(5).name : Design::Class
content : String = match(1).Min
: Design::AtomicValue
content : String = matc(1).Max
: Design::AtomicValue
content : String = match(1).V
: Design::AtomicValue
content : String = match(1).CT
: Design::AtomicValue
content : String = match(1).PB
: Design::AtomicValue
content : String = match(1).PI
: Design::AtomicValue
name : String = match(4).nameabstract : Boolean = match(4).abstract
match(4).name : Design::Class
name : String = match(5).nameabstract : Boolean = match(5).abstract
match(5).name : Design::Class
-specializes -is_specialized
24)
23)
22)
21)
20)
19)
18)
16)
15)
4
R6. Transformación de los extremos de la asociación
CT : String = ???Min : Integer = ???Max : String = ???PB : String = ???V : Boolean = ???PI : Boolean = ???
??? : Analysis::AssociationEndname : String = DecoradorColegaabstract : Boolean = ???
DecoradorColega : Design::Class
name : String = Minvisibility : String = ???
Min : Design::Attribute
name : String = Maxvisibility : String = ???
Max : Design::Attribute
name : String = Vvisibility : String = ???
V : Design::Attribute
name : String = CTvisibility : String = ???
CT : Design::Attribute
name : String = PBvisibility : String = ???
PB : Design::Attribute
name : String = DecoradorColega+match(4).nameabstract : Boolean = false
DecoradorColega+match(4).name : Design::Class
name : String = DecoradorColegaabstract : Boolean = true
DecoradorColega : Design::Class
-specializes-is_specialized
name : String = Minvisibility : String = match(3).name
Min : Design::Attribute
name : String = Maxvisibility : String = match(4).name
Max : Design::Attribute
name : String = Vvisibility : String = match(5).name
V : Design::Attribute
name : String = CTvisibility : String = match(6).name
CT : Design::Attribute
name : String = PBvisibility : String = match(7).name
PB : Design::Attribute
content : String = match(2).Min
: Design::AtomicValue
content : String = match(2).Max
: Design::AtomicValue
content : String = match(2).V
: Design::AtomicValue
content : String = match(2).CT
: Design::AtomicValue
content : String = match(2).PB
: Design::AtomicValue
1)
3)
4) 5)
6)
7)
8)
1')
17)
2')
4)5)
6)
7)
8)
9)
3)
11)
12)
14)
:=
name : String = PIvisibility : String = ???
PI : Design::Attribute
2)
name : String = PIvisibility : String = match(8).name
PI : Design::Attribute
content : String = match(2).PI
: Design::AtomicValue
name : String = ???RF : Boolean = ???AS : Boolean = ???
??? : Analysis::Association
CT : String = ???Min : Integer = ???Max : String = ???PB : String = ???V : Boolean = ???PI : Boolean = ???
??? : Analysis::AssociationEnd
10)
9)
name : String = ???abstract : Boolean = ???
??? : Design::Class
name : String = ???abstract : Boolean = ???
??? : Design::Class
12)
11)
name : String = match(3).nameRF : Boolean = match(3).RFAS : Boolean = match(3).AS
match(3).name : Analysis::Association
name : String = DecoradorColega+match(5).nameabstract : Boolean = false
DecoradorColega+match(5).name : Design::Class
content : String = match(1).Min
: Design::AtomicValue
content : String = matc(1).Max
: Design::AtomicValue
content : String = match(1).V
: Design::AtomicValue
content : String = match(1).CT
: Design::AtomicValue
content : String = match(1).PB
: Design::AtomicValue
content : String = match(1).PI
: Design::AtomicValue
name : String = match(4).nameabstract : Boolean = match(4).abstract
match(4).name : Design::Class
name : String = match(5).nameabstract : Boolean = match(5).abstract
match(5).name : Design::Class
-specializes -is_specialized
24)
23)
22)
21)
20)
19)
18)
16)
15)
4
Implementación de la Gramática
Utilizando la herramienta Atom3 (http://atom3.cs.mcgill.ca/) Especificación de los metamodelos mediante ER Obtención de editores gráficos para los MM Especificación y aplicación de la gramática de grafos
Problemas encontrados No soporta herencia en la definición de los MM En la aplicación de la GG, el modelo debe validar siempre uno de
los MM No es muy estable y la usabilidad es baja
Implementación de la Gramática
Conclusiones
Se han aplicado gramáticas de grafos para definir transformaciones entre modelos en el contexto de MDA
Conclusiones: Es factible utilizar GG en MDA Algunas reglas pueden resultar poco legibles Las reglas con más elementos corresponden a la creación de la
infraestructura del sistema
Trabajo futuro: Implementar la GG con otras herramientas Implementar la transformación con otras técnicas Especificar transformaciones más complejas Estudiar la separación de la infraestructura y la parte específica
Gracias