Patrones de Diseño en MDA
Patrones de Diseño “descripciones de objetos que se comunican y clases que son personalizadas para resolver un problema de diseño general en un contexto particular” (Gamma y otros, 1995)
Patrones de Diseño Los patrones de diseño describen soluciones a problemas de diseño recurrentes. Un patrón de diseño nombra, abstrae e identifica los aspectos claves de una estructura de diseño común que lo hacen útil para crear un diseño orientado a objetos reusable. Un patrón de diseño identifica las clases que participan y las instancias, sus roles y colaboraciones, y la distribución de responsabilidades.
Metamodelos de Patrones de Diseño El metamodelo de un patrón de diseño dado, describe la familia de modelos que forman el espacio de soluciones de ese patrón.
Metamodelos de Patrones de Diseño en MDA Metamodelos en tres niveles: PIM: metamodelos de patrones definidos de manera independiente de cualquier plataforma o tecnología específicas. PSM: metamodelos de patrones definidos teniendo en cuenta una plataforma específica. Por ejemplo JAVA, EIFFEL. ISM: metamodelos de patrones que corresponden a un lenguaje de programación específico.
Metamodelos de Patrones de Diseño en MDA Los Metamodelos de Patrones a nivel PIM son especificados teniendo en cuenta: La estructura Los participantes Colaboraciones
Metamodelos de Patrones de Diseño en MDA Metamodelos de Patrones a nivel PSM son especificados teniendo en cuenta: El metamodelo a nivel PIM del patrón Las características de la plataforma. Por ejemplo un metamodelo para la plataforma Java restringe la herencia, ya que Java no permite herencia múltiple, mientras que un metamodelo para la plataforma EIFFEL no tendrá esta restricción.
Metamodelos de Patrones de Diseño en MDA Metamodelos de Patrones a nivel ISM son especificados teniendo en cuenta: La gramática del lenguaje de programación específico
Especificación de los Metamodelos de Patrones de Diseño La especificación del espacio de soluciones de un patrón de diseño se logra a través de la especialización del metamodelo UML y la especificación de un conjunto de restricciones escritas en OCL.
Notación de los Metamodelos de Patrones de Diseño Para la especificación de los metamodelos de los patrones se usa la notación de la especificación de UML de manera semi-formal usando la combinación de notación gráfica, lenguaje natural y lenguaje formal: Sintaxis abstracta: diagrama de clases UML (metaclases que definen las construcciones y sus relaciones) junto con una descripción en lenguaje natural. Restricciones: son provistas usando el lenguaje OCL y un lenguaje natural. Semántica: el significado de las construcciones es definido usando lenguaje natural.
Relaciones entre Modelos y Metamodelos
Ejemplo: Patrón de Diseño Observer
Patrón de Diseño Observer El patrón de diseño Observer “define una dependencia uno a muchos entre objetos de manera tal que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente” (Gamma y otros, 1995).
Patrón Observer : Diagramas de Clases y de Secuencia UML
Metamodelo del Patrón de Diseño Observer a nivel PIM
Patrón Observer- Metamodelo PIM : Diagrama de Clases
Patrón de Diseño Observer Metamodelo PIM: Restricciones Metaclase Subject Un sujeto, instancia de la metaclase Subject puede ser una clase o una interfaz. (self.oclIsTypeOf(Class) or self.oclIsTypeOf(Interface)
Patrón de Diseño Observer Metamodelo PIM : Restricciones Metaclase Attach [1] Esta operación cambia el estado del sujeto. not self.isQuery [2] Esta operación tiene un conjunto no vacío de parámetros y uno de ellos debe ser de entrada (direction= #in) y del tipo Observer. self.parameter->notEmpty( ) and self.parameter->select ( param | param.direction= #in and param.type= oclIsKindOf(Observer)) -> size( ) = 1
Patrón de Diseño Observer Metamodelo PIM : Restriciones Metaclase RelationshipSubject Una instancia de esta relación está restringida a ser una generalización o una realización de interfaz. self.oclIsTypeOf( Generalization) or (self.oclIsTypeOf(InterfaceRealization)) and self.oclIsTypeOf(Generalization) implies ( self.general.oclIsKindOf(Class) and self.general.oclIsTypeOf(Subject) and self.specific.oclIsTypeOf(ConcreteSubject) ) self.oclIsTypeOf(InterfaceRealization) implies ( self.contract.oclIsKindOf(Interface) and self.contract.oclIsTypeOf(Subject) and self.implementingClassifier.oclIsTypeOf(ConcreteSubject))
Metamodelo del Patrón de Diseño Observer a nivel PSM Eiffel
El Metamodelo del patrón Observer a nivel PSM Eiffel es una especialización del Metamodelo PSM EIFFEL
Metamodelo PSM Eiffel: EiffelClass
Metamodelo PSM Eiffel: Routine
Patrón Observer - Metamodelo PSM-Eiffel: Diagrama de Clases
Patrón de Diseño Observer Metamodelo PSM Eiffel : Restriciones AssocEndObserver [1]Este extremo de asociación tiene una multiplicidad cuyo rango será un subconjunto (posiblemente infinito) de los enteros no negativos. multiplicity.lower >= 0 and (self.multiplicity.upper > 0 or self.multiplicity.upper = #unlimited) [2]Deberá ser navegable. self.isNavigable( ) Operaciones Adicionales La rutina observadora isNavigable indica si este extremo de asociación es navegable. isNavigable = not class ->isEmpty()
Especificando Refinamientos en OCL: de PIM-UML a PSM-EIFFEL
Reglas de Transformación La especificación de los metamodelos en los tres niveles, permite construir la definición de transformación de modelo a modelo. Las reglas de transformación que constituyen una definición de transformación describen como puede transformarse un modelo en un lenguaje origen en un modelo en un lenguaje destino.
Reglas de transformación En el caso del patrón de diseño observer, las reglas usan los metamodelos definidos en los distintos niveles para definir las transformaciones. Transformación PIM-PSM: Metamodelo Origen: “UML especializado del patrón Observer” Metamodelo Destino: “UML especializado del patrón Observer en una plataforma específica”. Transformación PSM-ISM: Metamodelo Origen: “UML especializado del patrón Observer en una plataforma específica”. Metamodelo Destino: “UML especializado del patrón Observer en un lenguaje de programación específico”
Transformación de PIM-UML A PSM-EIFFEL Transformation PIM-UML TO PSM-EIFFEL { parameters sourceModel: Design Pattern Metamodel :: Package targetModel: Design Pattern Metamodel-EIFFEL :: Project pre: -- El paquete SourceModel no importa otros paquetes. sourceModel.importedElement isEmpty post: -- el número de clases del modelo target es igual al número de clases más el número de interfaces del modelo source. sourceModel.ownedMember select(oclIsTypeOf(Class)) size() + sourceModel.ownedElement select(oclIsTypeOf(Interface)) size()= targetModel.ownedElement select(oclIsTypeOf(EiffelClass)) size()
Transformación de PIM-UML A PSM-EIFFEL post: -- Para cada clase en sourceModel existe una clase Eiffel en targetModel tal que: sourceModel.ownedElement select(oclIsTypeOf(Class)) forAll ( sourceClass | targetModel.ownedElement select(oclIsTypeOf(EiffelClass)) exists ( targetClass | -- sourceClass y targetClass tienen el mismo nombre y sourceClass.name = targetClass.name and -- tienen el mismo conjunto de operaciones y sourceClass.member select (oclIsTypeOf(Operation)) = targetClass.member select (oclIsKindOf(Routine)) and -- tienen las mismas clases padres y las mismas clases hijas, …
Transformación de PIM-UML A PSM-EIFFEL post: -- Para cada interface en sourceModel existe una clase Eiffel en targetModel tal que: sourceModel.ownedElement select(oclIsTypeOf(Interface)) forAll ( sourceInterface /targetModel.ownedElement select(oclIsTypeOf(EiffelClass)) exists ( targetClass / -- sourceInterface y targetClass tienen el mismo nombre y sourceInterface.name = targetClass.name and -- tienen el mismo conjunto de operaciones y sourceInterface.member select (oclIsTypeOf(Operation)) = targetClass.member select (oclIsKindOf(Routine)) and -- tienen las mismas clases padres y las mismas clases hijas, . . . ) )
Metamodelo del Patrón de Diseño Observer a nivel PSM JAVA
Metamodelo PSM Java: JavaClass
Metamodelo PSM Java: JavaInterface
Metamodelo PSM Java: JavaOperation
Patrón Observer - Metamodelo Java: Diagrama de Clases
Patrón Observer – Metamodelo PSM-Java: Restricciones Metaclase Subject Un sujeto, instancia de la metaclase Subject puede ser una clase Java o una interfaz Java. (self.oclIsTypeOf(JavaClass) or self.oclIsTypeOf(JavaInterface)
Metamodelos de patrones de diseño: Ventajas Un metamodelo UML para un patrón de diseño permite detectar la presencia de un patrón en un modelo. La especificación de los metamodelos en los tres niveles, permite construir la definición de transformaciones de modelo a modelo, logrando una generación de código más completa.
Bibliografía Arnout, Karine (2004). “From Patterns to Components”. Ph. D. Thesis, Swiss Institute of Technology (ETH Zurich) http://se.inf.ethz.ch/people/arnout/publications/arnout_phd_thesis.pdf Gamma y Otros (1996). Gamma E., Richard H., Ralph J. y Vlissides J. “Design Patterns. Elements of reusable Object-Oriented Software”. Addisson-Wesley. MDA (2006). The Model Driven Architecture. www.omg.org/mda Meyer (1997). Meyer, Bertrand. “Object-Oriented Software Construction”. Prentice Hall PTR, 1997. OCL (2006). Object Constraint Language. Version 2.0. OMG Available Specification: formal/06-05-01. www.omg.org UML (2006). Unified Modeling Language: Superstructure. Version 2.0. OMG Specification: formal/05-07-04 www.omg.org