173
UNIVERSIDAD NACIONAL DE SAN LUIS FACULTAD DE CIENCIAS FÍSICO MATEMÁTICAS Y NATURALES Tesis para optar a la titulación de posgrado correspondiente a la Maestría en Ingeniería de Software Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL Lic. Alberto Alejandro Cortez Director: Dr. Daniel Riesco Co-Director: Mg. Ana Garis San Luis 2015

Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

UNIVERSIDAD NACIONAL DE SAN LUIS

FACULTAD DE CIENCIAS FÍSICO MATEMÁTICAS Y NATURALES

Tesis

para optar a la titulación de posgrado correspondiente a la

Maestría en Ingeniería de Software

Formalización de Patrones de Comportamiento

desde Perfiles UML y especificaciones OCL

Lic. Alberto Alejandro Cortez

Director: Dr. Daniel Riesco

Co-Director: Mg. Ana Garis

San Luis

2015

Page 2: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de
Page 3: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

Agradecimientos

"No se puede desatar un nudo sin saber cómo está hecho"

Aristóteles (384 AC-322 AC) Filósofo griego.

A todas las personas que me acompañaron en estos últimos años, alentándome

y enriqueciéndome con amor y sabiduría. Estoy infinitamente agradecido de que

Dios las pusiera en este camino.

Quiero dedicar esta tesis con profundo amor a mis hijos, Facundo y Gonzalo.

A todos mis amigos, que día a día compartieron este don de enseñar, a mi gran

amiga Claudia por toda su colaboración y constancia.

Agradezco a mi Director de Tesis, Daniel y su Codirectora Ana, que me

brindaron su dedicación, permanente asistencia y entrega total para poder

finalizar este proyecto.

A todos los profesores de la Maestría que me aportaron un gran conocimiento

para mi formación profesional.

Page 4: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

Índice General

CAPITULO I .................................................................................................................. 1

Introducción .................................................................................................................. 1

1.1 Descripción del problema ............................................................................... 3

1.2 Estado del arte ............................................................................................... 5

1.2.1 Trabajos relacionados ............................................................................. 6

1.3 La Propuesta ................................................................................................ 17

1.4 Motivación, hipótesis y objetivos, contribuciones y publicaciones ................. 18

1.4.1 Motivaciones.......................................................................................... 18

1.4.2 Hipótesis y objetivos .............................................................................. 18

1.4.3 Contribuciones ....................................................................................... 20

1.4.4 Publicaciones derivadas ........................................................................ 21

1.5 Estructura de la tesis .................................................................................... 22

CAPITULO II ............................................................................................................... 25

Modelado, Metamodelado en el contexto MDA. UML, Perfiles. OCL .......................... 25

2.1 El concepto de modelo en MDA .................................................................... 25

2.2 Lenguaje de modelado ................................................................................. 26

2.3 Arquitectura .................................................................................................. 27

2.4 Relación entre modelos y metamodelos ....................................................... 28

2.5 UML .............................................................................................................. 31

2.5.1 Introducción ........................................................................................... 31

2.5.2 Características ....................................................................................... 32

2.6 Perfiles ......................................................................................................... 34

2.7 OCL .............................................................................................................. 39

CAPITULO III .............................................................................................................. 43

Especificación de Patrones de Diseño ........................................................................ 43

3.1 Patrones de diseño ....................................................................................... 43

3.1.1 Concepto ............................................................................................... 43

3.1.2 Clasificación de Patrones de Diseño ..................................................... 44

3.2 Catálogo de patrones ................................................................................... 45

3.3 Características de los patrones de Comportamiento: .................................... 47

3.4 Una arquitectura para patrones de diseño basada en Perfiles UML ............. 49

3.4.1 Metodología ........................................................................................... 51

3.4.2 Técnica para definir el perfil de un patrón particular............................... 51

CAPITULO IV ............................................................................................................. 53

Perfil de Patrones Genérico ........................................................................................ 53

4.1 Conceptos Introductorios .............................................................................. 53

4.1.1 Elementos del metamodelo UML utilizados ........................................... 53

4.2 Descripción de elementos nivel 0 ................................................................. 56

4.2.1 Estereotipos .......................................................................................... 56

Page 5: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

4.2.2 Restricciones en lenguaje OCL ............................................................. 58

CAPITULO V .............................................................................................................. 65

Perfil de Comportamiento ........................................................................................... 65

5.1 Conceptos Introductorios .............................................................................. 66

5.1.1 Elementos del metamodelo UML utilizados ........................................... 66

5.2 Descripción de elementos nivel 1 ................................................................. 69

5.2.1 Estereotipos .......................................................................................... 69

5.2.2 Restricciones definidas en OCL ............................................................. 70

CAPITULO VI ............................................................................................................. 73

Perfil Patrones Particulares......................................................................................... 73

6.1 Patrón Observer ........................................................................................... 74

6.1.1 Descripción General .............................................................................. 74

6.1.2 Descripción de elementos nivel 2 – Patrón Observer ............................. 77

6.1.3 Restricciones definidas en OCL para Observer ..................................... 79

6.1.4 Aplicación de perfiles a un caso de estudio del Observer ...................... 88

6.1.5 Gestión del Framework .......................................................................... 91

6.2 Patrón Command.......................................................................................... 95

6.2.1 Descripción General .............................................................................. 95

6.2.2 Descripción de elementos nivel 2 – Patrón Command .......................... 97

6.2.3 Restricciones definidas en OCL para Command ................................... 98

6.2.4 Aplicación de perfiles a un caso de estudio del Command .................. 104

6.2.5 Gestión del Framework ........................................................................ 106

6.3 Patrón Memento ......................................................................................... 110

6.3.1 Descripción General ............................................................................ 110

6.3.2 Descripción de elementos nivel 2 - Patrón Memento ........................... 113

6.3.3 Restricciones definidas en OCL para Memento ................................... 114

6.3.4 Aplicación de perfiles a un caso de estudio del Memento .................... 118

6.3.5 Gestión del Framework ........................................................................ 120

CAPITULO VII .......................................................................................................... 123

Conclusiones y Trabajos Futuros .............................................................................. 123

7.1 Conclusiones .............................................................................................. 123

7.2 Trabajos futuros .......................................................................................... 125

Bibliografía ................................................................................................................ 127

Apéndice A ............................................................................................................... 133

Especificaciones OMG .......................................................................................... 133

Apéndice B ............................................................................................................... 147

OCL ...................................................................................................................... 147

Apéndice C ............................................................................................................... 157

Métodos y atributos del metamodelo UML utilizados ............................................ 157

Apéndice D ............................................................................................................... 161

Uso de perfiles en Rational Software de IBM ......................................................... 161

Page 6: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

Índice de tablas

Tabla 2-1 : Notación gráfica de vínculos. ............................................................................. 38

Tabla 2-2 : Notación gráfica de estereotipos, metaclases y perfiles. ............................... 38

Tabla 3-1: Clasificación de los patrones de diseño. ........................................................... 44

Tabla 6-1: Orden general Observer. ...................................................................................... 85

Tabla 6-2: Orden general Command. .................................................................................. 103

Tabla 6-3: Orden general Memento. ................................................................................... 116

Tabla A-1: Multiplicidad de una asociación. ....................................................................... 138

Tabla B-1: Tipos OCL Bàsicos y sus valores. .................................................................... 152

Tabla B-2: Ejemplos de operaciones matemáticas en los tipos predefinidos. .............. 152

Tabla B-3: Ejemplos de operaciones de cadena en los tipos predefinidos................... 152

Page 7: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

Índice de figuras

Figura 2.1: Capas de arquitectura MDA. .............................................................................. 28

Figura 2.2: Ejemplo aplicando niveles MDA. ....................................................................... 29

Figura 2.3: Perfil: Sintaxis abstracta. ..................................................................................... 35

Figura 2.4: Ejemplo Perfil EJB. .............................................................................................. 39

Figura 3.1: Arquitectura de patrones de diseño. ................................................................. 50

Figura 4.1: Fragmento del metamodelo UML: características estructurales. ................ 54

Figura 4.2: Fragmento del metamodelo UML: Interfaces. ................................................ 55

Figura 4.3: Metaclase Class. .................................................................................................. 56

Figura 4.4: Estereotipos para modelos estáticos. ............................................................... 56

Figura 5.1: Fragmento del metamodelo - Características dinámicas............................... 66

Figura 5.2: Fragmento del metamodelo de UML - Líneas de vida. .................................. 67

Figura 5.3: Fragmento del metamodelo de UML - Mensajes. ........................................... 68

Figura 5.4: Estereotipos de comportamiento de un modelo. ............................................. 69

Figura 6.1: Diagrama de clases Patrón Observer. .............................................................. 74

Figura 6.2: Diagrama de secuencia Patrón Observer. ....................................................... 76

Figura 6.3: Características estructurales y dinámicas del Patrón Observer. .................. 78

Figura 6.4: Diagrama de clases ejemplo Biblioteca. ........................................................... 89

Figura 6.5: Diagrama de secuencia ejemplo Biblioteca. .................................................... 90

Figura 6.6: Diagrama de clases ejemplo Biblioteca mal formado..................................... 92

Figura 6.7: Diagrama de secuencia ejemplo Biblioteca mal formado. ............................. 92

Figura 6.8: Errores producidos por verificación de Observer. ........................................... 93

Figura 6.9: Diagrama de clases Patrón Command. ............................................................ 95

Figura 6.10: Diagrama de secuencia Patrón Command. ................................................... 96

Figura 6.11: Características estructurales y dinámicas del Patrón Command. .............. 97

Figura 6.12: Diagrama de clases ejemplo Servidores . .................................................... 105

Figura 6.13: Diagrama de secuencia ejemplo Servidores . ............................................. 106

Figura 6.14: Diagrama de clases ejemplo Servidores mal formado. ............................. 107

Figura 6.15: Diagrama de secuencia ejemplo Servidores mal formado. ....................... 108

Figura 6.16: Errores producidos por verificación de Command ...................................... 109

Figura 6.17: Diagrama de clases Patrón Memento. ......................................................... 110

Figura 6.18: Diagrama de secuencia Patron Memento. ................................................... 112

Figura 6.19: Características estructurales y dinámicas del Patrón Memento. .............. 113

Figura 6.20: Diagrama de clases ejemplo Memoria. ........................................................ 118

Figura 6.21: Diagrama de secuencia del ejemplo Memoria. ........................................... 119

Figura 6.22: Diagrama de clases ejemplo Memoria mal formado. ................................. 120

Figura 6.23: Diagrama de secuencia ejemplo Memoria mal formado. .......................... 121

Figura 6.24: Mensajes de Error de mala formación Memento. ....................................... 121

Figura A.1: Diagrama de clases del paquete Kernel. ...................................................... 134

Figura A.2: Notación gráfica de una clase. ........................................................................ 136

Figura A.3: Ejemplo de clases. ............................................................................................. 136

Page 8: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

Figura A.4: Notación gráfica de paquete. ........................................................................... 136

Figura A.5: Paquete con clases. .......................................................................................... 137

Figura A.6: Citar clase de otro paquete. ............................................................................. 137

Figura A.7: Ejemplo gráfico de herencia. ............................................................................ 137

Figura A.8: Ejemplo de asociación bidireccional. .............................................................. 138

Figura A.9: Ejemplo de asociación unidireccional. ............................................................ 138

Figura A.10: Ejemplos de multiplicidad de una asociación. ............................................. 138

Figura A.11: Ejemplo gráfico de una interfaz. .................................................................... 139

Figura A.12: Ejemplo gráfico implementación de una interfaz. ....................................... 139

Figura A.13: Elementos del diagrama de Interacción/Secuencia. .................................. 140

Figura A.14: Ejemplo de fragmento combinado con operador LOOP. .......................... 141

Figura A.15: Diagrama de estados. ..................................................................................... 142

Figura B.1: Ejemplo Diagrama de Clase ............................................................................ 147

Figura B.2: Uso de operador ocl AsType()….………………………………………………………………….155

Figura D.1: Creación de proyecto de Perfiles….……………………………………………………………..161

Figura D.2: Proyecto de Perfil UML…………….……………………………………….............................162

Figura D.3: Extensión de Perfiles…………………..…………………………………................................162

Figura D.4: Paleta de elementos gráficos………….………………………………………......................162

Figura D.5: Elementos del metamodelo UML…….……………………………………….………............163

Figura D.6: Ejemplo de Perfil…………………………….………………………........................................163

Figura D.7: Liberación de Perfil ……………………….……………………………...................................163

Figura D.8: Aplicación de Perfiles ……………….……………………………………...............................164

Figura D.9: Perfil Importado ……………………….…………………………….........................................165

Figura D.10: Perfil Nivel 0 aplicado al ejemplo ………….…………………………………………..........165

Page 9: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

1

CAPITULO I

Introducción

En esta introducción se presenta una reseña del problema y una evaluación del estado

del arte, con un relato de los distintos trabajos realizados a través del tiempo. También

se exponen las razones de su realización, los objetivos, la contribución y las

publicaciones derivadas de la tesis. Por último se explica la estructura del trabajo.

Los patrones de diseño aportan la experiencia de diseñadores expertos, ayudando a

los desarrolladores de software en la documentación y transferencia de conocimientos,

proporcionándoles un vocabulario común. Uno de los catálogos más conocidos acerca

de los patrones de diseño es presentado por el Gamma et. al [1] .

Presentan 23 patrones de diseño siguiendo dos criterios principales: alcance y

finalidad. El primero se refiere a que si el patrón se aplica principalmente a las clases o

a los objetos; y el segundo establece una clasificación que los divide en creacional

(que crean los objetos), estructural (que componen las estructuras) y comportamiento

(que representan la interacción entre los objetos).

La semántica no está definida con precisión. Debido a esta problemática, se han

propuesto diferentes enfoques con el fin de formalizarlos y, por lo tanto, de mejorar su

uso, aplicación y validación.

Un enfoque plantea el uso de complejos formalismos matemáticos o lógicos que no

son fáciles de entender por un diseñador inexperto en esta metodología como lo

presenta Taibi [2].

Otro enfoque más general es el uso de perfiles UML especificado [3]. Un perfil UML es

un mecanismo para extender la sintaxis y la semántica de dicho lenguaje para una

plataforma o dominio particular. UML es uno de los lenguajes de modelado más

Page 10: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

2

populares utilizados en el proceso de desarrollo de software para especificar y

documentar como enuncian Booch et. al [4]. Es un lenguaje no formal, por lo tanto los

modelos son anotados con el lenguaje de lógica de primer orden OCL (por sus siglas

en inglés, Object Constraint Language), con el fin de otorgar su formalidad y precisión

denotado en la especificación [5]. Utilizando dicho mecanismo de extensión para

generar perfiles se puede establecer un vocabulario específico para el dominio de

patrones de diseño. El perfil UML incluye los elementos necesarios para hacer posible

la extensión del lenguaje. Ellos son: los estereotipos (en inglés, stereotypes), los

valores etiquetados (en inglés, tags values) y las restricciones (en inglés, constraints).

La presente tesis sigue este último enfoque de investigación. Se construye una

arquitectura de tres niveles, para aplicar los estereotipos en ella. Posteriormente se

establecen especificaciones para proporcionar la verificación de los patrones de

diseño de comportamiento en modelos UML estáticos y dinámicos, logrando de este

modo proveer a los diseñadores de software un marco de verificación formal, para su

posterior uso. La misma se elabora a través de la herramienta de modelado RSA (por

sus siglas en inglés, Rational Software Architect) [6]. La propuesta del presente trabajo

es la Formalización de Patrones de Comportamiento desde Perfiles UML y

especificaciones OCL.

A través del estudio del metamodelo de UML especificado [7], se pueden descubrir las

relaciones existentes entre las características estructurales y dinámicas de los

patrones de diseño de comportamiento. Permitiendo inducir que se pueden establecer

restricciones que eliminen incoherencias entre los modelos estáticos, representados

por clases y los modelos dinámicos representados por diagramas de secuencia.

Este aporte permite la verificación de consistencias entre diagramas y la relación de

los diferentes elementos del patrón relacionados entre sí; para poder verificar y

establecer restricciones formales, es necesario crear estereotipos que definan los

elementos de cada patrón en los diagramas antes mencionados. De este modo se

garantiza que debe existir consistencia entre los diagramas de clases y el diagrama de

secuencia, o sea entre lo estructural y el comportamiento.

Page 11: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

3

1.1 Descripción del problema

Los Patrones de Diseño facilitan a los desarrolladores de software a resolver

problemas de diseño orientado a objetos que repetidamente ocurren. Proveen un

medio para comunicarse a través de un alto nivel de abstracción y permiten

incrementar el vocabulario de diseño.

Los patrones de diseño son una técnica para documentar soluciones a problemas de

diseño recurrentes y para compartir experiencia en diseño independientemente del tipo

de aplicación expresadas por Coad [8], Berczuk [9] y Gamma et al. [1].

Ellos son presentados comúnmente en forma Alexandrina, propuesta por C. Alexander

[10], en la cual los principios de diseño son explicados primeros en inglés informal. Y

luego clarificados con diagramas ilustrativos y ejemplo de código específico planteada

por Gamma et al. [1]. Este formato no es suficientemente informativo para que los

diseñadores comprendan los principios de diseño y aprendan cómo aplicar patrones

para resolver sus propios problemas. Sin embargo como han señalado Eden y

Hirshfeld [11] el formato Alexandrina es muy informal por lo tanto trae tanta

ambigüedad que a menudo es materia de disputa si una implementación conforma un

patrón o no. Actualmente es ampliamente reconocido que una pobre presentación de

patrones puede llevar a un sistema hacia una pobre calidad como lo explica Fayad et.

al [12].

También puede impedir su mantenimiento y evolución, de acuerdo a estudios

experimentales según Khomh y Guéhéneuc [13]. Estos autores sugieren que los

patrones deberían ser usados con precaución ya que pueden impactar negativamente.

Por ejemplo el patrón Observer no hace un sistema más modular, pero mejora la

modularidad de otros patrones. Permite, la separación entre el modelo, la vista y

controlador en el patrón MVC.

El uso de este patrón hace un sistema más flexible: mediante la eliminación de las

dependencias entre módulos, el patrón Observer hace que sea posible sustituir estos

módulos sin problemas. También es fácil de extender funcionalidades mediante la

adición de una o más entidades que cooperan con una existente. Este modelo respeta

el principio de Abierto Cerrado. Por lo tanto, se puede esperar que impacte de manera

positiva en la reutilización, la capacidad de expansión, y sencillez, pero que impacte

Page 12: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

4

negativamente en la facilidad de aprendizaje y comprensión debido a la complejidad

de la estructura y el acoplamiento implícito, lo que hace que sea difícil para el

mantenimiento e identificar en un primer momento las relaciones entre las clases. El

patrón Observador debilita la encapsulación y disminuye robustez porque el

acoplamiento implícito lleva a una difícil corrección de errores.

El uso extensivo en la industria del software de los mismos, obliga la necesidad de

crear metodologías para especificarlos, visualizarlos y documentarlos como así

también herramientas para integrarlos y manejarlos.

Otra debilidad de la forma Alexandrina es que presenta conocimiento en una forma no

estructurada. Cada patrón es descripto separadamente, con su relación con otros

patrones sintéticamente explicada. Pero comprender patrones individuales en

aislamiento no es suficiente. Según Winn y Calder ellos necesitan ser catalogados [14]

y combinados para solucionar problemas del mundo real. La especificación formal

puede no sólo remover ambigüedad, como se discutió en la sección previa, sino

también establecer una base sólida para el razonamiento a cerca de sus propiedades

y sus relaciones.

Actualmente, la mayoría de los patrones se describen utilizando una combinación de

las descripciones textuales, notaciones gráficas como UML, y fragmentos de código de

ejemplo. La intención es que sean fáciles de leer, usar, y elaborar un vocabulario

común de patrones. Sin embargo, las descripciones no formales dan lugar a la

ambigüedad, y limitan el apoyo de herramientas y su uso correcto.

Las notaciones matemáticas pueden ayudar a eliminar esta ambigüedad, clarificando

las nociones mencionadas. Por lo que no es sorpresivo que en los últimos años se

halla investigado con interés sobre la especificación formal de los patrones de diseño,

pero el potencial completo de la especificación formal de patrones no ha sido

alcanzado aún.

Uno de los aspectos relevantes encontrados en los patrones de diseño, es que la

semántica no está definida con precisión. Debido a esta problemática, se han

propuesto diferentes enfoques con el fin de formalizarlos para mejorar su uso,

aplicación y validación.

Page 13: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

5

Existen numerosos enfoques formales y otros menos formales de investigaciones

orientadas a documentar y especificar patrones de diseño. La corriente de

investigadores que utilizan métodos formales establece una precisa y adecuada forma

de especificar y documentar los patrones.

El uso generalizado de los patrones a través del lenguaje UML permite otra forma de

visualizarlos, y es importante destacar que los mismos son normalmente mostrados a

través de lenguajes gráficos.

La ventaja de que UML es un lenguaje gráfico, estandarizado e integrado a todos los

equipos de desarrollo permite describir a los patrones en una forma sencilla y

amigable.

Debido a que es un lenguaje de propósito general, en ocasiones no es útil para

instancias de soluciones particulares ya que no es lo suficientemente expresivo.

Razón por la cual es inexorable utilizar el mecanismo de extensión que aporta UML

para extender su semántica y sintaxis a través de los perfiles para modelar situaciones

de diseño específicas.

El presente trabajo se centra en esta característica para establecer un catálogo de

patrones de diseño, formalizando su estructura a través del uso de OCL.

1.2 Estado del arte

A lo largo del tiempo se han estudiado los patrones con diversos fines como por

ejemplo proporcionar catálogos de elementos reusables en el diseño de sistemas de

software o evitar la reiteración en la búsqueda de soluciones a problemas ya

conocidos y solucionados anteriormente. Otro de los propósitos es implementarlos en

el desarrollo de software.

Los patrones pueden describirse a través de especificaciones formales y otras menos

formales.

La primera de ella es el camino más adecuado para desarrollar el planteo de una

notación precisa, sin embargo es sofisticada y difícil de entender. Necesita un

conocimiento exhaustivo como base matemática y lógica, razón por lo cual son menos

elegibles por los diseñadores de software.

Page 14: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

6

La segunda propuesta es menos formal, fácil de entender y usar, ya que generalmente

tiene una notación gráfica/textual, otorgando esta simpleza de uso, imprecisión y

ambigüedad al diseño de modelos.

Algunas investigaciones recientes han adaptado notaciones de modelado existentes y

técnicas de especificación formal, mientras otras han desarrollado nuevos lenguajes

específicos para el propósito.

A continuación se describen algunos de los desarrollos encontrados en el área

utilizando las especificaciones formales, según sus diferentes clasificaciones y los

distintos aspectos que distinguen.

1.2.1 Trabajos relacionados

En esta sección se divide los trabajos existentes en el área según dos categorías, el

enfoque de modelado y metamodelado.

Los primeros especifican patrones de diseño como un modelo de sistemas de

software, por ejemplo, como un conjunto de características dentro de su estructura de

código de programa y/o comportamientos de ejecución.

El segundo enfoque especifica patrones de diseño como metamodelos, por ejemplo

como un conjunto de características de modelos en sí mismos.

Enfoque de Modelado:

Este fue el primero de ser explorado y aún puede ser visto dentro de GOF, donde cada

patrón de diseño es ilustrado con un diagrama de clase [4]. Pero incluso cuando está

acompañado por un diagrama de secuencia, un diagrama de clases no es suficiente

para capturar toda la información trasmitida por un patrón de diseño. Así muchos

investigadores propusieron extensiones al modelado orientado a objetos.

Por ejemplo, existen algunas propuestas que han estudiado el uso de UML para

documentar y definir patrones. Lauder y Kent [15] aplican una notación de modelado

visual, sin recurrir a simbolismos matemáticos. Representan patrones con UML y

“Diagramas de Restricciones” (en inglés, Constraints Diagrams). Segregan la

especificación de patrones dentro de tres modelos. Un modelo abstracto, llamado

“modelo de rol”, determina el espíritu esencial del patrón. El “modelo de tipos” refina el

modelo anterior, incorporando restricciones específicas del dominio. El “modelo de

Page 15: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

7

clase” forma un despliegue concreto para refinar el modelo de tipo. Por otro lado

separan la especificación de patrones dentro de tres modelos. Así se obtienen

diferentes representaciones de patrones de acuerdo a su grado de generalidad pero

no utilizaron la capacidad de los perfiles de UML ni la elaboración de restricciones de

OCL.

Un aporte interesante es la representación visual de los patrones de diseño. Porras y

Guéhéneuc [16] evaluaron la eficiencia de la representación para visualizar patrones

de diseño en diagramas UML. Como resultado del trabajo proveyeron un framework

para comparar actuales y futuras notaciones. Expusieron luego de su análisis que era

mejor utilizar estereotipos con diagramas de clases UML para identificar composición y

rol de los elementos de un patrón frente al uso de anotaciones de colaboración de

UML. Y también llegaron a la conclusión de que las herramientas deberían incluir

además de UML otras notaciones para diferentes tareas. En esta publicación se

analiza solo la eficiencia de la representación para visualizar patrones pero no se

construye especificaciones.

Lano et al. [17] también se enfoca a nivel de código y trata los patrones como

transformaciones desde soluciones defectuosas a soluciones mejoradas.

Le Guennec et al. [18], modificaron el metamodelo de UML 1.3 para facilitar el

modelado de patrones de diseño y representar sus ocurrencias en el mismo. La

propuesta es representar la “esencia” de los patrones de diseño en el metanivel con

conjuntos de restricciones. Se usan colaboraciones en cada meta-nivel, y restricciones

OCL en forma conjunta para especificar las restricciones estructurales del patrón. Se

introduce un conjunto de modificaciones al metamodelo. En el presente trabajo se usa

también el lenguaje UML pero la versión 2.5, la cual sigue manteniendo la

incorporación de perfiles y de esta manera no se necesita modificar el metamodelo.

Mak et al. [19] definen la notación de colaboraciones extendiendo UML 1.5 para

acciones semánticas.

Otros trabajos han estudiado el uso de perfiles de UML para definir y documentar

patrones.

Zdun y Avgeriou [20] identificaron primitivas arquitectónicas que ocurren en patrones.

Utilizan perfiles UML para expresar las primitivas arquitectónicas. Las mismas ofrecen

Page 16: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

8

abstracciones de modelados reusables que pueden ser usados para modelar

soluciones sistemáticas que son encontradas repetitivamente en diferentes patrones.

La principal contribución radica en modelar variantes de los patrones usando

primitivas, identificar aspectos de patrones que son difíciles de expresar utilizando el

recurso antes mencionado. Determinando un esquema generalizado que usa un

vocabulario de componentes y conectores específicos de patrones, utilizando OCL

para formalizar la extensión.

Dong y Yang [21] aportan una solución al desarrollo de software donde se combinan

múltiples patrones, los elementos participantes pueden intervenir en diferentes

patrones. Esto complica al diseñador en la visualización del modelo de dominio.

Presentan un perfil UML para mejorar la visualización de los patrones en diagramas

UML. De esta forma es posible representar, en el diagrama, el rol de los elementos en

un patrón de diseño. También utilizan un esquema de colores para representar

visualmente los diagramas de clases y de colaboración. En este estudio se investiga

solo la representación gráfica de los patrones a través de un perfil, pero tiene un débil

conjunto de especificaciones de restricciones OCL.

Keen Ngee Loo et al. [22], proponen un método para definir y visualizar los roles de un

patrón y sus variantes de interacción extendiendo el diagrama de secuencia UML a

través de perfiles de UML. En un diagrama normal de secuencia de UML, el fragmento

de interacción no tiene información de contexto del patrón. Así la extensión debe

mantener la información de contexto después de que el patrón está adaptado a una

aplicación diseño. Por otra parte, debe vincular los roles de los fragmentos que existen

en las descripciones de texto del patrón a sus correspondiente a roles en un modelo.

Los autores deben trabajar en la elaboración de restricciones OCL para formalizar el

perfil.

Garis A. et al. [23] establecen las ventajas de utilizar los perfiles para definir,

documentar y visualizar patrones de diseño. Formulan una estructura para la definición

de patrones dada por los perfiles UML. Sin embargo, no es posible definir la semántica

para todos los patrones en un sólo perfil. Se ha definido un perfil para cada patrón y se

ha descripto la semántica de cada uno en forma particular. La imposición de una

jerarquía entre niveles de perfiles permite el reúso de definiciones.

Page 17: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

9

Se propone una arquitectura de 4 capas. En el nivel inferior se plantea el “Perfil de

Paquete” del estándar declarado por la OMG, le sigue el “Perfil del Framework de

Patrones de Diseño”, continua en el orden el “Perfil de Clasificación de Patrones” los

patrones están clasificados en creacionales, de objetos y de comportamiento y por

último en la capa superior se establecen los “Perfiles Particulares” de cada patrón. De

este modo la incorporación de un nuevo patrón en el nivel superior deberá adquirir las

mismas características genéricas de los niveles inferiores pero se deberá especificar

las características propias del mismo. La presente tesis adopta el camino formulado

por estos autores, contribuyendo en la definición de especificaciones para los patrones

de diseño de comportamiento.

Las técnicas de especificación de métodos formales han sido aplicadas por Mikkonen

[24], quien formaliza los comportamientos temporales de software en acciones de

lógica temporal.

Taibi describe en [2] el lenguaje BPSL (en inglés, Balanced Pattern Specification

Language) que incorpora la especificación formal de aspectos estructurales y de

comportamiento de los patrones. Los aspectos estructurales son formulados en lógica

de primer orden, y los aspectos dinámicos en lógica temporal. En el marco de este

trabajo fue desarrollada una herramienta para transformar las especificaciones al

lenguaje Java a partir de instancias de patrones. También investigó cómo la

composición de patrones puede ser definida en un framework.

Algunos autores han trabajado en el desarrollo de herramientas para reconocer

patrones mediante el análisis del código fuente. Los ejemplos incluyen:

FUJABA propuesto por Niere et al. [25], HEDGEHOG establecido por Blewitt et al. [26]

y finalmente PINOT por Nija Shi y Olsson [27]. Dong et al. [28] plantean una

comparación exhaustiva de las herramientas que permiten el reconocimiento de

patrones para una revisión y estudio.

Estas herramientas a menudo usan una representación intermedia de características

estructurales y de comportamientos de programa. La más común de estas

representaciones incluye programación lógica (Kramer y Prechelt [29]); y predicados

de lógica de primer orden (Beyer et al. [30]).

Page 18: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

10

Todas ellas pueden ser consideradas como especificaciones de patrones a nivel del

modelo. Ellas se consideran como herramienta de diseño con extracción del código

fuente. Pero el nivel de abstracción es demasiado bajo y las especificaciones

necesariamente están abrumadas con detalles relativos a usos específicos de

lenguajes de programación. Esto hace difícil alcanzar alta precisión y reutilización en el

reconocimiento de patrones (Dong et al. [28]). Algunas propiedades de

comportamiento no pueden ser extraídas desde el código fuente porque no se pueden

determinar.

Un problema adicional es que “Los lenguajes de especificación formales, no están

moldeados para expresar detalles de implementación”, como cita Eden et al [31]. Ellos

describen las características externas sin especificar los detalles de implementación

de todo, pero un patrón de diseño es acerca de una solución orientada a la

implementación para un tipo de problema.

Los lenguajes de modelado gráfico como UML no son suficientemente expresivos. En

UML, las descripciones de diseño de GOF han sido trasmitidas simplemente en notas

informales, sólo usando diagramas como ilustración. Esto se debe a que en ausencia

de formalización no se han incluido en el lenguaje.

Finalmente herramientas como PINOT (Nija Shi y Olsson [27]) son deseables. Las

herramientas a nivel de diseño minimizan errores en la etapa de temprana de diseño,

aportando un gran valor. En tal caso los patrones de diseño deben ser especificados

en características estructurales y de comportamiento de modelo de diseño más que en

el código fuente. Esto motivó al segundo enfoque.

Enfoque de Metamodelado

La aproximación de LEPUS, avanzado por Eden [11] y [32]; incluye las facilidades de

ambos enfoques en el mismo lenguaje (modelado y metamodelado). Para soportar

modelado LEPUS ha creado entidades de diseño orientado a objetos tales como

clases, atributos y métodos. Conectados por relaciones tales como herencia,

invocación y creación. Para soportar el metamodelado LEPUS, las entidades y otros

elementos reflejan los bloques comunes de construcción dentro de los patrones de

diseño GOF. Ejemplos de éstos son los llamados clan, tribu, jerarquía y biyección, y

sus semánticas son definidas en lógica de predicados de primer orden.

Page 19: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

11

Las relaciones entre los patrones pueden ser descriptas como lógica de relaciones.

(Eden and Hirshfeld [11]).

Un último avance se presentó las notaciones visuales y el lenguaje de lógica de primer

orden, en una definición formal (Eden et al. [33]) y referido como LEPUS3 y CLASS-Z

respectivamente. Una herramienta ha sido implementada para extraer información

desde programas JAVA y representarlos en forma de diagramas LEPUS3. Ello puede

entonces decidir y probar automáticamente si un programa satisface o no las

especificaciones en LEPUS3 (Gasparis et al. [34]). Sin embargo, LEPUS cubre sólo

las características estructurales estáticas de diseño ignorando las características de

comportamiento.

Otro trabajo en esta categoría (Lenguaje visual) es el Design Pattern Modeling

Language (DPML) de Maplesden et al. [35, 36]. En este lenguaje, las soluciones de

patrones de diseño son modeladas como una colección de participantes,

representando características estructurales tales como clases y métodos, adicionando

restricciones asociadas y dimensiones. Las restricciones pueden relacionar un simple

objeto representando un participante, en cuyo caso ellos son escritos como

anotaciones de lenguaje natural dentro de llaves, o dos objetos, en cuyo caso, ellos

son relaciones binarias dibujadas como líneas con flechas entre los dos participantes.

Son relaciones predefinidas y los ejemplos incluyen implements, extends, realizes,

declared in, define in, y refer to. Las dimensiones especifican el conjunto de objetos

que interpretan un rol y las claves de dimensión pueden ser usadas para especificar

que dos o más participantes tienen la misma dimensión, por ejemplo el número de

instancias de errores. Cuando las relaciones binarias son aplicadas a participantes

asociados con dimensiones, ellos pueden ser mapeados a una relación total, regular,

completa o incompleta, entre los conjunto de objetos. Las facilidades para modelados

son mantenidas más separadas que estas para metamodelado que en el caso de

LEPUS.

DPML también define un conjunto de notaciones visuales para especificar los modelos

de instancia de patrones. Una herramienta llamada DPTOOL, reportada en

(Maplesden et al. [36]), soporta ambas especificación de patrón y el chequeo de la

conformidad del patrón respecto al modelo de UML.

Page 20: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

12

DPML tiene algunas deficiencias que afectan a su expresividad y precisión. Para

comenzar, las restricciones sobre los participantes son informales y de nuevo, sólo

características estructurales de patrones de diseño pueden ser especificadas.

También, algunos usos importantes no son dirigidos y de este modo mantienen

problemas abiertos. Esto incluye cómo razonar a cerca de patrones, cómo

componerlos, y cómo especificar variantes sin tener que usar un diagrama separado

DPML para cada uno. LEPUS Y DPML ambos mezclan modelado y metamodelado en

el mismo lenguaje.

El Role-Based Meta-modeling Language (RBML) propuesto por France et al. [37],

tomó un enfoque estricto de metamodelado. RBML extiende UML para metamodelado

en una notación como UML. Un patrón es visto como un metamodelo, así que cada

instancia del patrón es un modelo en UML. Los participantes de un patrón y las

relaciones entre ellos son representados en una notación gráfica como roles. Además

las restricciones son representadas en OCL, y las semánticas de métodos y atributos

pueden ser definidas como plantillas OCL, instanciadas para cada patrón. Un

metamodelo RBML puede ser traducido en un metamodelo UML en forma de un

diagrama de clases UML. También podemos determinar si un modelo UML conforma a

un patrón de diseño especificado por un metamodelo RBML. La expresividad de RBML

ha sido demostrada definiendo metamodelos de diagramas de clases, diagramas de

secuencia y diagrama de máquinas de estado, para el patrón de diseño Iterator como

lo hace Kim [38].

Basados en las especificaciones RBML como estas Kim y Lu [39] proponen un

enfoque de programación lógica para identificar patrones en diagrama de clases UML.

El mismo, un modelo UML es un conjunto de hechos Prolog y un patrón es una

consulta Prolog. Ellos ilustraron el enfoque con el patrón Visitor, pero sin los detalles

de cómo traducir un diseño UML en programas Prolog, tampoco como traducir una

especificación de patrones RBML en una consulta Prolog. Más recientemente Kim y

Shen [40] desarrollaron un algoritmo para chequear si un modelo UML conforma a un

patrón especificado en RBML. Ellos implementaron como una herramienta llamada

RBMLCC, como un componente instalable en IBM RATIONAL ROSE [41]. También

reportaron un caso de estudio donde 7 de los patrones GOF son especificados por

Kim y Shen [42]. Sin embargo la herramienta no soporta completamente RBML aún.

En particular, restricciones OCL y las plantillas son omitidas.

Page 21: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

13

Otra herramienta en esta categoría, es el Pattern Description Language (PDL)

descripta por Albin-Amiot et al. [43].Los diagramas de PDL no son ni modelos ni

metamodelos. PDL es definido por un metamodelo extendido de UML y nuevamente,

los patrones de diseño son especificados en una notación gráfica. Un diagrama que

conforma a este metamodelo extendido se llama un modelo abstracto y debe ser

instanciado a un modelo concreto como una instancia del patrón. Sin embargo, esta

instanciación no es simplemente la relación de conformidad de modelo a metamodelo

vista en la arquitectura de cuatro capas de la OMG.

Por esta razón, Elaasar et al. [44] propone el Pattern Modeling Framework. Extiende el

MOF (por sus siglas en inglés, Meta Object Facility) y definen un lenguaje de

metamodelado llamado Epattern, con el cual es posible especificar patrones en

cualquier lenguaje de modelado compatible con MOF, en la capa M2 y M3 de la

arquitectura de metamodelado de cuatro capas de la OMG, y tomar las ventajas de las

herramientas de metamodelado existentes.

Cada patrón es un subconjunto de modelos de diseño con ciertas características

estructurales y de comportamiento, razón por lo cual la especificación formal de

patrones es un problema de metamodelado. Zhu y Shan [45] comienzan definiendo el

dominio de todo los modelos en una sintaxis abstracta para modelar lenguajes escritos

en una meta anotación Graphic Extension of BNF (por sus siglas en inglés, GEBNF).

Entonces para cada patrón de diseño definen predicados de primer orden a

restricciones de modelos tal que cada modelo satisface el predicado como una

instancia del patrón. Dicho predicado es escrito en lenguaje de primer orden inducido

desde la definición de la sintaxis abstracta del lenguaje gráfico de modelado. De esta

forma un GEBNF es un plus a los predicados de primer orden. Aprovechando esta

notación para definir modelos de dominio para las clases y diagramas de secuencia de

UML. Como en el caso de la definición BNF de la sintaxis de un lenguaje de

programación, una definición GEBNF de la sintaxis de un lenguaje de modelado es un

conjunto de reglas de sintaxis que definen símbolos no terminales basados en

símbolos terminales.

Las extensiones que GEBNF aporta a BNF son dos. La primera es la denominación de

campo, lo que permite un conjunto de símbolos de función que se deduce de una

definición de sintaxis para formar una firma de un lenguaje de la lógica de predicados

de primer orden. El segundo es la facilidad para ocurrencias referenciales de símbolos

Page 22: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

14

no terminales, por lo que las estructuras bidimensionales como gráficos pueden ser

definidos.

Otro camino planteado por Elaasar et al. [46] que describen una aproximación

genérica para especificar dominios específicos de patrones de diseño para DSML

basados en MOF a nivel de metamodelo y automáticamente detectar sus ocurrencias

en modelos. La aproximación está basada en QVT (Query/View/Transformation). Los

patrones son especificados declarativamente con transformaciones de QVT-Relations

[47] desde modelos DSML [48] donde los elementos que juegan roles de patrones son

identificados, para un modelo recientemente definido como DSML, para reportar

ocurrencias identificadas.

Se genera una herramienta en eclipse GMF(por su siglas en inglés de Graphical

Modeling Framework) [49], que permite implementar un lenguaje visual llamado Visual

Modeling Language (VPML). Con esta herramienta se permite especificar un patrón

básico y a partir de él proponer variantes. Se usa Medini QVT [50] para ejecutar

transformaciones que detecten los patrones, basándose en modelos EMF (por su

siglas en inglés de Eclipse Modeling Framework) [51] los resultados de esta

transformación se puede visualizar en la herramienta creada.

Lano et al. [52] describieron 24 especificaciones de transformaciones de modelos,

patrones de diseño y 5 patrones de arquitectura de transformación de modelos. Se

identificaron aquellos patrones de transformación que pueden ser considerados como

meta transformaciones, en el que la aplicación de un patrón a una transformación la

reestructura, para mejorar algunas características de calidad tales como modularidad o

eficiencia.

Una forma natural de implementar la aplicación de patrones de transformación de

modelos, es mediante la formalización de transformaciones de alto orden, donde éstos

son provistos por una herramienta o lenguaje de transformación. Este trabajo se

enfocó en patrones para refinamiento, abstracción, migración y transformaciones de

refactoring. Además el trabajo se necesita en otras áreas para identificar patrones,

tales como comparación de modelos, mezclando y transformando bidireccionalmente.

Más allá del desarrollo del framework de medición también podría ser usado para

proveer identificación automatizada de especificación y fallas de diseño en

transformaciones.

Page 23: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

15

El enfoque planteado por los distintos autores desde la clasificación de modelos

presenta estas consideraciones:

De las propuestas mostradas hasta aquí se observa que tanto Lauder y Kent [15], Le

Guennec et al. [18] y Mak et al. [19] definen una sintaxis especial para representar

patrones, sin utilizar perfiles UML. Lauder y Kent representan patrones con UML y

“Diagramas de Restricciones”, aplicando una notación de modelado visual. Le

Guennec y Mak extienden a través de la modificación del metamodelo de UML, sin

utilizar las prestaciones propuestas a partir de la versión UML 2.0.

Sin embargo, si se desea definir una sintaxis especial para un dominio particular, como

es en este caso “patrones de diseño”, resultaría más conveniente utilizar el mecanismo

de extensión propuesto por UML: el perfil. De esta forma, un perfil es usado no solo

para definir un dominio específico, sino que es utilizado para definir un dominio

general, como lo es la definición de patrones.

Si bien Dong y Yang [21] y Keen Ngee Loo et al. [22] definen un único perfil general,

orientado principalmente a la visualización de patrones cuando son aplicados en

modelos UML. Dong y Yang se ocupan de los roles de patrones que ocupan

elementos del UML compartidos, que se desempeñan en la combinación de múltiples

patrones aplicados a un diseño y enriquecen la investigación aportando ampliando el

concepto de las variantes de interacción que se produce en el comportamiento. No

particularizan la definición para un patrón específico. Y deben complementar con

restricciones OCL para garantizar formalidad en el diseño.

Una de las ventajas de usar Perfiles UML para modelar patrones es que si las

herramientas UML reconocen las características de los perfiles (de acuerdo a UML

2.0), no se requiere construir una herramienta específica para patrones.

Finalmente, se observa que es posible establecer una alternativa al enfoque

presentado por Debnath et al. [23], quienes plantean la generación de una arquitectura

de capas para elaborar perfiles según corresponda en cada una, otorgando

características que deben cumplir en las mismas. Así se obtienen diferentes

representaciones de patrones de acuerdo a su grado de generalidad.

La presente tesis continúa la anterior propuesta, ampliando el catálogo de perfiles para

los patrones de diseño de comportamiento, generando restricciones OCL tanto para la

Page 24: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

16

estructura como para el comportamiento, asegurando de este modo la consistencia

entre los diagramas de clases y de secuencia.

Por otro lado en el enfoque planteado desde la categoría de los metamodelos

surgen los siguientes comentarios:

Se observa que, los metamodelos son difíciles de entender. Esto es particularmente

resuelto en los trabajos presentados por France et al. [37] a través de RBML,

Maplesden et al. [36] con DPML y Albin-Amiot et al. [43] en la propuesta de PDL,

introduciendo nuevas notaciones gráficas para metamodelos, pero las semánticas

para éstos son complejas y no han sido formalmente definidas.

Los metamodelos gráficos son ambiguos como todo lenguaje basado en UML, ya que

el mismo es informal. Eden et al. [33] con LEPUS tiene su semántica especificada

formalmente, pero su notación no es usada ampliamente por los diseñadores y no

maneja características de comportamiento.

No son suficientemente expresivos los metamodelos gráficos para especificar patrones

en forma precisa. RBML usa OCL para compensar, pero OCL está diseñado para

modelado y tiene problemas de expresividad cuando es usado en metamodelados, por

lo cual se complica seleccionar herramienta que soporten esta características (France

et al. [37]).

Zhu y Shan [45] plantean las ventajas de la formalización de un metamodelo de los

patrones de diseño especificando la estructura como el comportamiento

sistemáticamente en una notación formal legible, habilitando la composición y la

transformación de ellos, y facilitando, a través de una herramienta, la aplicación de los

mismos en la etapa de diseño.

Finalmente, las variantes no pueden ser especificadas de otra manera más que

usando un diagrama diferente para cada variación.

Si bien este aporte es interesante también utiliza métodos formales para precisar los

patrones, siendo una opción poco elegible por los diseñadores de software.

Elaasar et al. [44][46][53] muestran los resultados en los casos de estudio presentando

sólo una efectividad de detección de los patrones en un 3% cuando se aplican

solamente a la estructura, pero la precisión mejora cuando se agregan las

Page 25: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

17

interacciones. Si bien generan un DSML a partir de una instancia de MOF, los perfiles

son instancias de UML, por lo que no generan un nuevo lenguaje. Como resultado se

generó una herramienta pero no contempla los perfiles UML, los modelos complejos y

sus posibles variaciones.

El planteo formulado por Lano et al. [52] no consideran la fusión, composición de

patrones, comparación de modelos, transformaciones de alto orden, o transformación

de aspectos tales como la bidireccionalidad y propagación del cambio. Se necesitan

futuros trabajos para identificar y documentar patrones para tales aspectos y

categorías de transformación.

1.3 La Propuesta

El presente trabajo propone la definición de Patrones de Diseño de Comportamiento

con Perfiles UML. En el desarrollo del mismo se crea una biblioteca de perfiles de

patrones. Utilizando los perfiles de UML, como metodología de definición de perfil para

un patrón, se establecen las bondades de utilizar los perfiles para definir, documentar

y visualizar patrones de diseño.

Se selecciona los patrones de diseño del catálogo GOF como objeto de estudio,

particularmente los Patrones de Diseño de Comportamiento definiendo un perfil

adecuado en los casos de estudio. De esta manera se conforma la librería de perfiles

fundacionales del presente trabajo.

A lo largo de la especificación de patrones se observan características generales y

otras particulares. De este modo se establece que no es posible precisar una misma

semántica para todos los patrones en un único perfil, razón por lo cual es

imprescindible especificar la semántica para cada patrón particular como así también

la semántica que especifique el comportamiento.

Esta situación origina el planteo de una arquitectura para patrones usando perfiles

UML, que contenga la especificación no sólo de aspectos estructurales, sino también

de comportamiento. Y también verificar la consistencia entre los diagramas de clase y

secuencia, como así también el orden de la secuencia de la ejecución de los mensajes

entre objetos.

Page 26: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

18

1.4 Motivación, hipótesis y objetivos, contribuciones y publicaciones

1.4.1 Motivaciones

Este trabajo es impulsado por el deseo de mejorar el estado del arte en el uso de los

patrones de diseño en la industria del software. Por lo tanto, esta tesis investiga cómo

proporcionar un mejor apoyo para desarrollar sistemas de software de calidad

utilizando un lenguaje de notación gráfica como es UML y su mecanismo de extensión

para generar nueva semántica a través de los Perfiles UML a los patrones de diseño

de comportamiento.

Los diseñadores de software pueden adoptar este criterio de una manera amigable y

segura para sus desarrollos donde apliquen el uso de los patrones de diseño, en

especial los de comportamiento según el catálogo GoF.

No se usa una sintaxis especial para representar patrones; sino un artefacto UML: “el

perfil”. De esta forma, un perfil se utiliza no solo para definir un dominio general sino

también para un dominio específico, como lo es la definición de patrones.

De esta forma no se verían con la limitación de aprender complejos métodos formales

orientados a la matemática y la lógica.

El uso de patrones para el diseño de modelos en la industria del software aumenta su

eficiencia.

1.4.2 Hipótesis y objetivos

Desde el comienzo de este trabajo y teniendo en cuenta lo descrito en la sección

anterior, buscamos responder los siguientes interrogantes:

1- ¿Qué debería formar parte de la esencia de un patrón de diseño?

2- ¿Qué aspectos deberían especificarse en los patrones de diseño de

comportamiento?

Page 27: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

19

3- ¿Es posible determinar la consistencia entre las características estructurales y

dinámicas de un modelo, comprobando que los elementos pertenecientes a la

estructura también estén presentes en el comportamiento?

4- ¿Es posible determinar en el comportamiento el orden lógico de la secuencia de

aparición de los mensajes acorde a cada patrón de diseño de comportamiento?

5- ¿Es posible describir el comportamiento a través de un perfil de UML?

6- ¿Es posible reutilizar los perfiles generados a través una arquitectura en capas?

Por tanto, el objetivo principal de este trabajo deriva directamente de la hipótesis

expuesta:

Especificar las características dinámicas de patrones de comportamiento a través de

Perfiles UML. Definir una arquitectura compuesta por tres niveles de representación,

que pueda ser verificada a través de una herramienta UML, formalizando los aspectos

estructurales del primer nivel, mediante restricciones. En el segundo nivel, establecer

un perfil con restricciones para los aspectos dinámicos de los patrones de

comportamiento, y en el tercer nivel individualizar un perfil particular por cada patrón

de comportamiento.

Para lograr el objetivo propuesto se han planteado los siguientes objetivos parciales:

Analizar los conceptos base: Perfiles UML y lenguaje OCL.

Comparar y analizar las herramientas que trabajan en forma estándar con

los conceptos estudiados.

Definir las particularidades más importantes de los patrones de

comportamiento a ser especificados.

Crear los Perfiles necesarios para la especificación: genérico, de

comportamiento y particulares.

Construir una arquitectura en una herramienta de software para organizar

los Perfiles.

Definir la metodología para la validación y verificación de los perfiles.

Page 28: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

20

Construir casos de estudio para la validación y verificación de los perfiles.

1.4.3 Contribuciones

La arquitectura MDA (por sus siglas en inglés, Model-Driven Architecture) [54] es un

framework para el desarrollo de software dirigido por modelos, definido por el Object

Management Group (OMG) [3].

La propuesta de MDA es elevar el nivel de abstracción mediante el uso de modelos.

Propone el desarrollo dirigido por modelos, partiendo de modelos con alto nivel de

abstracción hasta llegar a implementaciones concretas. De esta manera, los

conceptos de modelado están mucho menos ligados a la tecnología de

implementación y existen diferentes niveles de abstracción.

Las bondades ofrecidas por los perfiles se pueden aprovechar en la transformación de

modelos a otros modelos o a código (facilitando la tarea a los diseñadores de

software). En los últimos años el concepto de perfil ha servido para cubrir distintos

dominios.

De esta forma se establece un marco de formalización de especificaciones para los

patrones de diseño de comportamiento permitiendo la generación de modelos

verificados para una generación de código precisa.

El desarrollo de la especificación de patrones particulares tiene un valor considerable.

Si esto es llevado a cabo, es posible conformar una librería de patrones con perfiles.

Esta librería puede ser luego introducida en cualquiera de las herramientas UML

habilitadas para la incorporación de perfiles.

Con la implementación de los Perfiles se puede generar modelos marcados. Esta

técnica facilita la transformación de un modelo independiente de la plataforma a un

modelo específico de plataforma a través de una transformación.

En particular, si en los modelos se aplican patrones de diseño y se genera código a

través de una transformación MDA el resultado del desarrollo puede ser más eficiente,

previa verificación y validación del mismo.

Page 29: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

21

Por lo dicho anteriormente, se puede concluir que este trabajo tiene las siguientes

contribuciones:

1- La visualización y documentación de los patrones de diseño, con una definición

estándar a nivel práctico, en un marco formal utilizando los perfiles de UML.

2- El presente trabajo utiliza el mismo enfoque planteado [23], pero establece nuevas

definiciones para la especificación de patrones de comportamiento. Se enriquece el

nivel 0 (de características estructurales) cuyas descripciones solo incluían el diagrama

de clases, agregando diagramas de secuencia y sumando nuevas especificaciones a

las descriptas. La ventaja esencial de esta metodología es que al usar perfiles no se

requiere una herramienta específica sino que se puede usar cualquier software de

modelado que reconozca el lenguaje UML, OCL y la definición de perfiles.

3- El beneficio principal de una arquitectura de este tipo es la reutilización de los

distintos perfiles utilizados en la jerarquía. Dicha reutilización produce valor agregado

en el desarrollo del software.

4- Verificar la consistencia entre el modelado de la estructura de un sistema y su

comportamiento a través de verificaciones formales con OCL.

1.4.4 Publicaciones derivadas

La propuesta planteada en el presente trabajo, se ha publicado en diferentes

congresos nacionales y revistas internacionales.

Alberto Cortez, Ana Garis, Daniel Riesco. “Perfiles UML para la Especificación de

Patrones de Comportamiento: Un caso de Estudio", Proceedings of the XVIII

Congreso Argentino de Ciencias de la Computación (CACIC 2012), 2012. ISBN:

978-987-1648-34-4.

Alberto Cortez, Ana Garis. “Aplicación de Perfiles UML en la Especificación de

Patrones de Comportamiento”, Proceedings of the 13th Argentine Symposium on

Software Engineering (ASSE 2012), 41 Jornadas Argentinas de Informática (41

JAIIO), ISSN: 1850-2792, pp. 199-214, 2012.

Page 30: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

22

Alberto Cortez, Ana Garis, Daniel Riesco. “Perfiles UML para la Definición de

Patrones de Comportamiento”, Proceedings of the XIV the Workshop de

Investigadores en Ciencias de la Computación, Editorial de la Universidad Nacional

de Misiones, ISBN 978-950-766-082-5, pp. 467-471, 2012.

Alberto Cortez, Ana Garis, Daniel Riesco. “Formalización de Patrones de Diseño de

Comportamiento”, Proceedings of the XIII the Workshop de Investigadores en

Ciencias de la Computación (WICC 2011), Editorial de la Universidad Nacional de

Rosario, ISBN 978-950-673-892-1, pp. 435-438, 2011.

Alberto Cortez, Claudia Naveda, Ana Garis, Daniel Riesco. “Validación de Patrones

de Diseño de Comportamiento a través de Perfiles UML, un caso de estudio”.

REABTIC 2014 – Revista editada por la Facultad Três de Maio (SETREM), de Três

de Maio, RS, Brasil. Revista electrónica Argentina – Brasil de Tecnologías de

Información y de la Comunicación. ISSN 2446-7634.

http://revistas.setrem.com.br/index.php/reabtic/issue/view/2

1.5 Estructura de la tesis

La tesis se encuentra dividida en siete capítulos. El presente capítulo contiene la una

introducción a la problemática de la formalización de los patrones de diseño, se

presentan distintos enfoques utilizados por investigadores para resolver su

ambigüedad. También se elaboran los conceptos preliminares de toda tesis, hipótesis,

objetivos, contribuciones y publicaciones derivadas del presente trabajo.

En el segundo capítulo se explican los conceptos de metamodelado y la tecnología

MDA, mostrando la gran importancia puesta en los modelos, para guiar el proceso de

desarrollo de software. Se continúa con una explicación del lenguaje UML y el

mecanismo que tiene para realizar la extensión a través de los perfiles de UML. Se

establece posteriormente la noción de OCL para formalizar los modelos y

metamodelos.

El tercer capítulo se hace una breve referencia a los patrones de diseño y

especialmente se expresan las características de comportamiento. Seguidamente se

brinda una explicación de la arquitectura jerárquica planteada para aplicar los perfiles

Page 31: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

23

de UML en cada nivel, se determinan las funcionalidades y responsabilidades de las

restricciones que cada capa debe asumir. Por último se muestra el mecanismo para

definir perfiles de patrones.

En el capítulo cuatro se describe el primer nivel de la arquitectura planteando el perfil

de patrones genérico. Se analizan los elementos del metamodelo de UML que se

utilizarán para definir los estereotipos. También se destacan los formalismos

necesarios para la especificación de la estructura de los patrones de diseño. Los

aspectos estructurales refieren a elementos del diseño orientado a objetos:

clasificadores, clases, atributos, operaciones. Estos aspectos estructurales se verifican

a través de estereotipos creados para ese fin. Por último se crean las restricciones que

deben cumplir los elementos generados en este nivel.

En el capítulo cinco está dedicado al segundo nivel de la arquitectura, donde se

especifica el perfil de patrones de comportamiento, se realiza una descripción de

aspectos dinámicos y su especificación formal.

En el capítulo seis se presenta el tercer nivel de la arquitectura, donde se plantea la

especificación para cada patrón particular con sus restricciones y la aplicación en

ejemplos de casos de estudio.

Finalmente, en el capítulo siete se formulan las conclusiones derivadas de la

investigación y posibles trabajos futuros.

Page 32: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

24

Page 33: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

25

CAPITULO II

Modelado, Metamodelado en el contexto MDA. UML, Perfiles. OCL

MDA es un framework para el desarrollo de software definido por la OMG. Su clave es

la gran importancia puesta en los modelos, para guiar el proceso de desarrollo de

software. En la actualidad la propuesta MDA está tomando cada vez más fuerza en el

desarrollo de software como se presenta [55].

MDA postula que la especificación de la funcionalidad del sistema no debe tener en

cuenta su implementación en una plataforma de una tecnología específica. Una forma

de facilitar este proceso es la identificación de elementos que deben transformarse en

un modelo de una manera concreta, y marcarlos como tales. Por ejemplo, los modelos

que contengan en su interior patrones de diseño deben contener ciertos roles. Este es

el tema tratado en este trabajo.

2.1 El concepto de modelo en MDA

Un modelo [4] es una descripción o especificación de un sistema y su ambiente para

algún cierto propósito. Los siguientes modelos son el centro de MDA:

Modelo independiente de la computación (en inglés, Computation Independent Model

o CIM): también llamado modelo del dominio, muestra el sistema en el ambiente en

que operará y lo que se espera que haga. Es útil no sólo para entender el problema,

sino también como fuente de un vocabulario común para usar en los otros modelos.

Modelo independiente de la plataforma (en inglés, Platform Independent Model o PIM):

tiene un alto nivel de abstracción y es independiente de cualquier tecnología de

implementación. Se centra en el funcionamiento de un sistema mientras oculta los

Page 34: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

26

detalles necesarios para una plataforma particular. Este modelo muestra aquella parte

de la especificación completa que no cambia de una plataforma a otra, por ejemplo

dotNET o J2EE.

Modelo específico a la plataforma (en inglés, Platform Specific Model o PSM): combina

el punto de vista independiente de la plataforma con un enfoque adicional en el detalle

del uso de una plataforma específica para un sistema. Es adecuado para especificar el

sistema en términos de construcciones de implementación que son disponibles en una

tecnología de implementación específica. Por ejemplo, un PSM EJB típicamente

contendrá términos específicos EJB, como “home interface”, “entity bean”, etc.

Modelo específico a la implementación (en inglés, Implementation Specific Model o

ISM): muestra el sistema a nivel de código, se refiere a componentes y aplicaciones

escritos en lenguajes de programación tales como Java o Eiffel.

2.2 Lenguaje de modelado

Otro elemento de MDA es el lenguaje de modelado. Un modelo es siempre escrito en

un lenguaje. Se puede entender un modelo o esquema conceptual como un mapa de

conceptos (clases) y sus relaciones (asociaciones) que intenta representar un

fragmento de la realidad. Un modelo especifica qué elementos pueden existir en un

sistema.

La definición de un lenguaje de modelado especifica que elementos pueden existir en

un modelo. Por ejemplo, el lenguaje UML especifica que dentro de un modelo se

pueden usar los conceptos Clase, Estado, Paquete, etc. Debido a esta similitud, se

puede describir un lenguaje por medio de un modelo, usualmente llamado metamodelo

[7]. El metamodelo de un lenguaje describe que elementos pueden ser usados en el

lenguaje.

Como un metamodelo es también un modelo, el metamodelo en sí mismo debe estar

escrito en un lenguaje. Este lenguaje se llama metalenguaje.

Page 35: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

27

2.3 Arquitectura

La Arquitectura de cuatro capas de Modelado es la propuesta de la OMG orientada a

estandarizar conceptos relacionados al modelado, desde los más abstractos a los más

concretos.

En la figura 2.1 se observa la arquitectura definida por la OMG de cuatro capas para

sus estándares, llamadas M0, M1, M2 y M3:

1. En el nivel M3 reside el meta-metamodelo. Este nivel forma la base de la

arquitectura de metamodelado. MOF es un lenguaje estándar de la OMG y es la capa

más abstracta.

2. En el nivel M2 reside el metamodelo. Éste es una instancia de un meta-metamodelo

(elemento de M3) que a su vez especifica elementos de la capa M1. Lenguajes de

modelado como UML, CWM (por sus siglas en inglés, Common Warehouse Model)

[56] son instancias del MOF. El lenguaje UML está considerado un estándar para

especificar modelos conceptuales.

3. El nivel M1 contiene modelos. Cada modelo es una instancia de un metamodelo

(elemento de M2) y a su vez especifica elementos de la capa M0. En la definición de

modelos en UML se pueden usar entre otros elementos: clases, atributos y

asociaciones, ya que el metamodelo de UML define qué es una clase, qué es un

atributo y qué es una asociación.

4. En el nivel M0 se encuentra un sistema en ejecución en el cual existen instancias

reales, los elementos en este nivel son instancias de los elementos especificados por

modelos a nivel M1.

Page 36: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

28

Nivel Descripción

M3 MOF

M2 metamodelos, instancias de los elementos MOF : UML

M1 modelos, instancia de un metamodelo UML

M0 el sistema, objetos y datos, instancias de los elementos de un modelo

Figura 2.1: Capas de arquitectura MDA.

2.4 Relación entre modelos y metamodelos

Un meta-metamodelo es un modelo que define el lenguaje para representar un

metamodelo. La relación entre un meta-metamodelo y un metamodelo es análoga a la

relación entre un metamodelo y modelo [3].

Un metamodelo es un modelo que define el lenguaje formal para representar un

modelo. Un metamodelo se expresa con notación gráfica y con un lenguaje formal,

como OCL, para aumentar su precisión y eliminar ambigüedades. Si bien este

acercamiento carece de la precisión de la especificación de los métodos formales,

ofrece una especificación intuitiva y comprensible.

El metamodelado entonces es un mecanismo que permite definir formalmente

lenguajes de modelado, como por ejemplo, UML y OCL.

Como resultado se puede mostrar la definición de capas del modelo MOF (figura 2.1) a

través del ejemplo usado en la figura 2.2, en dicho ejemplo se ven diferentes niveles.

Page 37: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

29

Figura 2.2: Ejemplo aplicando niveles MDA.

Nivel M0: Instancias

En el nivel M0 se encuentran todas las instancias “reales” del sistema, es decir, los

objetos de la aplicación. Aquí no se habla de clases, ni atributos, sino de entidades

físicas que existen en el sistema. Para entender mejor la relación entre los elementos

en las distintas capas, se presenta un ejemplo de cómo se modela un sistema con

UML.

En el caso de la figura 2.2 se trata de un sistema donde se maneja información acerca

de los clientes, y los artículos de los cuales se dispone. Existen dos clientes “c1” y

“c2”, donde “c1” tiene los atributos nombre, dirección y teléfono, cuyos valores son

respectivamente “David Aguilar”, “Ronda Norte” y 968905541. Y “c2” contiene a su vez

los valores “Miguel Martínez”, “Abderraman 2,4” y 968294122.

Todas estas entidades son instancias pertenecientes a la capa M0.

Page 38: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

30

Nivel M1: Modelo del sistema

Por encima de la capa M0 se sitúa la capa M1, que representa el modelo de un

sistema de software. Los conceptos del nivel M1 representan categorías de las

instancias de M0. Es decir, cada elemento de M0 es una instancia de un elemento de

M1. Sus elementos son modelos de datos, por ejemplo entidades como “Cliente”,

“Artículo”, atributos como “nombre” y relaciones entre estas entidades.

En el nivel M1 aparece entonces la entidad “Cliente” la cual representa los clientes del

sistema, tales como “David Aguilar”, con los atributos nombre, dirección y teléfono. Lo

mismo ocurre con la entidad “Artículo”.

Nivel M2: Metamodelo

Análogamente a como ocurre con las capas M0 y M1, los elementos del nivel M1 son

a su vez instancias del nivel M2. Esta capa recibe el nombre de metamodelo. En este

nivel aparecen conceptos tales como Clase, Atributo o Asociación.

Siguiendo el ejemplo, la entidad “Cliente” será una instancia de la metaclase Class del

metamodelo UML. Sus atributos, nombre, teléfono y dirección serán instancias de la

metaclase Attribute. El ejemplo más popular de un lenguaje en la capa M2 es el

metamodelo UML, que describe el lenguaje UML.

Nivel M3: Meta-metamodelo

De la misma manera se observa los elementos de M2 como instancias de otra capa, la

capa M3 o capa de meta-metamodelo. Un meta-metamodelo es un modelo que define

el lenguaje para representar un metamodelo. La relación entre un meta-metamodelo y

un metamodelo es análoga a la relación entre un metamodelo y modelo.

Es el nivel más abstracto, que permite definir metamodelos concretos. La OMG define

a MOF como el lenguaje estándar de la capa M3. Esto supone que todos los

metamodelos de la capa M2, son instancias de MOF. Puede ser usado para definir

metamodelos orientados a objetos, como es el caso de UML, y también para otros

metamodelos, como es el caso de las redes de Petri o metamodelos para servicios

web.

Page 39: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

31

La figura 2.2 muestra la relación entre los elementos del metamodelo UML (Nivel M2)

con los elementos del metamodelo de MOF (Nivel M3). Puede verse que las entidades

de la capa M2 son instancias de las metaclases MOF de la capa M3.

Por último, como vista general, la figura 2.2 muestra las cuatro capas de la

arquitectura de modelado, indicando las relaciones entre los elementos en las

diferentes capas. Puede observarse que en la capa M3 se encuentra el meta-

metamodelo MOF, a partir del cual se pueden definir distintos metamodelos en el nivel

M2, como UML, OCL, etc.

Las instancias de estos metamodelos serán los elementos del nivel M1, como modelos

UML por ejemplo. A su vez, instancias de los elementos M1 serán los objetos, como

los objetos UML.

Una de las principales ventajas de este enfoque es que cada uno de los objetos puede

ser verificado contra su respectivo metaobjeto, en la capa inmediata superior. Por

ejemplo, la clase Cliente debe corresponder a las características y especificaciones de

Class en el metamodelo.

MOF define una arquitectura de metamodelado estricta, cada elemento de modelo de

cada capa se corresponde estrictamente con un elemento de modelo de la capa

superior.

2.5 UML

2.5.1 Introducción

El diseño y modelado de sistemas ocupan un importante lugar entre los ingenieros de

software [57]. Los modelos brindan la posibilidad de abstraer sistemas y facilitar la

posterior codificación. La elaboración de buenos modelos ayuda a la comunicación

entre ingenieros. Por otro lado, asegura un correcto desarrollo de la arquitectura del

sistema, a medida que este aumenta en complejidad.

Para la descripción de un modelo, es necesario tener un lenguaje con una sintaxis y

semántica precisa. Un lenguaje de modelado, permite elaborar los modelos requeridos

en el diseño de un sistema. Existen numerosos lenguajes de modelado, pero UML es

uno de los más conocidos y utilizados en la actualidad.

Page 40: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

32

UML es creado por Grady Booch, James Rumbaugh e Ivar Jacobson [4]. Numerosas

corporaciones ven la utilidad del lenguaje, razón por la cual se conforma un consorcio.

En 1997, el consorcio produce la primera versión y lo presenta a la OMG, quien lo

publica como lenguaje de modelado estándar. A partir de allí, la OMG publica

numerosas versiones, hasta llegar a la versión 2.5, vigente en la actualidad.

La versión UML 2.5 es una revisión menor de la especificación UML 2.4.1, que en ella

presentaba dos documentos que se complementaban entre sí, “Superstructure”

(superestructura) y “Infraestructure” (infraestructura). La primera define los

constructores a nivel de usuario y la segunda los fundamentos de los constructores del

lenguaje.

2.5.2 Características

UML permite fácilmente especificar, construir, visualizar y documentar artefactos de

sistemas de software [7]. La construcción de sistemas se relaciona a la posibilidad de

mapear modelos por ejemplo, a lenguajes de programación o a tablas en una base de

datos.

La posibilidad de visualización de diferentes elementos gráficos en los modelos, es

una de las características más representativas de UML. Es un lenguaje de modelado

visual para construir sistemas orientados a objetos y basados en componentes.

El aspecto referido a la documentación está ligado a la organización de componentes

que surgen del proceso de desarrollo se software (requerimientos, arquitectura,

diseño, código, pruebas, prototipos, revisiones, etc.). Dichos componentes son

fundamentales en el control, validación y comunicación de un sistema.

UML provee los medios para una adecuada organización del proceso de desarrollo de

software. De esta forma las personas involucradas (analistas, desarrolladores,

clientes, etc.) puedan comprenderlo correctamente. UML toma muchas de las buenas

prácticas relacionadas al modelado orientado a objetos, unificando los métodos más

utilizados en el mundo.

Entre alguno de los principales objetivos de UML está, el de proveer mecanismos de

extensibilidad y especialización para extender conceptos. También soportar

especificaciones independientes de lenguajes de programación y procesos de

Page 41: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

33

desarrollo. Finalmente tiene como objetivo soportar conceptos de desarrollo de alto

nivel tales como componentes, colaboraciones, frameworks y patrones.

Los bloques de construcción de UML son los elementos, las relaciones y los

diagramas. Los primeros son abstracciones básicas (en UML existen cuatro:

estructurales, de comportamiento, de agrupamiento y anotacionales). Las relaciones

ligan los elementos entre sí (existen cinco: dependencia, asociación, generalización,

realización y agregación). Los diagramas son representaciones gráficas de un

conjunto de elementos. En el anexo A se pueden ampliar los conceptos mencionados

a UML.

UML define diagramas gráficos para mostrar diferentes vistas del modelo y ofrecer

múltiples perspectivas de un sistema. Un diagrama representa un conjunto de

elementos que integran un sistema. Dichos elementos pueden aparecer en todos o en

parte de alguno o varios diagramas.

Los diagramas definidos por UML son: diagrama de casos de uso, de clase, de

comportamiento, de estados, de actividad, de interacción (colaboración y secuencia),

implementación, componentes y despliegue.

El enfoque de metamodelado utilizado para definir UML se basa en técnicas de

especificación formal. Es deseable que dichas especificaciones contengan las

propiedades de correctitud, precisión y consistencia; como así también la

particularidad de no incorporar detalles insignificantes.

La correctitud del metamodelo está relacionada con su validación; por ejemplo, las

reglas bien formadas deberían ayudar a verificar la sintaxis abstracta y a identificar

errores. La precisión de la técnica de especificación se refiere a la no existencia de

ambigüedades entre la sintaxis y la semántica del lenguaje.

Las características de UML lo posicionan como un lenguaje de modelado de propósito

general; capaz de ser aplicado en diferentes dominios de aplicación y en distintas

plataformas de implementación. Son muchos los dominios de aplicación cubiertos por

UML. El lenguaje es estructurado modularmente, esto permite seleccionar la parte del

lenguaje más útil para cada fin.

Por otro lado, un exceso de modularidad trae añadidos inconvenientes. Dos

herramientas UML que soportan diferentes subconjuntos del lenguaje tienen

Page 42: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

34

aparejados problemas de intercambio. Por esta razón, se requiere un balance entre

modularidad y facilidades para intercambio. Para lograr dicho objetivo, UML provee el

concepto de “unidades del lenguaje”.

Las unidades de lenguaje agrupan los conceptos de modelado. Proveen al usuario de

los elementos necesarios para representar aspectos del sistema, de acuerdo a un

paradigma particular.

2.6 Perfiles

En repetidas ocasiones, UML no es lo suficientemente expresivo para representar

conceptos específicos de dominios particulares. Por esta razón, UML estándar incluyó

un mecanismo para extender y adaptar UML a diferentes dominios y plataformas: el

"Perfil UML” (en inglés, “UML Profile”).

La propuesta de extensión del perfil, no permite modificar al metamodelo existente,

sino adaptar al metamodelo existente, agregando constructores propios para un

dominio particular. El origen del mecanismo se remonta a la versión UML 2.0. En ese

momento se definieron los conceptos de “estereotipos” y “valores etiquetados” como

elementos básicos de extensión. La intención inicial era proveer un conjunto de

características que permitiese añadir información a los elementos del modelo de una

manera sencilla y flexible.

Las versiones siguientes procuraron otorgar cada vez mayor precisión en su definición.

Pero es el actual UML 2.5 el que muestra mayores avances en este sentido, y provee

una técnica de metamodelado sólida y consistente, donde los estereotipos son

especificados como metaclases, los valores etiquetados como meta atributos y los

perfiles como una clase de paquete.

El mecanismo de extensión del metamodelo impone restricciones en cómo el

metamodelo UML puede ser modificado. No está permitido insertar nuevas

metaclases, o modificar definiciones de la metaclase (agregando meta asociaciones).

Las características presentes en UML 2.5 hacen que sea posible especializar la

semántica de elementos del metamodelo de UML estándar. También brinda una

convención notacional para definiciones de estereotipos gráficos. Las clases del

paquete Profile son mostradas a través de un diagrama de clases (figura 2.3).

Page 43: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

35

Descripción de metaclases

Dentro de la especificación de la sintaxis abstracta, se describen las metaclases

principales con sus respectivas restricciones y operaciones adicionales.

Figura 2.3 Perfil: Sintaxis abstracta.

Class: Clase se relaciona con un subtipo de asociación, esto indica como ésta puede

ser extendida a través de uno o más estereotipos. Pero un estereotipo no puede ser

extendido por otros estereotipos.

Extension: La extensión es una clase de asociación. Se utiliza para indicar que las

propiedades de una metaclase son extendidas a través de un estereotipo. Brinda la

capacidad para flexibilizar la agregación y el borrado de estereotipos.

ExtensionEnd: La extensión final es una clase de Property utilizada para asociar una

extensión a un estereotipo, cuando se extiende una metaclase. Solo puede ser

accedida a través de Extension. No es posible agregar propiedades a un clasificador

extendido (no está permitido cambiar un elemento del metamodelo, únicamente

agregar nuevas propiedades).

Page 44: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

36

Package: Un paquete puede tener uno o más ProfileApplications para indicar cuáles

son los perfiles que se aplican. Dado que un perfil es un paquete, es posible aplicar un

perfil no solo a paquete sino también a perfiles.

Profile: El perfil es una clase de paquete que establece las extensiones para un

elemento del metamodelo. El propósito es adaptarlo a un dominio particular. El

elemento básico de extensión es el estereotipo. Por esta razón es definido como parte

del perfil. Un perfil es una forma restrictiva de un metamodelo. Las extensiones se

definen como estereotipos que se aplican a metaclases existentes.

ProfileApplication: Se utiliza para mostrar cuáles son los perfiles que se aplican a un

paquete. Uno o más perfiles pueden ser aplicados a un paquete.

Stereotype: Un estereotipo define cómo se extiende una metaclase y habilita al uso

de una terminología específica para un dominio particular. Es un tipo de clase que

extiende clases a través de Extension. Una clase puede ser extendida por uno o más

estereotipos.

Dado que es una clase, puede tener propiedades, a las cuales se refiere como

definiciones de etiquetas (tags). Cuando un estereotipo se aplica a un elemento del

modelo, los valores de las propiedades se refieren como valores etiquetados.

Ventajas

Son numerosas las ventajas que genera el uso de perfiles. Se detallan algunas de las

principales:

Definir un nuevo vocabulario para un dominio o plataforma especifica (para

Tiempo Real, Enterprise Java Beans, etc.).

Dar una sintaxis para constructores que no tienen notación.

Definir una notación particular para elementos ya existentes, de acuerdo al

dominio donde dichos elementos se encuentran.

Agregar semántica a elementos del metamodelo que tienen una semántica

imprecisa.

Agregar nueva semántica al metamodelo.

Page 45: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

37

Agregar restricciones que restrinjan la forma en que el metamodelo y sus

constructores puedan ser usados.

La posibilidad de agregar información en los modelos puede ser usada para

transformarlos en código.

Elementos

El perfil UML incluye los elementos necesarios para hacer posible la extensión del

lenguaje. Ellos son: los estereotipos (en inglés, stereotypes), los valores etiquetados

(en inglés, tags values) y las restricciones (en inglés, constrains).

Un estereotipo permite extender el vocabulario UML. Durante su definición, se lleva a

cabo su asociación con elementos del metamodelo (clase, operación, etc.). Dentro de

los modelos es denotado de la siguiente manera “<<stereotype-name>>”.

Los valores etiquetados están cercanamente relacionados a los estereotipos, dado

que son sus atributos asociados. La forma de expresarlos es a través de la dupla

{nombre=valor}.

Las restricciones permiten agregar semántica tanto a los elementos del modelo como

a los del metamodelo. En este último caso, es llevado cabo cuando se le añaden

restricciones a los estereotipos. Si esto sucede, debe cumplirse que los modelos que

utilicen dichos estereotipos, conformen las restricciones impuestas para él.

En muchas ocasiones, el lenguaje natural es usado para definir restricciones. Sin

embargo, OCL es una mejor alternativa, debido a su precisión y consistencia.

Notación Gráfica

Se hace uso de distintos elementos gráficos al momento de llevar a cabo la definición

de un perfil. Utilizando estereotipos para denotar los elementos. A continuación se

exponen las diferentes notaciones gráficas, cada notación con su correspondiente

elemento de perfil asociado. En la tabla 2.1, se muestra la notación para los vínculos y

en la tabla 2.2 para estereotipos, metaclases y perfiles.

Page 46: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

38

Elemento de Perfil Notación gráfica

Extension

ProfileApplication

Tabla 2-1: Notación gráfica de vínculos.

Elemento de Perfil Notación gráfica

Stereotype

Metaclass

Profile

Tabla 2-2: Notación gráfica de estereotipos, metaclases y perfiles.

Han sido creados numerosos perfiles para los más variados dominios. Por ejemplo, se

han definido perfiles para “Testing” [58], [59], “Java y especificaciones EJB” [60],

“Tiempo Real” [61], “Agentes inteligentes” [62], [63], “Tolerancia a las fallas” [64]–[66];

entre otros.

La figura 2.4 muestra el Perfil de Enterprise Java Beans (EJB). En el ejemplo se

muestra cómo definir estereotipos, valores etiquetados y restricciones.

Page 47: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

39

Figura 2.4: Ejemplo Perfil EJB.

La forma de especificar un estereotipo es asociando su nombre con elementos del

metamodelo. Por ejemplo el estereotipo JAR es asociado con el meta elemento

Artifact; Remote y Home con Interface, y el estereotipo abstracto Bean con Component

(una instancia de clases concretas Entity o Session debe ser asociado a cada

instancia de Component). Un ejemplo de valor etiquetado es state, el cual es asociado

a Session. Finalmente hay dos restricciones, una relacionada a Component y otra a

Bean, ambas en lenguaje natural, OCL no es utilizado.

2.7 OCL

Tal como se mencionó en las secciones anteriores, las restricciones son

frecuentemente descriptas a través del lenguaje natural, pero esto resulta en

ambigüedades. OCL es un lenguaje para la especificación de restricciones no

ambiguas [67].

Una de sus principales características es su fácil comprensión, no es necesario tener

excesivo conocimiento previo en matemáticas para entender sus especificaciones.

Según se manifiesta en las especificaciones de OMG fue diseñado para compensar el

desajuste que se producía en los modelos con una estructura fácil de leer y escribir. La

utilidad de OCL se manifiesta en la diversidad de propósitos para los cuales puede ser

aplicado, tal como también se expresa [68].

- Como lenguaje de consultas.

Page 48: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

40

- Para especificar invariantes sobre clases y tipos en los modelos de clases.

- Para especificar invariantes de tipos para estereotipos.

- Para describir pre y post condiciones sobre operaciones y métodos.

- Para describir guardas.

- Para especificar objetivos (o conjuntos) para mensajes y acciones.

- Para especificar restricciones sobre operaciones.

- Para especificar reglas de derivación de atributos para cualquier expresión

sobre un modelo UML.

OCL es un lenguaje tipado, cada expresión tiene un tipo. Por ejemplo, no se puede

comparar un Integer con un String. Los tipos pueden ser cualquier clase de

clasificadores dentro de UML.

Cabe destacar que no es un lenguaje de programación, por lo que no es posible

escribir lógica de programas o flujos de control. Tampoco es válido pensar que la

especificación pueda ser directamente ejecutable.

El mismo OCL es utilizado para definir la semántica de UML, especificando reglas bien

formadas sobre el metamodelo. Las reglas bien formadas son definidas como

invariantes sobre las metaclases en la sintaxis abstracta. También es usado para

definir operaciones adicionales, cuando las reglas bien formadas las precisan. Para un

mayor detalle ver Anexo B.

Funciones de RSA en expresiones OCL

En las expresiones OCL utilizadas en este trabajo, se emplearon dos métodos que

figuran dentro del software RSA. Estos métodos se pueden aplicar a un elemento o a

un paquete dentro de una restricción OCL. Dichos métodos sirven para verificar los

estereotipos aplicados en un modelo.

GetAppliedStereotypes (): Obtiene los estereotipos aplicados en un elemento. Por

ejemplo un clasificador es un elemento que puede representar clases o interfaces, etc.

en un modelo.

Page 49: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

41

getAppliedProfiles: Obtiene los perfiles aplicados en un paquete.

Page 50: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

42

Page 51: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

43

CAPITULO III

Especificación de Patrones de Diseño

Como fue explicado en capítulos anteriores el uso de perfiles permite extender la

sintaxis y la semántica UML para modelar elementos de dominios particulares. Es

posible usar perfiles para definir un vocabulario de patrones en UML. En este capítulo

se describe el concepto de patrones de diseño, y se detalla la arquitectura de patrones

de diseño utilizada en el presente trabajo.

3.1 Patrones de diseño

3.1.1 Concepto

Los patrones de diseño tuvieron su origen a mediados de la década del noventa,

siendo el trabajo de Gamma et al. presentado en [1], uno de los catálogos de patrones

más difundidos. A partir de allí fueron ampliamente aceptados en el área de desarrollo

de software tanto en empresas como en el mundo académico.

En [1] se da una definición precisa de lo que es un patrón de diseño y cómo debe ser

usado. Es una visión aceptada en la comunidad de la ciencia de la computación.

Define los patrones de diseño como:

“descripciones de objetos que se comunican y clases que son personalizadas para

resolver un problema de diseño general en un contexto particular”

Los patrones de diseño describen soluciones adecuadas a problemas que ocurren

repetidamente, haciendo al diseño más flexible, elegante y principalmente reusable.

Esta solución puede ser aplicada repetidamente para producir estructuras de diseño

que lucen de forma similar al desarrollar aplicaciones diferentes.

Page 52: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

44

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.

El patrón de diseño identifica las clases que participan y las instancias, sus roles y

colaboraciones, y la distribución de responsabilidades. Cada patrón se enfoca sobre

un problema de diseño orientado a un objeto particular.

3.1.2 Clasificación de Patrones de Diseño

Gamma et al. [1] presentan 23 patrones de diseño, clasificados según dos criterios: el

propósito y el ámbito. La Tabla 3.1 muestra esta clasificación.

PROPOSITO

Creacional Estructural Comportamiento

Clase

- Factory Method

- Adapter

- Interpreter

- Template Method

Objeto

- Abstract Factory

- Builder

- Prototype

- Singleton

- Adapter

- Bridge

- Composite

- Decorator

- Façade

- Flyweight

- Proxy

- Chain of Responsibility

- Command

- Iterator

- Mediator

- Memento

- Observer

- State

- Strategy

- Visitor

Tabla 3-1: Clasificación de los patrones de diseño.

A

L

C

A

N

C

E

Page 53: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

45

El propósito refleja lo que hace el patrón, y los clasifica en:

- De Creación: Abstraen el proceso de creación de instancias de objetos.

Ayudan a hacer a un sistema independiente de cómo se crean, se componen y

se representan sus objetos.

- Estructurales: Tratan con la composición de clases u objetos. Se ocupan de

cómo las clases y objetos se utilizan para componer estructuras de mayor

tamaño.

- De Comportamiento: Caracterizan el modo en que las clases y objetos

interactúan y se reparten la responsabilidad.

El segundo criterio, el ámbito, especifica si el patrón se aplica a clases u objetos:

Si se aplica a clases las relaciones se producen entre clases y subclases, y son

establecidas a través de la herencia, estáticas, por lo que se fijan al momento de la

compilación. Si se aplica a Objetos las relaciones se producen entre objetos, y pueden

ser cambiadas en tiempo de ejecución, son dinámicas.

3.2 Catálogo de patrones:

Abstract Factory: Permite crear objetos de distintas familias.

Adapter: Convierte la interfaz de una clase a otra interfaz que es las que los clientes

esperan.

Bridge: Desacopla una abstracción de su implementación.

Builder: Separa la construcción de un objeto complejo de su representación.

Chain of Responsability: Evita el acoplamiento de objetos que envían un

requerimiento a su receptor. Esto se logra dando a más de un objeto la chance de

manejar el requerimiento.

Command: Encapsula el requerimiento como a un objeto.

Composite: Relaciona objetos compuestos, para permitir su manipulación de una

manera más simple.

Page 54: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

46

Decorator: Añade responsabilidades adicionales a un objeto dinámicamente.

Factory Method: Se define una clase encargada de crear objetos de un subtipo dado.

Facade: Define una interfaz simple para facilitar el acceso a una interfaz o grupo de

interfaces de un subsistema.

Flyweight: Disminuye la redundancia cuando muchos objetos poseen idéntica

información.

Interpreter: Define una gramática para un lenguaje, así como las herramientas

necesarias para interpretarlo.

Iterator: Ofrece un medio para acceder a una colección de objetos de manera

secuencial.

Mediator: Define un objeto para coordinar la comunicación entre objetos de distintas

clases, pero que a su vez, funcionan como un conjunto.

Memento: Captura y externaliza el estado interno de un objeto.

Observer: Define una dependencia entre objetos, cuando un objeto cambia de estado

notifica y actualiza automáticamente a los objetos dependientes.

Prototype: Especifica la clase de objetos para crear nuevos objetos clonándolos de

una instancia ya existente.

Proxy: Provee una referencia para acceder a un objeto más sofisticado

Singleton: Establece la existencia de una única instancia para una clase.

State: Permite que un objeto alterne su comportamiento cuando cambia su estado.

Strategy: Define una familia de algoritmos, encapsula a cada uno, y los hace

intercambiable.

Template Method: A través de una operación se define el esqueleto de un algoritmo

en una clase. Las subclases deben realizar algunos de los pasos del algoritmo.

Visitor: Define nuevas operaciones sobre una jerarquía de clases sin cambiar los

objetos sobre los que opera.

Page 55: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

47

3.3 Características de los patrones de Comportamiento:

Variación de la Encapsulación de objetos:

Los aspectos cambiantes de un sistema se encapsulan, para disminuir dependencias

entre objetos. Se utiliza una clase abstracta o interface para encapsular el objeto y el

patrón toma su nombre de este objeto.

Un objeto Strategy encapsula un algoritmo que modela una estrategia.

Un objeto State encapsula un comportamiento dependiente de un estado.

Un objeto Mediator encapsula el protocolo entre objetos.

Un objeto Iterator encapsula la forma en que se accede y navegan los componentes

de un objeto.

La mayoría de los patrones tienen dos tipos de objetos: los objetos nuevos que

encapsulan el aspecto y los objetos existentes que usan los nuevos. Por ejemplo, el

código para Strategy está unido al Contexto de la estrategia, y el código para State se

implementa en el Contexto del estado.

Objetos como argumentos:

Algunos patrones como el Visitor implantan un objeto que siempre es usado como un

argumento. Un objeto Visitor es el argumento para una operación polimórfica sobre el

objeto que lo visita. Visitor nunca es considerado una parte de estos objetos.

Otros patrones definen objetos que actúan como tokens mágicos para ser pasados e

invocados. Son ejemplo de esta técnica los patrones Command y Memento. En

Command el token representa un pedido; en Memento, representa el estado interno de

un objeto en un momento particular.

Ejecutar el objeto Command es una operación polimórfica.

Un memento solo puede ser pasado como un valor. Para validar esta característica se

debe verificar la consistencia entre las operaciones del diagrama de clases y las

invocaciones del diagrama de secuencia. Si la operación en el diagrama de clases

Page 56: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

48

tiene como argumento un objeto en las llamadas a una operación, existe un argumento

de tipo objeto.

Distribución de la comunicación:

Observer distribuye la comunicación introduciendo los objetos Observer y Subject, así

que el patrón de comunicación está determinado en este caso por la forma en la que

observadores y sujetos están interconectados. Como no se encapsulan las

restricciones de la comunicación, los observadores y sujetos deben colaborar para

mantener la restricción. Existe una comunicación de tipo emisor (broadcast), es decir,

se actualizan el estado del sujeto en todos los observadores de la lista a través de esta

comunicación.

Desacoplamiento entre emisores y receptores:

Los objetos que colaboran entre sí explícitamente pueden volverse dependientes y

esto provoca desequilibrio y baja reusabilidad. Los patrones Command y Observer

entre otros tratan este problema a través de la comunicación, desacoplando emisores

de receptores.

Definir la conexión emisor-receptor en un objeto separado permite al emisor trabajar

con diferentes receptores. De esta manera el emisor se desacopla de los receptores,

haciendo más fácil reusar los emisores.

Por ejemplo el Command provee un objeto simple para distribuir un pedido. Se puede

reusar el objeto Command para parametrizar un receptor con diferentes emisores. El

patrón Command es un intermediario entre emisores y receptores.

Por ejemplo el patrón Observer es un intermediario que desacopla emisores (subjects)

de receptores (observers) definiendo una interface para mostrar los cambios en los

sujetos. Observer separa el emisor del receptor porque un subject puede tener

múltiples observers, y su número puede variar en tiempo de ejecución. Las interfaces

Subject y Observer en el patrón Observer son designadas para comunicar cambios.

Consecuentemente el patrón Observer es mejor para desacoplar objetos cuando hay

dependencias de datos entre ellos y su número puede variar en tiempo de ejecución.

El patrón Mediator desacopla objetos por haberlos referido indirectamente a través de

un intermediario, objeto Mediador. Un objeto Mediador rutea pedidos entre objetos

Page 57: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

49

Colleague y centraliza su comunicación. Consecuentemente, los colleagues sólo

pueden hablar entre ellos a través de la interface Mediator. El patrón Mediator puede

reducir subclases o en un sistema, porque centraliza el comportamiento de

comunicación en una clase en lugar de distribuirlo entre subclases. Sin embargo, los

esquemas de despacho como este, decrementan la seguridad.

El patrón Chain of Responsibility desacopla el emisor del receptor pasando el pedido a

lo largo de una cadena receptores potenciales. Dado que se fijó la interface entre

emisores y receptores, Chain of Responsibility también podría requerir un esquema de

despacho.

En todos los casos existe una dependencia que se desacopla mediante la generación

de un intermediario. El desacoplamiento se puede visualizar en el diagrama de

secuencia porque es una característica totalmente dinámica.

3.4 Una arquitectura para patrones de diseño basada en Perfiles UML

El uso frecuente del lenguaje UML se presenta como una opción importante para la

especificación de modelos, y en particular, patrones de diseño. Para lograr una mejor

especificación UML ofrece el mecanismo de Perfiles. Este componente posibilita

extender la sintaxis y semántica de UML, de manera de poder expresar los conceptos

específicos de un determinado dominio de aplicación. En este caso se extiende para

definir conceptos utilizados en la representación de Patrones de Diseño posibilitando

de esta forma una clara definición de los mismos.

En los patrones de diseño se observan características generales y otras particulares.

Utilizando perfiles UML se puede generar una estructura general; pero no es posible

precisar una misma semántica para todos los patrones en un único perfil. Se puede

definir características generales en un nivel, características dinámicas en otro y las

particulares en el próximo. Esto se puede concretar en una jerarquía. El establecer

una jerarquía entre niveles de perfiles permite el reúso de definiciones. El resultado

es la estructura de la arquitectura que se encuentra expresada en la figura 3.1.

Page 58: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

50

Figura 3.1: Arquitectura de patrones de diseño.

La arquitectura está compuesta por tres niveles:

1. El Nivel 0 tiene la responsabilidad de proveer las estructuras más usadas para

todos los patrones de diseño. Posee las características comunes de todos los perfiles

de patrones y puede ser reutilizado por los otros niveles. En este nivel se describen los

elementos usados en cada uno de los diagramas presentados para la descripción de

un modelo. Se verifica la buena formación de dichos elementos. Por ejemplo se

verifica que los elementos posean un nombre.

2. El Nivel 1 se inspira en el catálogo GoF [1], y provee un perfil por cada clasificación

por propósito, estructurales (Perfil Estructural), creacionales (Perfil Creacional), y de

comportamiento (Perfil de Comportamiento). El perfil de patrones de comportamiento

verifica la consistencia, entre el comportamiento representado por los diagramas de

secuencia y la estructura representada por los diagramas de clases.

3. El Nivel 2 es el nivel inferior de este modelo, compuesto por los perfiles individuales

para cada patrón. Se describen en este nivel las características particulares. Cada

uno de los patrones en el nivel 2 utiliza los elementos definidos en los niveles

anteriores (niveles 0 y 1). Cuando se incluye un nuevo patrón, se define un nuevo

perfil, y cada perfil agregado tiene su sintaxis y semántica particular. Pero todos

absorberán la estructura genérica del nivel anterior.

Page 59: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

51

Los niveles 0 y 1 de la arquitectura están construidos cada uno en su propio perfil que

se aplican a los perfiles del nivel 2.

Con la definición de restricciones y estereotipos se busca verificar que se cumplen los

estándares de diseño. Al marcar los modelos es posible prepararlos para su

implementación o su transformación en otro modelo.

3.4.1 Metodología

En el primer nivel (nivel 0) se verifican las estructuras elementales construyendo reglas

bien formadas para los diagramas de clase. De esta manera se comprueba que la

base del modelo es sólida para los elementos estructurales de las características

estáticas.

El nivel 1 se basa en la clasificación GoF, conteniendo un perfil por cada clasificación:

Estructural, Creacional y de Comportamiento. En esta tesis se generó un perfil de

comportamiento. Este perfil contiene estereotipos asociados a restricciones, que

verifican la consistencia entre los diagramas de secuencia (vista dinámica) y de clase

(vista estructural). La consistencia de aspectos dinámicos respecto de aspectos

estáticos asegura que los objetos sean bien formados al ejecutarse.

En el nivel 2 se creó un perfil por cada patrón particular, de manera de verificar las

características individuales del patrón, por ejemplo: clases participantes junto a su

comportamiento, definiendo sus operaciones obligatorias y su secuencia de

comunicación.

3.4.2 Técnica para definir el perfil de un patrón particular

Para incorporar un nuevo patrón en al nivel 2 de la estructura, se debe crear un perfil,

conteniendo su sintaxis (estereotipos) y su semántica (restricciones OCL). Dicho perfil

debe importar aspectos de los niveles 0 y 1.

Una técnica para definir un perfil de un patrón particular se resume a continuación:

1. Identificar los participantes principales del patrón, sus relaciones y comportamiento.

2. Importar los niveles 0 y 1.

3. Determinar por cada participante el criterio del estereotipo del cual debe extender.

Se deberá considerar entre otros si el participante es:

Page 60: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

52

- Clase abstracta o concreta, atributo o extremo de asociación.

- Operaciones de ejecución.

4. Imponer restricciones sobre los estereotipos, que verifiquen las especificaciones del

patrón.

5. Verificar el perfil construido a partir de su aplicación a modelos formulados para tal

efecto.

6. Liberar la versión del patrón para su uso

Si bien, la técnica describe la forma de incorporar perfiles en el nivel 2, en todos los

niveles es posible seguir añadiendo nuevos perfiles. En éste caso sólo se han definido

los necesarios para ajustarse a lo establecido en GoF, pero la arquitectura es

compatible para incorporar otros patrones de diseño, tales como patrones de

arquitecturas [69].

Para definir estereotipos en estos niveles se crea un estereotipo que se extiende con

alguna metaclase del metamodelo UML. Si se quiere utilizar en el nivel 1 un

estereotipo del nivel 0, se puede importar como se hizo en el paso 2 de esta sección.

Ver Anexo C.

Page 61: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

53

CAPITULO IV

Perfil de Patrones Genérico

El perfil de patrones genérico presenta los formalismos necesarios para la

especificación de la estructura de los patrones de diseño. Los aspectos estructurales

describen elementos del diseño orientado a objetos: clasificadores, clases, atributos,

operaciones. Estos aspectos estructurales se plasman a través de estereotipos

creados para ese fin.

El nivel 0 de la arquitectura es la raíz de una jerarquía de paquetes. Cada paquete

contiene un perfil integrado por estereotipos que documentan los formalismos. Este

capítulo está dividido en dos partes. En la primera parte se definen los elementos del

metamodelo UML utilizados. En la segunda parte se presentan los estereotipos del

nivel 0 y las restricciones que verifican las reglas de buena formación de los elementos

estereotipados.

4.1 Conceptos Introductorios

4.1.1 Elementos del metamodelo UML utilizados

Los elementos del metamodelo UML representan una base para los estereotipos

creados en la arquitectura. Para construir un perfil se emplean las metaclases del

metamodelo UML: Class, Interface, Operation, etc. [7].

En una expresión OCL lo primero que se define es un contexto. Un contexto es un

conjunto de elementos cuyo tipo puede ser: Class, Interface, etc. La expresión incluye

a todas las instancias del conjunto definido por la metaclase (Class, Interface, etc.).

Page 62: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

54

Figura 4.1: Fragmento del metamodelo UML: características estructurales.

En la figura 4.1 se muestra un fragmento del metamodelo UML con los formalismos

definidos en la especificación UML. Se representan allí las construcciones

estructurales aplicadas por los diagramas de clases. En el gráfico se puede observar

cómo están relacionados los elementos, por tres tipos de relaciones: generalización

(elementos más generales son heredados por elementos más específicos, es decir,

son padres de), composición (los elementos de los cuales parte un rombo están

constituidos por los elementos del extremo opuesto) y asociación bidireccional donde

los elementos colaboran entre sí. En este caso se muestra una clase y sus

componentes. Un elemento Class se deriva de un Classifier. Se compone de

operaciones y properties. Existe una relación de composición desde Class hacia

Property y hacia Operation. El elemento Property es una característica estructural. Una

Page 63: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

55

Association contiene dos extremos. El elemento Property representa un atributo de un

elemento Class o un extremo de un elemento Association. Class está asociado a

través de ownedattributes con Property, es decir, la cantidad de atributos de Class

está determinada por ownedattributes. Association está asociado a Property a través

de memberEnd.

Figura 4.2: Fragmento del metamodelo UML Interfaces.

Interface (figura 4.2) es un tipo de clasificador que contiene properties de tipo extremo

y operaciones abstractas.

Page 64: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

56

Para crear el perfil del nivel 0 se emplean los elementos descriptos en el párrafo

anterior. Se extienden dichas metaclases, a través de estereotipos para generar

elementos más específicos en un metamodelo. Un ejemplo de representación de

metaclases se ilustra en la figura 4.3, a través de la metaclase Class que contiene

atributos y operaciones esquematizadas con el software RSA [6].

Figura 4.3: Metaclase Class.

Una metaclase es un elemento del metamodelo UML que define una clase con

atributos y operaciones.

4.2 Descripción de elementos nivel 0

Este nivel es la base estructural de la arquitectura y se compone de un patrón genérico

que contiene estereotipos y sus restricciones asociadas.

4.2.1 Estereotipos

El patrón genérico se compone de cinco estereotipos: patternPackage,

patternClassifier, patternClass, patternOperation, patternProperty, que extienden

las metaclases del metamodelo UML. Como se explicó en el capítulo II una metaclase

es un elemento de metamodelado que sirve para definir una clase con atributos y

operaciones.

Figura 4.4: Estereotipos para modelos estáticos.

Page 65: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

57

En la Figura 4.4 se muestran los estereotipos patternPackage, patternClassifier,

patternClass, patternProperty y patternOperation que extienden las metaclases

Package, Classifier, Class, Operation y Property. Los estereotipos contienen las

operaciones y propiedades de la metaclase extendida.

La metaclase extendida establece el ámbito de aplicación del estereotipo. Esto quiere

decir que, por ejemplo, un estereotipo que extiende la metaclase Class se podrá

aplicar solo a elementos de tipo clase. Se verifica en este dominio que los elementos

del patrón estén bien formados.

A continuación se describen los estereotipos mencionados:

patternPackage: Este estereotipo extiende la metaclase Package. Incluye

restricciones acerca de la buena formación de los elementos del patrón, como que

tengan nombre, visibilidad.

patternClassifier: Extiende la metaclase Classifier que representa una metaclase

abstracta. Los elementos etiquetados con este estereotipo simbolizan una clase

abstracta o una interface.

patternClass: Extiende la metaclase Class. Esta metaclase define una clase concreta,

es decir que implementa operaciones. En el caso de la arquitectura su objetivo es

implementar aspectos abstractos definidos en un elemento etiquetado como

patternClassifier. Puede implementar las operaciones de una clase abstracta o realizar

las operaciones de una interface.

patternProperty: Extiende la metaclase Property. Dicha metaclase hace referencia a

un atributo de una clase o a un extremo de una asociación.

patternOperation: Extiende la metaclase Operation. Esta metaclase especifica el

comportamiento asociado a un clasificador.

Page 66: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

58

4.2.2 Restricciones en lenguaje OCL

Las restricciones en lenguaje OCL, formuladas en el nivel 0, permiten comprobar la

buena formación de los elementos de un patrón. Se chequea por ejemplo que los

atributos posean nombre y visibilidad, o que los clasificadores sean de tipo interface o

clase abstracta.

Restricción 1: Buena formación de properties

Context PerfilNivel0::patternPackage

Class.allInstances().attribute->

forAll(atributo|(atributo.visibility=uml::VisibilityKind::

private or atributo.visibility = uml::VisibilityKind::protected)

and atributo.name<>''and atributo.type.oclIsTypeOf(OclVoid)->

forAll(tipo|tipo=false))

Descripción: Se verifica que todas las properties del paquete contengan visibilidad

privada o protegida y su nombre sea distinto de blanco. Además se verifica que las

etiquetas de los tipos para todas las propiedades (properties) sean distintas de blanco.

Utilización: Es una regla de buena formación para los atributos de las clases del

modelo y extremos de asociaciones.

Nota: Para cumplir el principio de encapsulación de la orientación a objetos los

atributos deben ser privados. Pero en caso de herencia los atributos son de tipo

“protected”.

Restricción 2: Buena formación de Operaciones

Context PerfilNivel0::patternPackage

Operation.allInstances()-> forAll(Operacion|Operacion.name<>''

and Operacion.visibility<>null)

Descripción: Se verifica que las operaciones del paquete contengan un nombre y una

visibilidad.

Utilización: Es una regla de buena formación para operaciones del modelo.

Restricción 3: Buena formación de clases abstractas

Context PerfilNivel0::patternPackage

Class.allInstances()->

select(isAbstract=true).attribute.visibility->

Page 67: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

59

forAll(visibilidad|visibilidad=uml::VisibilityKind::

protected)

Descripción: Se verifica que las clases abstractas contengan solo atributos de tipo

“protected”.

Utilización: Es una regla de buena formación para los elementos abstractos del

modelo.

Nota: Para cumplir el principio de encapsulación de la orientación a objetos los

atributos en caso de herencia deben ser de tipo “protected”.

Restricción 4: Buena formación de clases concretas

Context PerfilNivel0::patternPackage

let clases: OrderedSet(Class)=Class.allInstances()->

select(isAbstract=false) ->asOrderedSet() in

clases.attribute.visibility->

forAll(visibilidad|visibilidad=uml::VisibilityKind::

private) and

clases.ownedOperation->select(isAbstract<>true)->notEmpty()

Descripción: Se verifica que las clases concretas contengan solo atributos de tipo

“private” y sus operaciones sean concretas.

Utilización: Es una regla de buena formación para las clases concretas.

Restricción 5: Buena formación de operaciones de Interfaces

Context PerfilNivel0::patternPackage

Interface.allInstances()->notEmpty()

implies

Interface.allInstances().ownedOperation->

select(isAbstract<>false)->notEmpty()

Descripción: Se verifica que las interfaces solo contengan operaciones abstractas.

Utilización: Es una regla de buena formación para las interfaces.

Page 68: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

60

Restricción 6: Buena formación de relaciones de herencia

Context PerfilNivel0::patternPackage

Classifier.allInstances().generalization->

forAll(c|

if c.general.oclIsTypeOf(Interface)=true then

c.specific.oclIsTypeOf(Interface)

else

c.specific.oclIsTypeOf(Class)

endif)

Descripción: Se verifican las relaciones de generalización. Si el extremo general es de

tipo interface entonces el extremo de la clase específica debe ser una clase o una

interface. Si el extremo general no es una interface entonces el extremo de la clase

específica es de tipo clase.

Utilización: Permite verificar la relación de generalización de un clasificador.

Restricción 7: Buena formación sin herencia múltiple – Precaución de uso

Context PerfilNivel0::patternClass

self.general()->size()<=1

Descripción: Se verifican las relaciones de generalización, que una clase herede sólo

de una superclase.

Utilización: Permite verificar la relación de generalización de un clasificador.

Restricción 8: Buena formación de relaciones de implementación

Context PerfilNivel0::patternPackage

InterfaceRealization.allInstances().source->

forAll(oclIsTypeOf(Class)=true)

Descripción: Se verifica que las relaciones de realización de interface tengan como

fuente una clase.

Utilización: Permite verificar la implementación de una interface.

Page 69: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

61

Restricción 9: Definición de operaciones abstractas en una clase abstracta

deben ser implementadas en una clase concreta.

Context PerfilNivel0::patternPackage

let operacionesAbstractasPadre : Set(Operation)=

Class.allInstances()->select(clasesHijas|

clasesHijas.isAbstract=false).general().getAllOperations()

-> select(isAbstract=true)->asSet(),

OperacionesConcretasHijo : Set(Operation) =

Class.allInstances()->select(clasesHijas|

clasesHijas.isAbstract=false and

clasesHijas.general()->notEmpty()).ownedOperation->

select(isAbstract=false)->asSet()

in

(operacionesAbstractasPadre->

select(o1|OperacionesConcretasHijo-> exists(o2|o1.name=o2.name

and o1.ownedParameter.name=o2.ownedParameter.name and

o1.ownedParameter.type.name=o2.ownedParameter.type.name)).

name>intersection(operacionesAbstractasPadre.name))=

operacionesAbstractasPadre.name

Descripción: Esta restricción verifica que una operación abstracta contenga una

operación concreta que la implemente y que la operación concreta contenga los

mismos parámetros y el mismo nombre.

Utilización: Permite verificar la implementación de las operaciones abstractas.

Restricción 10: Definición de operaciones abstractas en una interfaz deben ser

implementadas en una clase concreta.

Context PerfilNivel0::patternPackage

let

operacionesAbstractasPadre : Set(Operation)=

Class.allInstances()-> select(clasesHijas|

clasesHijas.isAbstract=false).interfaceRealization.contract.

ownedOperation->asSet(),

OperacionesConcretasHijo : Set(Operation) =

Class.allInstances()->select(clasesHijas|

clasesHijas.isAbstract=false

and clasesHijas.interfaceRealization.contract->

notEmpty()).ownedOperation->select(isAbstract=false)-> asSet()

in

(operacionesAbstractasPadre->

select(o1|OperacionesConcretasHijo->

Page 70: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

62

exists(o2|o1.name=o2.name

and o1.ownedParameter.name = o2.ownedParameter.name and

o1.ownedParameter.type.name = o2.ownedParameter.type.name

and o1.ownedParameter.direction =

o2.ownedParameter.direction)).name->

intersection(operacionesAbstractasPadre.name))=

operacionesAbstractasPadre.name

Descripción: Esta restricción verifica que una operación abstracta sea implementada

correctamente, garantizando la existencia de sus parámetros y su signatura.

Utilización: Permite verificar la implementación de las operaciones abstractas.

Restricción 11: Buena formación del clasificador

Context PerfilNivel0::patternClassifier

(self.oclIsTypeOf(Class)and self.isAbstract) or

self.oclIsTypeOf(Interface)

Descripción: Se verifica que el tipo clasificador sea una clase abstracta o una interface.

Utilización: Verifica los elementos estereotipados como patternClassifier.

Restricción 12: Buena formación de estereotipo patternClass

Context PerfilNivel0::patternClass

self.isAbstract=false

implies

self.ownedOperation->forAll(isAbstract=false)

Descripción: En esta restricción un elemento estereotipado como patternClass, debido

a que es una clase concreta no permite la creación de métodos abstractos.

Utilización: Verifica los elementos estereotipados como patternClass.

Page 71: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

63

Restricción 13: Buena formación de estereotipo patternClassifier

Context PerfilNivel0::patternClassifier

self.oclIsTypeOf(Interface)

implies

self.getAllOperations()->forAll(isAbstract=true)

Descripción: En esta restricción una interface estereotipada como patternClassifier y

es una interface no permite la creación de métodos concretos.

Utilización: Verifica que los elementos estereotipado como patternClassifier.

Page 72: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

64

Page 73: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

65

CAPITULO V

Perfil de Comportamiento

El presente capítulo establece las definiciones para describir la dinámica de los

patrones de diseño. Los aspectos comportamentales definen al modelo en

funcionamiento, es decir, las características en tiempo de ejecución. Se estudia en

este nivel las interacciones construidas a partir de elementos tales como: invocaciones

de operaciones, ejecución de comportamientos, líneas de vida.

Este perfil de comportamiento se construyó en base a la clasificación de patrones del

catálogo GoF [1] que contiene las características de comportamiento.

Algunos de los problemas que solucionan estos patrones, respecto de la dinámica de

un sistema, son: la baja reusabilidad y las dificultades surgidas en el mantenimiento de

un sistema. Para aumentar la reusabilidad y la calidad de los sistemas se generaron

instrumentos como la encapsulación de objetos, el desacoplamiento, la inversión de

dependencia, la distribución de la comunicación.

El perfil de patrones genérico presenta los formalismos necesarios para la

especificación de la estructura de los patrones de diseño. Los aspectos estructurales

describen elementos del diseño orientado a objetos: clasificadores, clases, atributos,

operaciones. Estos aspectos estructurales se plasman a través de estereotipos

creados para ese fin.

El nivel 1 de la arquitectura contiene un Perfil integrado por estereotipos que verifican

la consistencia de los patrones de comportamiento. Este capítulo está dividido en dos

partes. En la primera parte se definen los elementos del metamodelo UML utilizados.

En la segunda parte se presentan los estereotipos del nivel 1 y las restricciones que

verifican las reglas de buena formación de los elementos estereotipados.

Page 74: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

66

5.1 Conceptos Introductorios

5.1.1 Elementos del metamodelo UML utilizados

Los elementos del metamodelo UML son el cimiento para los estereotipos de un perfil.

En este caso se emplea la metaclase interacción para construir el perfil de

comportamiento [7].

Figura 5.1: Fragmento del metamodelo - Características dinámicas.

En la figura 5.1 se muestra un fragmento del metamodelo UML con la especificación

de algunas de las características dinámicas de un modelo en UML. Dentro de los

elementos mostrados podemos mencionar:

Interaction: Una interacción representa la comunicación entre objetos. Se presenta

toda la secuencia de llamadas a operaciones, de donde se obtienen las

responsabilidades claramente.

Behavior: Representa un comportamiento básico, una interacción hereda sus

elementos. Una interacción contiene varios fragmentos de interacción

(InteractionFragment), de los que hereda también propiedades.

InteractionFragment: Representa la unidad más básica de una interacción. Sus tipos

pueden ser una interacción (interaction), una ejecución de especificación

(ExecutionSpecification) o una ocurrencia de especificación (OcurrenceSpecification).

Page 75: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

67

ExecutionSpecification: Hereda las propiedades de interactionFragment y representa

un periodo en la vida del participante (en la línea de vida) donde se:

- Ejecuta una acción (unidad de comportamiento)

- Se envía una señal a otro participante

- Se espera un mensaje de respuesta de otro participante

Figura 5.2: Fragmento del metamodelo de UML - Líneas de vida.

OcurrenceSpecification: Indica el comienzo o final de la ejecución de una ejecución

de la especificación (ExecutionSpecification).

Lifeline: Una línea de vida representa un participante de una interacción. Dicho

participante puede ser un objeto o un actor. Una interacción puede contener varias

líneas de vida (lifeline). Una línea de vida es parte de un interactionFragment. Las

líneas de vida representan los objetos presentes en la interacción (figura 5.2).

A continuación se describe el elemento que da vida al diagrama de secuencia: el

mensaje y sus componentes (figura 5.3).

Page 76: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

68

Figura 5.3: Fragmento del metamodelo de UML - Mensajes.

Message: una interacción contiene mensajes para representar la comunicación entre

los distintos objetos (lifeline) del diagrama. Están compuestos por dos extremos: el

evento de envío del mensaje (SendEvent) y el de recepción del mensaje

(ReceiveEvent).

MessageEnd: Es el extremo de un mensaje e involucra los eventos: SendEvent y

ReceiveEvent.

Un mensaje puede perderse en el camino o recibirse completo, eso se ve

representado en la enumeración MessageKind. Para definir la forma de transmisión de

un mensaje se emplea la enumeración MessageSort con dos literales síncrona o

asíncrona por ejemplo.

Page 77: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

69

5.2 Descripción de elementos nivel 1

En una secuencia como la que se presenta en un diagrama de interacción existen dos

puntos de vista principales: las interacciones por sí misma y el orden de los mensajes

de las llamadas a las operaciones. Este nivel describe estos rasgos de

comportamiento mediante los estereotipos que se describen a continuación.

Figura 5.4: Estereotipos de comportamiento de un modelo.

Se crearon dos estereotipos patternInteraction y patternOcurrence. El estereotipo

patternInteraction simboliza características de las interacciones. El estereotipo

patternOcurrence simboliza las ocurrencias de especificación. Los estereotipos se

muestran en la figura 5.4. Se importó el nivel 0 para poder adquirir las reglas de buena

formación formuladas tanto para el paquete como para las operaciones. A su vez se

recurrió a dos metaclases para agregar aspectos de comportamiento a los

estereotipos. El ámbito de aplicación en este caso es doble para cada estereotipo ya

que el estereotipo toman el ámbito de las metaclases y heredan los ámbitos de los

estereotipos planteados en el nivel 0 como se describe a continuación.

5.2.1 Estereotipos

patternInteraction: Este estereotipo permite verificar la consistencia entre el diagrama

de secuencia y el diagrama de clases, aspecto necesario para el funcionamiento del

patrón. Además se verifica la consistencia del paquete que implica la buena formación

de elementos.

patternOccurrence: Este estereotipo hereda aspectos estructurales del estereotipo

patternOperation del nivel 0. De esta manera se pueden estereotipar las operaciones

del diagrama de clases, bajo su ámbito. A su vez extiende la metaclase

OcurrenceSpecification lo que permite estereotipar tanto el comienzo como el final de

cada ejecución de comportamiento y verificar el orden de ejecución de las operaciones

dentro del comportamiento.

Page 78: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

70

5.2.2 Restricciones definidas en OCL

Con estas restricciones se comprueban las características del perfil y la consistencia

entre los diagramas del modelo, a saber, diagrama de clases y diagrama de

secuencia.

Restricción 14: Verifica líneas de vida en Interacciones

Context PerfilNivel1::patternInteraction

Lifeline.allInstances().represents.type->

forAll(lineaDevida| Class.allInstances()->

exists(clase|clase.name=lineaDevida.name))

Descripción: Se verifica que el conjunto de las líneas de vida está simbolizado por un

objeto. Este objeto debe ser de un tipo representado en el diagrama de clases.

Utilización: Regla de consistencia entre el diagrama de clases y el diagrama de

secuencia.

Restricción 15: Verifica existencia de Orden General.

Context PerfilNivel1::patternInteraction

GeneralOrdering.allInstances()->notEmpty()

Descripción: Debe existir por lo menos un orden general.

Utilización: Verifica que exista por lo menos una secuencia de ordenamiento.

Restricción 16: Verifica consistencia de ejecución de operaciones.

Context PerfilNivel1::patternInteraction

(BehaviorExecutionSpecification.allInstances().finish.getApplied

Stereotypes()->size()+ Message.allInstances()->

select(m|m.messageSort=uml::MessageSort::createMessage).signatur

e.getAppliedStereotypes()->asSet()-> size())=

(Class.allInstances()->select(o|o.oclIsTypeOf(Class) and

o.isAbstract=false)).ownedOperation.getAppliedStereotypes()

->size()

Descripción: Las ejecución de comportamiento a las que se les aplicó estereotipos

sumados a los mensajes de creación del diagrama de secuencia deben ser en

cantidad igual a la cantidad de operaciones estereotipadas en el diagrama de clases.

Todas las operaciones estereotipadas deben ejecutarse en el diagrama de secuencia.

Page 79: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

71

Utilización: Verifica la consistencia entre el diagrama de clases y el diagrama de

secuencia.

Restricción 17: Verifica consistencia de mensajes.

Context PerfilNivel1::patternInteraction

Message.allInstances().signature->

forAll(operacion|operacion.visibility=

uml::VisibilityKind::public)

Descripción: Las llamadas de mensajes solo pueden realizarse a operaciones cuya

visibilidad sea pública.

Utilización: Verifica la consistencia entre el diagrama de clases y el diagrama de

secuencia.

Restricción 18: Verifica consistencia de mensajes y operaciones.

Context PerfilNivel1::patternInteraction

Message.allInstances()->asSet()->

forAll(iteradorMensaje|Operation.allInstances()->

exists(iteradorOperacion|iteradorMensaje.name=iteradorOperacion.

name))

Descripción: Dentro del conjunto de mensajes existentes en la interacción los mismos

deben corresponderse con las operaciones del diagrama de clases.

Utilización: Verifica la consistencia el diagrama de clases y el diagrama de secuencia.

Page 80: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

72

Page 81: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

73

CAPITULO VI

Perfil Patrones Particulares

En el presente capítulo se representan las definiciones para patrones de

comportamiento particulares. Se creó un paquete por cada perfil particular. Para

especificar sus características estructurales se importa el perfil del nivel 0. Para sus

características dinámicas se importa el perfil del nivel 1. Así el patrón queda

conformado por una combinación de estereotipos de ambos niveles que sirven como

base para su especificación.

La presentación de cada patrón incluye una parte teórica en forma de plantilla que

contiene sus características estáticas (descripción general, clasificación, participantes)

y se definen los estereotipos estructurales.

Luego se explica su comportamiento a través de un diagrama de secuencia con su

estereotipo correspondiente. Finalmente se enumeran sus consecuencias.

Los estereotipos estructurales extienden los estereotipos del nivel 0, que representan

características estáticas a través de: clasificadores, atributos, operaciones y

properties. Los estereotipos comportamentales extienden los estereotipos del nivel 1

para describir sus operaciones, interacciones y su secuencia de ejecución. La

verificación de los estereotipos se concreta a través de restricciones en lenguaje OCL.

Se verifica mediante estas restricciones que cada perfil cumpla con sus

particularidades, corroborando los estereotipos que contiene un modelo: clases,

clasificadores, operaciones y atributos. Por otro lado se verifica la consistencia entre

los diagramas de clases y de secuencia para un determinado modelo.

Page 82: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

74

6.1 Patrón Observer

6.1.1 Descripción General

Se representa una dependencia entre objetos. Subject es el tipo de objeto del cual

dependen los objetos tipo Observer, por lo cual necesitan estar informados de un

cambio en el estado del objeto tipo Subject, (figura 6.1).

Figura 6.1: Diagrama de clases Patrón Observer.

- Clasificación

Patrón de comportamiento y de objeto.

- Participantes

- Subject:

Tiene una lista de referencia hacia sus observadores.

Provee métodos para agregar y de desagregar observadores.

Notifica a los observadores cuando un cambio en su estado ocurre.

- Observer:

Provee la interfaz para actualizar el estado del sujeto en los observadores,

cuando es notificado por “Subject”.

- ConcreteSubject:

Implementa la clase “Subject”.

Page 83: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

75

- ConcreteObserver:

Contiene una referencia a objetos “ConcreteSubject”.

Implementa la clase “Observer”.

- Comportamiento

El comportamiento, visto como una secuencia de pasos, se representa en este trabajo

por un diagrama de secuencia. Existe un actor que genera el comienzo de la ejecución

y que está definido dentro del Sistema. Los participantes del patrón están

representados por objetos en forma de líneas de vida. Los objetos “ConcreteObserver”

se agregan a la lista de observadores. Se cambia el estado en el Sujeto lo que

desencadena la señal de cambio de estado que invoca la operación “ notify” (figura

6.2).

Page 84: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

76

Figura 6.2: Diagrama de secuencia Patrón Observer.

La notificación desencadena el llamado a la operación update en los observadores,

que actualiza el atributo “State” de cada observador concreto. Los observadores

pueden desagregarse de la lista en el momento en que lo requieran mediante la

operación “detach”.

Page 85: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

77

El patrón Observer permite variar la cantidad de subjects y observers

independientemente. Se puede reusar subjects sin reusar sus observers, y vice versa.

Permite agregar observers sin modificar el subject u otros observers.

- Consecuencias

1. Acoplamiento abstracto entre Subject y Observer. Todos los subjects conocen la

lista de observers, cuya interface está definida por la clase Observer. El subject no

conoce la clase concreta de un observer. El acoplamiento entre subject y observers es

mínimo.

2. Soporte para la comunicación broadcast. La notificación que un sujeto envía no

necesita especificar su receptor. La notificación es un broadcast automático a todos

los objetos interesados que lo suscriben. Esto hace que se puedan agregar o remover

observers en cualquier momento. Depende del observer manejar o ignorar una

notificación.

3. Actualizaciones inesperadas. Porque los observers no tienen conocimiento de la

presencia de los otros. Una operación inofensiva en el sujeto puede causar una

cascada de actualizaciones a los observers y sus objetos dependientes. El criterio de

dependencia, si no está bien definido o mantenido produce actualizaciones espurias,

de las que puede ser duro volver atrás.

6.1.2 Descripción de elementos nivel 2 – Patrón Observer Estereotipos

A partir del diagrama de clases de la figura 6.1 se elaboraron los estereotipos

estructurales del patrón. Se importan los estereotipos del nivel 0 que permiten

especificar sus participantes de los cuales se puede heredar sus atributos,

operaciones y restricciones: patternClassifier, patternClass, patternProperty (figura

6.3).

Page 86: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

78

Figura 6.3: Características estructurales y dinàmicas del Patrón Observer.

ObserverConsistency: Hereda las características de patternInteraction, lo que

garantiza su consistencia entre el diagrama de clases y el diagrama de secuencia. Es

un estereotipo que permite verificar que existan los elementos obligatorios del patrón y

que dichos elementos contengan los aspectos incluidos en la definición del mismo.

Observer y Subject: Heredan las características de patternClassifier, lo que los

configura como elementos abstractos. Y representan los actores principales del patrón,

por ende el perfil.

ConcreteObserver y ConcreteSubject: Heredan las características de patternClass.

Y representan las implementaciones de los aspectos abstractos en clases concretas a

través de la implementación de las operaciones ya definidas en las abstracciones

Observer y Subject.

State: Este estereotipo describe el estado del Sujeto que debe figurar del lado del

Sujeto como del lado de los observadores. Se deben etiquetar por tanto el sujeto y los

observadores.

Del nivel 1 se importan los estereotipos: patternInteraction y patternOccurrence. Como

se vio en el nivel 1 patternInteraction hereda características de patterpackage y

extiende la metaclase Interaction. Y patternOcurrence hereda características de

patternOperation y extiende características de la metaclase OcurrenceSpecification.

Los estereotipos patternInteraction y patternOccurrence permiten verificar

características dinámicas del patrón, tanto desde la interacción como desde las

Page 87: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

79

ocurrencias de especificación. Las ocurrencias de especificación simbolizan el punto

de comienzo y final para la ejecución de comportamiento de una operación.

Los estereotipos attach, notify, update, detach, setState y getState heredan las

características del estereotipo patternOcurrence. Este estereotipo les permite

estereotipar tanto operaciones como especificaciones de ocurrencia. Se puede

especificar aspectos de operaciones como la secuencia de su ejecución.

attach y detach : Son estereotipos definidos para etiquetar las operaciones que

agregan y eliminan elementos de la lista de observadores.

notify : Es un estereotipo que etiqueta una operación que notifica a los observadores

de un cambio de estado.

update: Es un estereotipo que etiqueta una operación que actualiza en los

observadores el cambio de estado de Subject.

setState: Permite cambiar el estado observado en el Concrete Subject.

getState : Permite obtener el estado del Subject para actualizarlo en el observador.

6.1.3 Restricciones definidas en OCL para Observer

Las restricciones se aplican para verificar el perfil Observer comprobando la existencia

de las asociaciones y composiciones entre los elementos estereotipados como Subject

y Observer, y entre los elementos estereotipados como ConcreteSubject y

ConcreteObserver. También se comprueba que los estereotipos Observer y Subject

contengan los atributos y operaciones que deben contener por definición. Respecto de

su comportamiento se comprueba su consistencia y secuencia de ejecución.

Restricción 19: El perfil debe contener estereotipos de los participantes del

patrón: Subject, Observer, ConcreteObserver y ConcreteSubject.

Context PerfilObserver::ObserverConsistency

let TotalEstereo : Set(String) =

self.allOwnedElements().getAppliedStereotypes().name->asSet(),

ConjuntoEstereo : Set(String)=

Set{'Observer','ConcreteObserver','Subject','ConcreteSubject'}->

asSet()

in

ConjuntoEstereo->forAll(e1| TotalEstereo->exists(e2|e1=e2))

Page 88: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

80

Descripción: Se comprueba la existencia de los estereotipos definidos a partir de los

participantes del patrón. Dado el conjunto de los elementos estereotipados, se

comprueba la existencia de aquellos cuyo nombre sea Subject, Observer,

ConcreteObserver o ConcreteSubject.

Utilización: Se verifica que los participantes del patrón estén representados en el

modelo.

Restricción 20: El patrón debe contener una relación de asociación entre los

estereotipos ConcreteSubject y ConcreteObserver.

Context PerfilObserver::ObserverConsistency

Association.allInstances().memberEnd->

select(m|m.isNavigable()=true

and m.type.getAppliedStereotypes()->

select(name='ConcreteSubject')->

notEmpty()).class.getAppliedStereotypes()->

select(name='ConcreteObserver')->notEmpty()

Descripción: Dado el conjunto de los extremos de asociación, se selecciona aquellos

que son navegables, es decir, están dirigidos y el tipo al que apunta tiene aplicado el

estereotipo ConcreteSubject, el extremo no dirigido tiene aplicado el estereotipo como

ConcreteObserver.

Utilización: Se verifica que las relaciones de asociación estén representadas en el

modelo.

Restricción 21: El patrón debe contener una relación de asociación entre el

estereotipo ConcreteSubject y Observer o entre el estereotipo Subject y

Observer.

Context PerfilObserver::ObserverConsistency

Association.allInstances().memberEnd ->

select(m|m.aggregation=uml::AggregationKind::none

and m.type.getAppliedStereotypes()->

select(name='Observer') ->

notEmpty()).class.getAppliedStereotypes()->

select(name='ConcreteSubject' or name='Subject')-> notEmpty()

Descripción: Dado el conjunto de los extremos de asociación se selecciona aquellos

cuyo tipo de agregación es simple, y el tipo al que apunta tiene aplicado el estereotipo

Page 89: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

81

Observer, el extremo tiene aplicado el estereotipo Subject o el estereotipo

ConcreteSubject.

Utilización: Se verifica que las relaciones de asociación estén representadas en el

modelo.

Restricción 22: El perfil debe contener estereotipos de las operaciones que fijan

y configuran el valor del estado del sujeto: setState, getState.

Context PerfilObserver::ConcreteSubject

let TotalEstereo : Collection(String) =

self.allOwnedElements().getAppliedStereotypes().name,

ConjuntoEstereo : Collection(String)=

Set{'setState','getState'}

in

TotalEstereo->exists(e1| ConjuntoEstereo->exists(e2|e1=e2))

Descripción: Se comprueba la existencia de los estereotipos que manejan el estado

del Sujeto. Dado el conjunto de los elementos estereotipados se selecciona aquellos

cuyo nombre de estereotipo es setState y getState.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 23: El elemento estereotipado como Subject debe contener

operaciones estereotipadas como attach, detach y notify.

Context PerfilObserver::Subject

let TotalEstereo : Collection(String) =

self.allOwnedElements().getAppliedStereotypes().name,

ConjuntoEstereo : Collection(String)= Set{'attach','detach',

'notify'} in

TotalEstereo->exists(e1| ConjuntoEstereo->exists(e2|e1=e2))

Descripción: En el elemento estereotipado como Subject existen operaciones a las

cuales se les ha aplicado el estereotipo attach, el estereotipo notify o el estereotipo

detach.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Page 90: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

82

Restricción 24: El elemento estereotipado como Observer debe contener una

operación estereotipada como update.

Context PerfilObserver::Observer

self.getAllOperations().getAppliedStereotypes().name->

includes('update')

Descripción: En el elemento estereotipado como Observer existen operaciones a las

cuales se les ha aplicado el estereotipo update.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 25: El elemento estereotipado como Subject contiene una operación

que contiene como argumento un objeto estereotipado como Observer.

Context PerfilObserver::Subject

self. getAllOperations()->

select(o|o.ownedParameter.type.getAppliedStereotypes()->

select(name='Observer')-> notEmpty()).

getAppliedStereotypes()->

select(name='attach')->size()>=1

Descripción: En el elemento estereotipado como Subject existe una operación con un

parámetro estereotipado como Observer, cuyo estereotipo es attach.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 26: El elemento estereotipado como Subject contiene una operación

detach que contiene como argumento un objeto estereotipado como Observer.

Context PerfilObserver::Subject

self.getAllOperations->

select(o|o.ownedParameter.type.getAppliedStereotypes()->

select(name='Observer')-> notEmpty()).

getAppliedStereotypes()->

select(name='detach')->size()>=1

Page 91: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

83

Descripción: En el elemento estereotipado como Subject existe una operación con un

parámetro estereotipado como Observer, cuyo estereotipo es detach.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 27: Existe un mensaje de llamada a la operación estereotipada como

attach.

Context PerfilObserver::ObserverConsistency

Message.allInstances().signature.getAppliedStereotypes().

getLabel()->includes('attach')

Descripción: Existen mensajes cuyo tipo de operación está estereotipada como attach.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo dinámico.

Restricción 28: Existe un mensaje de llamada a la operación estereotipada como

notify.

Context PerfilObserver::ObserverConsistency

Message.allInstances()->

select(m|m.signature.getAppliedStereotypes().getLabel()->

includes('notify')and

m.connector.end.role.type.getAppliedStereotypes().getLabel()->

includes('ConcreteSubject'))->notEmpty()

Descripción: Dentro del conjunto de mensajes de la interacción, existe por lo menos un

mensaje cuya signatura deriva de una operación estereotipada como notify que se

conecta con una linea de vida cuyo rol es un estereotipo ConcreteSubject.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo dinámico y su receptor sea el adecuado.

Restricción 29: Existe un mensaje de llamada a la operación estereotipada como

update hacia los objetos de tipo Observador.

Context PerfilNivel1::ObserverConsistency

Message.allInstances()->

select(m|m.signature.getAppliedStereotypes().getLabel()->

includes('update')and

m.connector.end.role.type.getAppliedStereotypes().getLabel()->

includes('ConcreteObserver'))-> notEmpty()

Page 92: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

84

Descripción: Dentro del conjunto de mensajes de la interacción, hay un conjunto no

vacío de mensajes cuya signatura está estereotipada como update. Estos mensajes

tienen como receptor el elementos estereotipado como ConcreteObserver.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo dinámico y su receptor sea el adecuado.

Restricción 30: Contiene ocurrencias estereotipadas como attach, setState,

getState y notify dentro del ConcreteSubject.

Context PerfilNivel1::ObserverConsistency

let Ocurrencias: Set(String)=

OccurrenceSpecification.allInstances().getAppliedStereotypes().name

->asSet(),

OcurrenciaOperacion : Set(String)= Set{'setState', 'getState',

'attach', 'notify'}->asSet()

in

OcurrenciaOperacion->forAll(iteradorOcurrenciaOperacion|Ocurrencias->

exists(iteradorOcurrencia|iteradorOcurrenciaOperacion=iteradorOcurrenc

ia))

Descripción: Dentro del conjunto de ocurrencias de especificación existe al menos una

ocurrencia. Para la línea de vida que proviene de una clase estereotipada como

SujetoConcreto existen las ocurrencias estereotipadas como attach, setState, notify y

getState.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas con el estándar del patrón.

Restricción 31: Para la línea de vida que proviene de una clase estereotipada

como ConcreteSubject debe existir una ejecución de comportamiento

estereotipada como attach.

Context PerfilNivel1::ObserverConsistency

Lifeline.allInstances()->

select(l|l.represents.type.getAppliedStereotypes()->

select(name='ConcreteSubject')->notEmpty()).coveredBy->

select(oclIsTypeOf(BehaviorExecutionSpecification))-> notEmpty()

implies

BehaviorExecutionSpecification.allInstances().finish.

getAppliedStereotypes().name-> asSequence()->

exists(n1|n1='attach')

Page 93: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

85

Descripción: Para la línea de vida que proviene de una clase estereotipada como

ConcreteSubject se halla al menos una ocurrencia de especificación. Esto quiere decir,

que se ejecuta al menos una operación. Como consecuencia el comienzo de alguna

de las ejecuciones debe estar estereotipado como attach.

Utilización: Verifica que dentro de las ocurrencias del modelo dinámico exista una

ocurrencia estereotipada como attach.

Restricciones de orden general

Orden General: definición

Un orden general es una relación parcial entre dos ocurrencias de especificación, que

se utiliza para establecer que una ocurrencia de especificación debe ocurrir antes que

otra. De esta manera se puede definir un orden parcial que de otra manera no existiría.

Como UML no cumple órdenes específicos se puede definir un orden a través de

órdenes parciales.

En este caso se puede definir la obligatoriedad de que se cumplan cuatro órdenes

parciales: attach con setState, setState con notify, notify con update y update con

getState (Tabla 6.1).

Orden before after

g1 attach setState

g2 setState notify

g3 notify update

g4 update getState

Tabla 6-1: Orden general Observer.

Restricción 32: Define un orden de ejecución de la secuencia de comandos

attach y setState. Debe existir una ejecución de comportamiento estereotipada

como attach.

Context PerfilNivel1::ObserverConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence()

,go:Sequence(GeneralOrdering)=

GeneralOrdering.allInstances()->asSequence()

in

Page 94: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

86

go->exists(g1| oc->exists(o1,o2|g1.before.name=o1.name and

g1.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='attach')->

notEmpty())

and (o2.getAppliedStereotypes()-> select(name='setState')->

notEmpty())))

Descripción: Dentro de la interacción existe un conjunto de órdenes generales, y un

conjunto de ocurrencias. En la restricción se asignan a dos variables la secuencia de

estos dos conjuntos. Dentro la secuencia de órdenes se encuentra un orden

denominado g1 en esta restricción. Y dentro de este orden se halla una ocurrencia o1

como primer elemento de la secuencia, ya que es elemento etiquetado como before.

Además se encuentra un segundo elemento etiquetado como after, la ocurrencia o2.

En términos simples, o1 debe ir primero y o2 debe ir después. El elemento o1 está

antes que o2 y el elemento o2 está después de o1. Y además esos elementos están

estereotipados por attach y setState.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Restricción 33: Define un orden de ejecución de la secuencia de comandos

setState y notify.

Context PerfilNivel1::ObserverConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence(),

go : Sequence(GeneralOrdering)=

GeneralOrdering.allInstances()->

asSequence()in

go->exists(g2| oc->exists(o1,o2|g2.before.name=o1.name and

g2.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='setState')->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name='notify')->notEmpty())))

Descripción: Se definió un orden general g2 en los mismos términos que g1, pero

describe la secuencia de los elementos: setState y notify.

Page 95: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

87

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Restricción 34: Define un orden de ejecución de la secuencia de comandos

notify y update.

Context PerfilNivel1::ObserverConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence(), go:

Sequence(GeneralOrdering)= GeneralOrdering.allInstances()->

asSequence() in

go->exists(g3| oc->exists(o1,o2|g3.before.name=o1.name and

g3.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='notify')->

notEmpty())

and (o2.getAppliedStereotypes()-> select(name='update')->

notEmpty())))

Descripción: De la misma forma que los ordenes g1 y g2 se puede verificar g3.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Restricción 35: Define un orden de ejecución de la secuencia de comandos

update y getState.

Context PerfilNivel1::ObserverConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()-> asSequence()

, go: Sequence(GeneralOrdering) =

GeneralOrdering.allInstances()-> asSequence()

in

go->exists(g4| oc->exists(o1,o2|g4.before.name=o1.name and

g4.after.name=o2.name implies

(o1.getAppliedStereotypes()-> select(name=’update’)->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name=’getState’)->notEmpty())))

Descripción: De la misma forma que los ordenes g1, g2 y g3 se puede verificar g4.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Page 96: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

88

Restricción 36: Verifica la ejecución de la operación update.

Context PerfilNivel1::ObserverConsistency

OccurrenceSpecification.allInstances()->

exists(o|o.covered.represents.type.getAppliedStereotypes()->

select(name='ConcreteObserver')->notEmpty() implies

o.getAppliedStereotypes()->select(name='update')-> notEmpty())

Descripción: Dentro del conjunto de ocurrencias de especificación existe una

ocurrencia cuya línea de vida proviene de una clase estereotipada como

ConcreteObserver. Como consecuencia, la ocurrencia está estereotipada como

update.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

6.1.4 Aplicación de perfiles a un caso de estudio del Observer

En esta sección se muestra la aplicación de los perfiles particulares, definidos para

patrones de diseño, a casos de estudio. Se construyeron diagramas de clase para

todos los ejemplos presentados. En el caso del comportamiento se utilizaron

diagramas de secuencia para representar las interacciones entre objetos existentes.

Una vez definido el modelo se aplicó el perfil, para lo cual se siguió el procedimiento

explicado en el capítulo III, sección 3.4.2. El próximo paso es estereotipar los

elementos del modelo y verificar que se cumplan las restricciones. En ambos

diagramas se aplican los estereotipos estructurales y de comportamientos según

corresponda. Posteriormente se verifica el modelo de acuerdo a las características

correspondientes a cada patrón.

A continuación se presentan los casos ejemplo para los patrones de comportamiento.

Caso Ejemplo Patrón Observer

En este caso particular se toma como ejemplo la dinámica de devolución de libros en

una Biblioteca. El propósito de este caso de estudio, es desencadenar los procesos

necesarios, en caso que el libro sea devuelto en mal estado. Las áreas interesadas

son notificadas para realizar la actualización del estado del libro. El proceso comienza

cada vez que un lector devuelve un libro. Si el lector devolvió el libro dañado entonces

la aplicación avisa a las clases: Stock, Compras y Administración, que se ven

Page 97: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

89

afectadas por este hecho. Cada vez que el libro se devuelve en mal estado se crea un

objeto de tipo AlarmaLibro, que representa el Subject del patrón. Y las clases Stock,

Compras y Administración se convierten en observadoras de la clase AlarmaLibro, que

tiene la responsabilidad de notificarles el mal estado del libro. Para poder recibir esta

notificación las clases deben suscribirse como observadoras, suscripción de la cual

pueden desagregarse posteriormente. En la figura 6.4 se puede ver el diagrama de

clases con la aplicación de los estereotipos del perfil definido anteriormente.

Figura 6.4: Diagrama de clases ejemplo Biblioteca.

Los estereotipos Subject y ConcreteSubject se aplican respectivamente a Alarma y

AlarmaLibro, que los representan dentro del ejemplo. Se estereotipan también sus

operaciones con attach, detach, notify, getState y setState. Los estereotipos asociados

a los observadores se aplican en el diagrama de clases UML en clases y métodos. Por

ejemplo, la clase AlarmaMalEstado está marcada por el estereotipo Observer y

Administración, Stock, Compras por ConcreteObserver; y finalmente el método

actualiza con update.

En la figura 6.5 se muestran las características dinámicas del ejemplo a través de un

diagrama de secuencia. Como puede observarse se deben reflejar los participantes

del patrón estereotipados en el diagrama de clases pero además se estereotipan las

ocurrencias de especificación que no se pueden observar a simple vista en el

diagrama. Pero se verifica al estereotipar la interacción que se cumpla la secuencia de

ejecución y existan los elementos necesarios para la ejecución del patrón.

Page 98: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

90

Figura 6.5: Diagrama de secuencia ejemplo Biblioteca.

Page 99: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

91

6.1.5 Gestión del Framework

La aplicación de los estereotipos en diferentes modelos UML permite la verificación de

cada diagrama UML con el fin de establecer si los mismos especifican correctamente

las características del patrón, y también permite comprobar la consistencia entre el

diagrama de secuencia y de clases.

La consistencia entre los diagramas se garantiza marcando los modelos. A saber, los

diagramas de secuencia UML se generan después de las definiciones del diagrama de

clases UML.

A fin de usar el framework se construirá un modelo mal formado, violando las

características propias del patrón Observer. Se aplicará posteriormente la verificación

y chequeo del mismo, comprobando las restricciones en los distintos niveles que

conforman la arquitectura.

Para que de esta forma se violen algunas características estructurales y de secuencia

del mismo. Por este motivo las restricciones OCL expresarán la mala formación del

modelo.

Es posible detectar inconsistencias, a través de la evaluación de restricciones OCL, en

el caso particular de la herramienta RSA, esto se lleva a cabo marcando los modelos

con la opción validación. Luego de chequear las restricciones OCL asociadas a los

estereotipos, la herramienta informa si los modelos se encuentran bien especificados,

de acuerdo a las características del patrón.

La figura 6.6 representa un diagrama de clases estereotipado por un ingeniero de

software, aplicando la importación del perfil Observer, donde se omiten algunos

elementos importantes o se generan algunos errores para su para su posterior

verificación.

Page 100: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

92

Figura 6.6: Diagrama de clases ejemplo Biblioteca mal formado.

La figura 6.7 representa un diagrama de secuencia estereotipado por un desarrollador

de software, que debe tener una relación directa con el de clases, aplicando la

importación del perfil Observer, donde se omiten algunos elementos importantes o se

generan algunos errores para su para su posterior verificación.

Figura 6.7: Diagrama de secuencia ejemplo Biblioteca mal formado.

Page 101: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

93

La figura 6.8 muestra claramente la ejecución de validación que permite el software

RSA, denotando las violaciones establecidas para ambos modelos marcados.

Figura 6.8: Errores producidos por verificación de Observer.

El siguiente resumen simplifica los errores asumidos por un desarrollador de software,

al construir en forma indebida ambos diagramas.

Verificaciones en el nivel 0:

Restricción 5: Se escribe una operación concreta en una interface en la interfaz

Prueba.

Restricción 12: Se escribe un método abstracto llamado operacionAbstracta en una

clase concreta en el modelo, llamada AlarmaLibro.

Restricción 14: Se grafica una línea de vida llamada Propiedad en el diagrama de

secuencia y no tiene su correspondiente clase en el diagrama de clases.

Restricción 15: No se planteó un orden general en el modelo.

Verificaciones en el nivel 1:

Restricción 14: Se grafica una línea de vida llamada Propiedad en el diagrama de

secuencia y no tiene su correspondiente clase en el diagrama de clases.

Page 102: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

94

Restricción 15: No se planteó un orden general en el modelo.

Verificaciones en el nivel 2 del patrón Observer:

Restricción 19: Se confeccionó un modelo sin el participante Subject, no se estereotipo

la clase Alarma como tal.

Restricción 21: No se realizó la asociación entre el una clase estereotipada con

ConcreteSubject y ConcreteObserver, ya que no está estereotipada la clase Alarma.

Restricción 22: Se construye una clase ConcreteSubject sin el método getState y

setState.

Restricción 27: Se construye la clase Alarma sin el método attach.

Restricción 29: Se construye la clase AlarmaMalEstado sin estereotipar la operación

actualiza con update.

.Restricción 30: Se construye un diagrama de secuencia donde no existe una

ocurrencia de ejecución estereotipada como notify.

Restricción 31: Se construye un diagrama de secuencia donde no existe ningún

mensaje que provenga de una operación agregarObservador estereotipada como

attach.

Restricción 32: Se construye un diagrama de secuencia donde se hace una llamada al

método setState antes que el attach.

Restricción 33: Se construye un diagrama de secuencia donde se hace una llamada al

método notify antes que el setState.

Page 103: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

95

6.2 Patrón Command

6.2.1 Descripción General Encapsula un pedido en un objeto, lo que permite parametrizar clientes con diferentes

pedidos, colas o log request, y soporta operaciones de deshacer (figura 6.9).

Figura 6.9: Diagrama de clases Patrón Command.

- Clasificación

Patrón de comportamiento y de objeto.

- Participantes

- Command:

Declara una interface para ejecutar una operación.

- ConcreteCommand

Define un enlace entre un objeto Receiver object y una operación action.

Implementa la operación Execute invocando las operaciones

correspondientes en el Receiver.

- Client

crea un objeto ConcreteCommand y configura su receptor.

- Invoker

Invoca el comando para cumplir el pedido.

Page 104: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

96

- Receiver

Conoce como implementar las operaciones asociadas con el cumplimiento de

un pedido. Cualquier clase puede ser Receiver.

- Comportamiento

Un Cliente solicita un servicio para el que crea un Comando Concreto. Se activan los

receptores. El Comando Concreto es almacenado en el Invoker. El Invoker invoca la

operación execute del ConcreteCommand. Si se quiere volver atrás utilizando el

Comando Concreto lo puede hacer ya que tiene almacenado su estado, antes de la

invocación del execute. El comando concreto solicita la ejecución de las operaciones

del receptor (figura 6.10).

Figura 6.10: Diagrama de secuencia Patrón Command.

- Consecuencias

1. Command desacopla el objeto que invoca la operación del que sabe cómo

realizarla.

2. Los elementos Command pueden ser manipulados y extendidos como cualquier

objeto.

3. Puedes ensamblar commands dentro de un command compuesto. Se puede

combinar con el patrón Composite.

Page 105: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

97

4. Es fácil agregar nuevos elementos Command, porque no tienes que cambiar las

clases existentes.

6.2.2 Descripción de elementos nivel 2 – Patrón Command Estereotipos

A partir del diagrama de clases de la figura 6.9 se elaboraron los estereotipos

estructurales del patrón. Se importan los estereotipos del nivel 0 que permiten

especificar sus participantes de los cuales se puede heredar sus atributos,

operaciones y restricciones: patternClassifier, patternClass, patternProperty (figura

6.11).

Figura 6.11: Características estructurales y dinàmicas del Patrón Command.

CommandConsistency: Hereda las características de patternInteraction, lo que

garantiza su consistencia entre el diagrama de clases y el diagrama de secuencia. Es

un estereotipo que permite verificar que existan los elementos obligatorios del patrón y

que dichos elementos contengan los aspectos incluidos en la definición del mismo.

Receiver y Command: Hereda las características del estereotipo patternClassifier

como elemento abstracto. El Command representa el comando encargado de ejecutar

las acciones que contiene el receptor (Receiver).

Invoker y Client: Heredan las características de una clase concreta. El Cliente debe

existir para crear el comando concreto. En el caso de Invoker almacena el comando y

lo invoca para que realice la ejecución de una acción.

Page 106: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

98

State: Este estereotipo describe el estado del comando concreto lo que va a permitir

volver atrás con el comando en el caso de necesitarlo.

Los estereotipos execute y action heredan las características del estereotipo

patternOcurrence. Este estereotipo les permite estereotipar tanto operaciones como

especificaciones de ocurrencia. Se puede especificar aspectos de operaciones como

la secuencia de su ejecución.

execute: Fue definido para etiquetar las operación que comanda la ejecución de una

secuencia de acciones en el receptor.

action: Es un estereotipo que etiqueta una operación que refiere una determinada

acción dentro del Receptor.

6.2.3 Restricciones definidas en OCL para Command

Las restricciones se aplican para verificar el perfil Command, comprobando que

existan las asociaciones y composiciones necesarias entre los elementos del patrón.

Se comprueba que los estereotipos: Command, ConcreteCommand, Invoker, Client y

Receiver contengan los atributos y operaciones que deben contener por definición.

Respecto de su comportamiento, como en el caso del Observer, se comprueba su

consistencia y secuencia de ejecución.

Restricción 37: El perfil debe contener estereotipos de los participantes del

patrón: Command, ConcreteCommand, Client, Invoker y Receiver.

Context PerfilCommand::CommandConsistency

let TotalEstereo : Set(String) =

self.allOwnedElements().getAppliedStereotypes().name->asSet(),

ConjuntoEstereo : Set(String)=

Set{'Command','ConcreteCommand','Client','Invoker', 'Receiver'}

->asSet()

in

ConjuntoEstereo->forAll(e1| TotalEstereo->exists(e2|e1=e2))

Descripción: Se comprueba la existencia de los estereotipos definidos a partir de los

participantes del patrón. Dado el conjunto de los elementos estereotipados se

selecciona aquellos cuyo nombre de estereotipo es ‘Command’, ‘Invoker’,

‘ConcreteCommand’, 'Client' o 'Receiver’, garantizando su existencia.

Page 107: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

99

Utilización: Se verifica que los participantes del patrón estén representados en el

modelo.

Restricción 38: El patrón debe contener una asociación entre los estereotipos ConcreteCommand y Receiver.

Context PerfilCommand::CommandConsistency

Association.allInstances().memberEnd->

select(m|m.isNavigable()=true

and m.type.getAppliedStereotypes()->

select(name='Receiver')->

notEmpty()).class.getAppliedStereotypes()->

select(name='ConcreteCommand')->size()=

(Class.allInstances().getAppliedStereotypes()->

select(name='ConcreteCommand'))->size()

Descripción: La cantidad de objetos ConcreteCommand es igual a la cantidad de

relaciones entre ellos y los objetos receptores.

Utilización: Se verifica las relaciones de asociación entre el Receiver y los elementos

ConcreteCommand y Client.

Restricción 39: El patrón debe contener una relación de agregación entre los estereotipo Invoker y Command.

Context PerfilCommand::CommandConsistency

Association.allInstances().memberEnd ->

select(m|m.aggregation=uml::AggregationKind::shared and

m.type.getAppliedStereotypes().getLabel()->

includes('Command')->

notEmpty()).class.getAppliedStereotypes().name ->

includes('Invoker')

Descripción: Dado el conjunto de los extremos de asociación, se selecciona aquellos

que tienen un extremo de tipo agregación, y el tipo al que apunta tiene aplicado el

estereotipo Command. El extremo tiene aplicado el estereotipo Invoker.

Utilización: Se verifica que las relaciones de asociación estén representadas en el

modelo.

Page 108: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

100

Restricción 40: El elemento estereotipado como Command debe contener una operación estereotipada como execute.

Context PerfilCommand::Command

self.getAllOperations().getAppliedStereotypes().getLabel()->

includes('execute')

Descripción: En el elemento estereotipado como Command existe una operación a las

cual se le ha aplicado el estereotipo execute.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 41: El elemento estereotipado como Receiver debe contener la operación estereotipada como action.

Context PerfilCommand::Receiver

self.getAllOperations().getAppliedStereotypes().getLabel()->

includes('action')

Descripción: En el elemento estereotipado como Receiver existen operaciones a las

cuales se les ha aplicado el estereotipo action.

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Restricción 42: El elemento estereotipado como Invoker contiene una operación que debe contener como argumento un objeto estereotipado como Command.

Context PerfilCommand::Invoker

self.ownedOperation.ownedParameter.type.

getAppliedStereotypes().getLabel()->includes('Command')

Descripción: En el elemento estereotipado como Invoker existen operaciones con

parámetros a cuyo tipo se les ha aplicado el estereotipo Command.

Utilización: Se verifica la validez de las operaciones del patrón representadas en el

modelo.

Page 109: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

101

Restricción 43: La cantidad de líneas de vida de comandos concretos deben ser iguales a los mensajes de creación solicitados por Cliente.

Context PerfilCommand::CommandConsistency

Message.allInstances()->

select(m|m.messageSort=uml::MessageSort::createMessage and

m.connector.end.role.type.getAppliedStereotypes()->

select(name='Client')->notEmpty())->size()=

Lifeline.allInstances().represents.type.

getAppliedStereotypes()-> select(name='ConcreteCommand')->size()

Descripción: Debe existir la misma cantidad de mensajes de creación enviados por

clientes que las líneas de vida que provienen de clases estereotipadas como

ConcreteCommand.

Utilización: Se verifica la consistencia de los mensajes de creación.

Restricción 44: Existe un evento de llamada desde la operación estereotipada

como execute hacia un objeto de tipo Invoker.

Context PerfilCommand::CommandConsistency

Message.allInstances()->

select(mensaje|mensaje.signature.getAppliedStereotypes()->

select(name='execute') -> size()>=1 and

mensaje.connector.end.role.type.getAppliedStereotypes()->

select(name='Invoker')->size()>=1)->size()>=1

Descripción: Debe existir por lo menos un mensaje de llamada hacia una opreración

estereotipada como execute, y este mensaje debe tener como extremo por lo menos

un objeto de un tipo estereotipado como Invoker. La cantidad de mensajes de este tipo

debe ser mayor o igual a 1.

Utilización: Se verifica la consistencia entre las operaciones y los mensajes del patrón

en el modelo.

Page 110: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

102

Restricción 45: Existe una ejecución de comportamiento estereotipada por

execute. Dicha ejecución se encuentra en una línea de vida que proviene de una

clase estereotipada como ConcreteCommand.

Context PerfilCommand::CommandConsistency

let ejecucion: Collection(BehaviorExecutionSpecification)=

BehaviorExecutionSpecification.allInstances()

in ejecucion.covered.represents.type.

getApplicableStereotypes()-> select(name='ConcreteCommand')->

size()>=1 and ejecucion.finish.getAppliedStereotypes().name->

asSequence()->exists(n1,n2|n1='execute')

Descripción: Dado el conjunto de especificaciones de comportamiento , deben existir

algunas dentro de la línea de vida que proviene de una clase estereotipada como

ConcreteCommand y además halla al menos una ocurrencia de especificación. Esto

quiere decir, se ejecuta al menos una operación. Como consecuencia el comienzo de

alguna de las ejecuciones debe estar estereotipado como execute.

Utilización: Verifica que dentro de las ocurrencias del modelo dinámico exista una

ocurrencia estereotipada como execute.

Restricción 46: Existe una ejecución de comportamiento estereotipada por

action. Dicha ejecución se encuentra en una línea de vida que proviene de una

clase estereotipada como Receiver.

Context PerfilCommand::CommandConsistency

let ejecucion: Collection(BehaviorExecutionSpecification)=

BehaviorExecutionSpecification.allInstances()

in

ejecucion.covered.represents.type.

getApplicableStereotypes()->

select(name='Receiver')->size()>=1

and ejecucion.finish.getAppliedStereotypes().name->

asSequence()->exists(n1,n2|n1='action')

Descripción: Para la línea de vida que proviene de una clase estereotipada como

Receiver se halla al menos una ocurrencia de especificación. Esto quiere decir, se

ejecuta al menos una operación. Como consecuencia el comienzo de alguna de las

ejecuciones debe estar estereotipado como “action”.

Utilización: Verifica que dentro de las ocurrencias del modelo dinámico exista una

ocurrencia estereotipada como action.

Page 111: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

103

Restricciones de orden general

Orden General

Se plantea el orden general en la tabla 6.2 para las ocurrencias de ejecución del

patrón Command.

Orden before after

g1 storeCommand execute

g2 execute action

Tabla 6-2: Orden general Command.

Restricción 47: Define un orden de ejecución de la secuencia de comandos

almacena y execute.

Context PerfilCommand::CommandConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence(),

go : Sequence(GeneralOrdering)=

GeneralOrdering.allInstances()->

asSequence() in

go-> exists(g1| oc->exists(o1,o2|g1.before.name=o1.name and

g1.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='storeCommand')->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name='execute')-> notEmpty())))

Descripción: Se definió un orden general g1 y g2, se verifica la secuencia de los

elementos: almacena y execute.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Restricción 48: Define un orden de ejecución de la secuencia de comandos

execute y action.

Context PerfilCommand::CommandConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()-> asSequence()

, go: Sequence(GeneralOrdering) =

GeneralOrdering.allInstances()-> asSequence()

Page 112: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

104

in

go->exists(g2| oc->exists(o1,o2|g2.before.name=o1.name and

g2.after.name=o2.name implies

(o1.getAppliedStereotypes()-> select(name='execute')->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name='action')->notEmpty())))

Descripción: De la misma forma que el orden g1 se validó g2.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

6.2.4 Aplicación de perfiles a un caso de estudio del Command

Se sigue el mismo procedimiento explicado en el patrón Observer, estereotipando

todos los participantes del modelo en el diagrama de clases y de secuencia respectivo,

y se verifican las restricciones propias de este perfil.

Caso Ejemplo Patrón Command

En este ejemplo se muestra el caso de servidores distribuidos en distintos lugares, a

los que se requiere aplicar los comandos de arranque y detención. Estos comandos

incluyen varias acciones: encender, conectar, verificar conexión para el caso de

arranque. Y para el caso de detención: guardar log, desconectar y apagar. Cada

server tendrá todas estas acciones implementadas. Para diseñar los comandos se

creó una clase por cada uno de los Comandos: ArrancaServer y DetenerServer. Cada

uno de ellos contiene una operación denominada operaServer que ejecuta el arranque

o la detención de los servidores. En este ejemplo se toman dos servidores: uno que se

encuentra en Argentina y otro que se encuentra en Brasil. También se definió un

invocador que actúa en el momento de llamar a la ejecución del comando. En la figura

6.12 se muestra el modelo estereotipado por los estereotipos del perfil del patrón

Command.

Page 113: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

105

Figura 6.12: Diagrama de clases ejemplo Servidores.

Con este diseño el ejemplo desacopla la invocación de la operación respecto de su

implementación. Asimismo la parte comportamental del modelo puede verse en el

diagrama de secuencia de la figura 6.13, donde se presenta el diagrama de secuencia.

El comando de arranque está compuesto por tres acciones: encender, conectar y

verificar conexión. El cliente solicita un comando de Arranque. Se crea el comando

que será invocado por el Invoker para llevar a cabo el comando de arranque para el

receptor.

Page 114: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

106

Figura 6.13: Diagrama de secuencia ejemplo Servidores.

Su parte comportamental es muy simple por lo que se puede representar

perfectamente con solo un diagrama de secuencia. Su simplicidad es lo que lo hace

tan útil.

6.2.5 Gestión del Framework

Se adopta la metodología explicada en la sección 6.1.5 para realizar la gestión de la

herramienta verificando el conjunto de restricciones especificadas para el patrón

Command. Otorgando como salida el siguiente resultado.

La figura 6.14 representa un diagrama de clases estereotipado por un ingeniero de

software, aplicando la importación del perfil Command, donde se omiten algunos

Page 115: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

107

elementos importantes o se generan algunos errores para su para su posterior

verificación.

Figura 6.14: Diagrama de clases ejemplo Servidores mal formado.

La figura 6.15 representa un diagrama de secuencia estereotipado por un

desarrollador de software, que debe tener una relación directa con el de clases,

aplicando la importación del perfil Command, donde se omiten algunos elementos

importantes o se generan algunos errores para su para su posterior verificación.

Page 116: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

108

Figura 6.15 : Diagrama de secuencia ejemplo Servidores mal formado.

La figura 6.16 muestra la verificación utilizando RSA, denotando las violaciones

establecidas para ambos modelos marcados.

Page 117: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

109

Figura 6.16: Errores producidos por verificación de Command.

Verificaciones en el nivel 0:

Restricción 10: Se escribe una operación abstracta en la interface y en la clase que la

implementa no se escribe el método correspondiente.

Restricción13: Se escribe una operación concreta en una interface.

Verificaciones en el nivel 1:

Restricción 14: Al crear una línea de vida de un elemento que no existe en el diagrama

de clases. No existe una correspondencia entre las líneas de vida del diagrama de

secuencia y las clases del diagrama de clases.

Restricción 16: Todas las operaciones estereotipadas en el diagrama de clases se

deben ejecutar en el diagrama de secuencia, al crear una línea de vida de un elemento

que no existe en el diagrama de clases, no existe esta correspondencia.

Verificaciones en el nivel 2 del patrón Command:

Restricción 37: Se confeccionó un modelo sin el participante Invoker.

Restricción 39: No existe la agregación entre un elemento estereotipado como Invoker

hacia un elemento estereotipado como Command.

Restricción 44: No existe un mensaje de llamada a la operación estereotipada como

execute desde el Invoker.

Restricción 45: Se construye un diagrama de secuencia donde no exista un mensaje

execute en la línea de vida Command.

Page 118: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

110

Restricción 46: No se aplicó en el diagrama de secuencia el estereotipo execute a la

ejecución de comportamiento que corresponda.

Restricción 47: Se construye un diagrama de secuencia donde se hace una llamada al

método execute antes que almacena.

Restricción 48: Se construye un diagrama de secuencia donde se hace una llamada al

método action antes que execute.

6.3 Patrón Memento

6.3.1 Descripción General

Este patrón de diseño permite capturar y exportar el estado interno de un objeto para

que luego se pueda restaurar, sin romper la encapsulación.

Su finalidad es almacenar el estado de un objeto (o del sistema completo) en un

momento dado, de manera que se pueda restaurar posteriormente si fuese necesario.

Para ello se mantiene almacenado el estado del objeto para un instante de tiempo en

una clase independiente de aquella a la que pertenece el objeto (pero sin romper la

encapsulación), de forma que ese recuerdo permita que el objeto sea modificado y

pueda volver a su estado anterior (figura 6.17).

Figura 6.17: Diagrama de clases Patrón Memento.

Page 119: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

111

- Clasificación

Patrón de comportamiento y de objeto.

- Participantes

- Memento:

Almacena el estado interno del objeto Originator. El memento puede

almacenar los aspectos necesarios del estado interno del Originator.

Protege del acceso de otros objetos que no sean el Originator. Memento

tiene dos interfaces. Caretaker ve solo una parte del Memento. Originator, ve

una interface amplia, una que permite acceder a todos los datos necesarios

para restaurarse a sí mismo a su estado previo. Idealmente, solo el originator

que creó el memento puede acceder al estado interno del memento.

- Originator

Crea un memento conteniendo una copia de su estado interno actual.

Usa el memento para restablecer su estado interno.

- Caretaker

Es responsable por la seguridad del memento.

No funciona sobre los contenidos del memento o los examina.

- Comportamiento

El cliente crea el elemento a ser recordado (Originator) y el mecanismo de

salvaguarda (Caretaker). Caretaker guarda la copia del estado del elemento en ese

momento, y que será recordado y lo contabiliza como existente. Cuando el objeto

Originator lo requiere el objeto Caretaker le pasa la copia, del elemento Memento

(figura 6.18).

Page 120: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

112

Figura 6.18: Diagrama de secuencia Patrón Memento.

- Consecuencias

1. Preserva los límites de la encapsulación. Memento evita exponer información que

solo un originator manejaría pero que debe ser almacenado fuera del originator. El

patrón protege otros objetos de potenciales y complejos del tipo Originator internos,

preservando así los limites de encapsulación.

2. Simplificación de Originator. Teniendo los clientes el manejo de los estados, ellos

requieren simplificar el Originator y que los clientes no tengan que notificar a los

objetos del tipo Originator cuando ellos hayan terminado.

3. Usar mementos podría ser caro. Los Mementos podrían incurrir en una considerable

sobrecarga si el Originator debe copiar grandes cantidades de información para

almacenar en el memento o si los clientes crean y retornan mementos del originator

demasiado a menudo.

4. Definir interfaces estrechas y amplias. Puede ser dificultoso en algunos lenguajes

para asegurar que solo el originator puede acceder al estado del memento.

5. Un caretaker es responsable por borrar los mementos que cuida. Sin embargo, el

caretaker no sabe cuánto un estado está en el memento. Un caretaker podría incurrir

en grandes costos de almacenamiento, cuando almacena mementos.

Page 121: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

113

6.3.2 Descripción de elementos nivel 2 - Patrón Memento Estereotipos

A partir del diagrama de clases de la figura 6.19 se elaboraron los estereotipos

estructurales del patrón. Se importan los estereotipos del nivel 0 que permiten

especificar sus participantes de los cuales se puede heredar sus atributos,

operaciones y restricciones: patternClass, patternProperty (figura 6.19).

Figura 6.19: Características estructurales y dinámicas del Patrón Memento.

MementoConsistency: Hereda las características de patternInteraction, lo que

garantiza su consistencia entre el diagrama de clases y el diagrama de secuencia. Es

un estereotipo que permite verificar que existan los elementos obligatorios del patrón y

que dichos elementos contengan los aspectos incluidos en la definición del mismo.

Caretaker, Originator y Memento: Heredan las características de una clase concreta.

Caretaker cuida la seguridad del memento. Originator es la clase que crea el Memento

y Memento guarda el estado de Originator.

State: Este estereotipo describe el estado del Memento lo que va a permitir volver

atrás el estado del Memento en el caso de necesitarlo.

Los estereotipos createMemento, getState, setState y setMemento heredan las

características del estereotipo patternOcurrence. Este estereotipo les permite

estereotipar tanto operaciones como especificaciones de ocurrencia. Se puede

especificar aspectos de operaciones como la secuencia de su ejecución.

Page 122: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

114

6.3.3 Restricciones definidas en OCL para Memento

Las restricciones se aplican para verificar el perfil Memento, comprobando que existan

las asociaciones y composiciones necesarias entre los elementos del patrón. Se

comprueba que los estereotipos: Caretaker, Originator y Memento contengan los

atributos y operaciones que deben contener por definición. Respecto de su

comportamiento, se comprueba su consistencia y secuencia de ejecución.

Restricción 49: El perfil debe contener estereotipos de los participantes del

patrón: Caretaker, Originator y Memento

Context PerfilMemento::MementoConsistency

let TotalEstereo : Set(String) =

Class.allInstances().getAppliedStereotypes().name->asSet(),

ConjuntoEstereo : Set(String)= Set{'Originator','Caretaker',

,'Memento'}->asSet()

in

ConjuntoEstereo->forAll(e1| TotalEstereo->exists(e2|e1=e2))

Descripción: Se comprueba la existencia de los estereotipos definidos a partir de los

participantes del patrón. Dado el conjunto de los elementos estereotipados y el

conjunto de los estereotipos del patrón. Se verifica que existan los estereotipos dentro

de la colección de estereotipos que corresponden a los elementos estereotipados del

modelo.

Utilización: Se verifica que los participantes del patrón estén representados en el

modelo.

Restricción 50: Dependencia Originator-Memento

Context PerfilMemento::Originator

self.clientDependency.oclAsType(Usage).relatedElement.

getAppliedStereotypes()-> select(name='Memento')->size()>=1

Descripción: El elemento estereotipado como Originator contiene al menos una

dependencia respecto del elemento estereotipado como Memento.

Utilización: Se verifica que las relaciones estén representadas en el modelo.

Page 123: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

115

Restricción 51: Agregación Caretaker-Memento

Context PerfilMemento::Caretaker

self.attribute->exists(atributo|

atributo.type.getAppliedStereotypes()->

select(name='Memento')->

size()>=1 and

atributo.aggregation=uml::AggregationKind::shared))

Descripción: El elemento estereotipado como Caretaker contiene al menos una

agregación dirigida hacia el elemento estereotipado como Memento.

Utilización: Se verifica que las relaciones estén representadas en el modelo.

Restricción 52: Operación createMemento del estereotipo Originator

Context PerfilMemento::Originator

self.getAllOperations()->select(o|o.getAppliedStereotypes()->

select(name='setMemento' or name='createMemento')->notEmpty()

and o.ownedParameter.type.getAppliedStereotypes().getLabel()->

includes('Memento'))->notEmpty()

Descripción: Si se selecciona las operaciones que contienen como parámetro un

objeto estereotipado como Memento, existe por lo menos una de estas operaciones

que están estereotipadas como createMemento.

Restricción 53: Los estereotipos setMemento y createMemento deben estar

presentes en las operaciones de Originator

Context PerfilMemento::Originator

let TotalEstereo : Set(String) =

self.getAllOperations().getAppliedStereotypes().name->asSet(),

ConjuntoEstereo : Set(String)= Set{'setMemento',

'createMemento'}-> asSet()in

ConjuntoEstereo->forAll(e1| TotalEstereo->exists(e2|e1=e2))

Descripción: Existe por lo menos una operación estereotipada como setMemento en

el elemento estereotipado como Originator. Y

Utilización: Se verifica que las operaciones del patrón estén representadas en el

modelo.

Page 124: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

116

Restricciones de orden general

Orden General

En este caso se puede definir la obligatoriedad de que se cumplan dos órdenes

parciales: createMemento con setState, y setState con setMemento, ver tabla 6.3.

Orden before after

g1 createMemento setState

g2 setState setMemento

Tabla 6-3: Orden general Memento.

Restricción 54: Define un orden de ejecución de la secuencia de comandos

createMemento y setState.

Context PerfilMemento::MementoConsistency

let oc : Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence()

, go:Sequence(GeneralOrdering)=

GeneralOrdering.allInstances()->

asSequence() in

go-> exists(g1| oc->exists(o1,o2|g1.before.name=o1.name and

g1.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='createMemento')->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name='setState')-> notEmpty())))

Descripción: Dentro de la interacción existe un conjunto de órdenes generales, y un

conjunto de ocurrencias. En la restricción se asignan a dos variables la secuencia de

estos dos conjuntos. Dentro la secuencia de órdenes se encuentra un orden

denominado g1 en esta restricción. Y dentro de este orden se halla una ocurrencia o1

como primer elemento de la secuencia, ya que es elemento etiquetado como before.

Además se encuentra un segundo elemento etiquetado como after, la ocurrencia o2.

En términos simples, o1 debe ir primero y o2 debe ir después. El elemento o1 está

antes que o2 y el elemento o2 está después de o1. Y además esos elementos están

estereotipados por createMemento y setState.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas para cumplir el estándar del patrón.

Page 125: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

117

Restricción 55: Define un orden de ejecución de la secuencia de comandos

setState y setMemento.

Context PerfilMemento::Memento

let oc: Sequence(OccurrenceSpecification)=

OccurrenceSpecification.allInstances()->asSequence(),

go: Sequence(GeneralOrdering)= GeneralOrdering.allInstances()

-> asSequence() in

go-> exists(g2| oc->exists(o1,o2|g2.before.name=o1.name and

g2.after.name=o2.name implies

(o1.getAppliedStereotypes()->select(name='setState')->

notEmpty()) and (o2.getAppliedStereotypes()->

select(name='setMemento')-> notEmpty())))

Descripción: Se definió un orden general G2 en los mismos términos que G1, pero

describe la secuencia de los elementos: setState y setMemento.

Utilización: Verifica que las ocurrencias del modelo dinámico se encuentren

estereotipadas.

Page 126: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

118

6.3.4 Aplicación de perfiles a un caso de estudio del Memento

Se sigue el mismo procedimiento explicado en el patrón Observer, estereotipando

todos los participantes del modelo en el diagrama de clases y de secuencia respectivo,

y se verifican las restricciones propias de este perfil.

Caso ejemplo Patrón Memento

Este patrón debe ser utilizado cuando se necesite salvar el estado de un objeto y tener

disponible los distintos estados históricos que se necesiten. El siguiente ejemplo ilustra

el uso de "undo" con el patrón Memento (figura 6.20). Intervienen tres clases: la

clase Originator (Originador) es una clase que cambia de estado; la clase

Caretaker (Portero) se encarga de registrar los cambios del estado de

Originador; Memento (Memoria) almacena el estado interno de un objeto Originator. El

Memento puede almacenar mucho o parte del estado interno de Originator. A su vez

tiene dos interfaces una para el Portero que le permite manipular el Memento

únicamente para pasarlo a otros objetos. Y la otra interfaz sirve para Originador que

puede almacenar/restaurar su estado interno.

Figura 6.20: Diagrama de clases ejemplo Memoria.

Asimismo la parte comportamental del modelo puede verse en el diagrama de

secuencia de la figura 6.21, donde se presenta el diagrama de secuencia que se

describe a continuación. En primer lugar el objeto Main crea los objetos de tipo Portero

(P1) y Originador (O1). Se le da un estado inicial a O1 (Originador). La secuencia del

patrón comienza cuando el objeto Main llama al procedimiento agregarMemento del

objeto P1, lo que origina que el Portero realice una llamada a la operación

crearMemoria del Originator. O1 (Originator) crea el Memento M1, llamando a la

operación newMemoria y establece su estado mediante el método establecerEstado

del objeto M1 creado. De esta manera ya tenemos salvaguardada la memoria del

estado del Objeto O1 (Originator). En un momento determinado O1 cambia su estado.

Se vuelve a generar el ciclo de guardado. Es decir, se envía desde Main el mensaje a

Page 127: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

119

P1 para que agregue en este caso un memento M2. Se crea M2 mediante

newMemoria y M2 establece su estado con la operación establecerEstado. En un

momento determinado se hace necesario volver el Originator al estado original M1.

Figura 6.21: Diagrama de secuencia ejemplo Memoria.

Page 128: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

120

Es decir, realizar el undo. Es ahí cuando el Main hace una llamada al método

recuperarDelaMemoria del Portero P1, dicho método posibilita el acceso al memento

M1. El próximo paso es recuperar el estado del memento, llamando desde Main al

procedimiento recuperarEstado. En el ejemplo también se recupera el estado de M2

de la misma manera llamando las operaciones recuperarDelaMemoria y

recuperarEstado respectivamente.

6.3.5 Gestión del Framework

Se adopta la metodología explicada en la sección 6.1.5 para realizar la gestión de la

herramienta verificando el conjunto de restricciones especificadas para el patrón

Memento. Otorgando como salida el siguiente resultado.

La figura 6.22 representa un diagrama de clases estereotipado por un ingeniero de

software, aplicando la importación del perfil Memento, donde se omiten algunos

elementos importantes o se generan algunos errores para su para su posterior

verificación.

Figura 6.22: Diagrama de clases ejemplo Memoria mal formado.

La figura 6.23 representa un diagrama de secuencia estereotipado por un ingeniero

de software, que debe tener una relación directa con el de clases, aplicando la

importación del perfil Memento, donde se omiten algunos elementos importantes o se

generan algunos errores para su para su posterior verificación.

Page 129: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

121

Figura 6.23: Diagrama de secuencia ejemplo Memoria mal formado.

La figura 6.24 muestra claramente la ejecución de validación que permite el software

RSA, denotando las violaciones establecidas para ambos modelos marcados.

Figura 6.24: Mensajes de Error de mala formación Memento.

Page 130: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

122

Verificaciones en el nivel 0:

Restricción 1: Se escribe una propiedad en la clase Portero sin tipo de dato.

Restricción 12: Se escribe una operación abstracta en una clase concreta Portero.

Verificaciones en el nivel 1:

Restricción 16 : Al no estereotipar la operación establecerMemoria como setMemento

no coinciden las operaciones estereotipadas con las ejecuciones estereotipadas.

Restricción 17: Se crea un método Operacion1 en una clase con signatura privada y

se crea un mensaje en el diagrama de secuencia para este método.

Restricción 18: Se crea un mensaje cuyo con nombre no se corresponde con ninguna

operación de la clase.

Verificaciones en el nivel 2 del patrón Memento:

Restricción 50: Se confeccionó un modelo sin el participante Memento

Restricción 51: Al no estar estereotipado el participante Memento no existe su

instanciación.

Restricción 53: Al no estar estereotipado el participante Memento la operación

createMemento que está en Originator no tiene un párametro estereotipado de tipo

Memento.

Restricción 52: Se confeccionó un modelo sin la agregación entre el Caretaker y el

Memento.

Restricción 54: No se estereotipa la operación establecerMemoria con el estereotipo

setMemento.

Restricción 55: Se construye un diagrama de secuencia donde se hace una llamada al

método establecerEstado antes que crearMemoria.

Restricción 56: Se construye un diagrama de secuencia donde se hace una llamada al

método establecerMemoria antes que establecerEstado.

Page 131: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

123

CAPITULO VII

Conclusiones y Trabajos Futuros

En este capítulo se presentan las conclusiones y orientaciones que pueden servir para

continuar en un futuro esta línea de investigación. Dada la imprecisión de UML

muchas investigaciones estudian como proveer una mejor verificación de los modelos

generados con este lenguaje. La verificación formal basada en la lógica matemática

supera las debilidades de otras formas de verificación. Aquí se plantea una forma de

verificación de patrones de diseño basada en lógica de primer orden.

7.1 Conclusiones

En esta tesis se ha presentado un conjunto de especificaciones en el marco de una

arquitectura de patrones de diseño. La técnica utilizada implica la creación de perfiles

UML y restricciones OCL. De esta manera puede formularse una especificación

genérica y reusable, fácil de expresar y mantener. La lógica de primer orden resulta

normalmente más fácil de aprender y comprender que otros formalismos matemáticos.

En este trabajo se muestra que es posible la especificación de los patrones diseño de

comportamiento con dicho formalismo, brindando así, consistencia y precisión en la

técnica utilizada.

El artefacto “Perfil UML”, definido por la OMG, se emplea como mecanismo para

documentar y definir patrones de diseño. Esto permite; siguiendo con la noción de

perfil, introducir estereotipos, valores etiquetados y restricciones en modelos

particulares.

También se muestra que la definición de un perfil para cada patrón es una opción para

la especificación de patrones de diseño. No se usa una sintaxis especial para

representar patrones; sino que se usa un artefacto UML: “el perfil”. De esta forma, el

Page 132: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

124

mismo se utiliza no solo para definir un dominio especifico sino también para un

dominio general, como lo es la definición de patrones.

Esta metodología permite a los diseñadores de software visualizar claramente los

patrones que están utilizando. Esto favorece la comunicación entre ellos; a la vez, que

posibilita establecer un vocabulario común (características propias del uso de patrones

de diseño).

Utilizando dichas especificaciones en el marcado de modelos se dota de una mayor

precisión al mismo. Al estereotipar los elementos de un modelo se pueden verificar las

condiciones obligatorias para un determinado patrón. De esta manera se puede

verificar los modelos y preparar los mismos para una futura transformación tanto a

nivel PIM como PSM. En este trabajo se han definido restricciones semánticas sobre

estereotipos, siguiendo el estándar definido para los patrones. El uso de un conjunto

de restricciones le da al patrón su substancia ya que lo hace más formal. También la

definición de restricciones para cada nivel de una arquitectura introduce mayor

generalidad en la definición del modelo.

Los patrones de comportamiento, tienen características particulares que se

puntualizaron y que son propias de la programación orientada a objetos.

El presente trabajo permitió representar las interacciones entre las clases y su

comportamiento, con claridad y en forma legible. Asimismo se mostraron ejemplos

simples y prácticos para representar los patrones.

Según lo destacado anteriormente podemos afirmar que se ha logrado con la

investigación de esta tesis aportar los siguientes beneficios a la ingeniería de

software:

• Facilitar la representación de modelos que contengan patrones de

comportamiento definidos.

• Estandarizar y simplificar las especificaciones de patrones de comportamiento.

• Especificar los aspectos dinámicos de los patrones.

• Formalizar una estructura para la definición de futuros patrones

Page 133: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

125

Dentro de las contribuciones mencionadas al comienzo del trabajo cabe

destacar como utilidades:

• Aplicación de conceptos MDA al modelado de patrones de diseño como contribución

general.

• Formalización de especificaciones para los patrones de diseño.

• Definición de una arquitectura específica para patrones de comportamiento.

• Visualización y documentación de los patrones de diseño.

• La posibilidad de utilizar las herramientas UML estándar para la especificación de

patrones sin necesidad de crear una herramienta especifica.

7.2 Trabajos futuros

A continuación se detallan futuros trabajos y extensiones aplicables a la presente

propuesta de tesis.

El trabajo realizado proporciona la base para ampliar y mejorar los instrumentos para

la validación y verificación de software a través de investigaciones sobre las siguientes

ideas.

Se pueden incorporar nuevos perfiles dentro de la arquitectura en cualquier nivel

aprovechando el reúso de definiciones, generando nuevos estereotipos y

extensiones. La ventaja de definir en el nivel de arquitectura los patrones

particulares permite anexar cualquier tipo de patrón independiente de los

catalogados como patrones de diseño.

Se puede generar un catálogo que contenga un patrón base y distintas variantes

de especificación de un patrón que permitan verificar los modelos en forma más

flexible. Ya que en la especificación presentada falta plantear la variabilidad de

patrones y su utilización en modelos complejos.

Se puede construir una herramienta para la detección de patrones, tomando como

referencia los modelos y perfiles definidos en el catalogo. La detección de patrones

puede formularse ya que se cumplen los requisitos necesarios. Como ya se dijo

Page 134: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

126

existe una especificación genérica y reusable, fácil de expresar y mantener. Y

además la lógica de primer orden es fácil de aprender y comprender

Se pueden definir transformaciones para mutar de una variante de un patrón hacia

otra variante menos compleja.

Otra arista posible es la formulación de las especificaciones en lógica de primer

orden pero en lenguajes que permitan la verificación de UML como es el caso del

lenguaje Prolog.

En la especificación presentada se recurrió a tecnologías existentes y dentro de ellas

su posible integración con herramientas de modelado. De esta manera los usuarios

obtienen el valor añadido de maniobrar herramientas que ya manejan en lugar de

tener que emplear nuevas. La detección puede ser implementada a través del uso de

transformaciones en lenguaje QVT y lograr también generar su correspondiente código

a través de una transformación de modelo a texto.

A partir de la arquitectura desarrollada es posible desarrollar una herramienta

UML/MDA que abarque las ideas presentadas. Un punto a tener en cuenta es la

importancia de la compatibilidad con herramientas existentes. Por ejemplo, la

herramienta presentada necesariamente importará y exportará formatos como XMI u

otros de tipo estándar.

Page 135: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

127

Bibliografía

[1] E. Gamma, H. Richard, R. Jhonson, and J. VLislides, Patrones de diseño: elementos de software orientado a objetos reutilizable. Addison-Wesley, 2003.

[2] T. Taibi, Design Patterns Formalization Techniques. IGI Publishing, 2007.

[3] “OMG Formal Specifications”, OMG, 2015. Disponible: http://www.omg.org/spec/. [Último acceso: 28-Jul-2015].

[4] G. Booch, J. Rumbaugh, and I. Jacobson, El Lenguaje Unificado de Modelado. Addison-Wesley, 1999.

[5] “OCL 2.4,” OMG, 2014. Disponible: http://www.omg.org/spec/OCL/2.4/ [Último acceso: 28-Jul-2015].

[6] “IBM developerWorks : Download : IBM Rational Software Architect,” IBM, Disponible: https://www.ibm.com/developerworks/downloads/r/architect/. [Último acceso: 28-Jul-2015].

[7] “UML 2.5,” OMG, 2015. [Online]. Disponible: http://www.omg.org/spec/UML/2.5/ [Último acceso: 28-Jul-2015].

[8] P. Coad, “Object-oriented patterns” Commun. ACM, vol. 35, no. 9, pp. 152–159, 1992.

[9] S. Berczuk, “Finding solutions through pattern languages”, Computer (Long. Beach. Calif)., vol. 27, no. 12, pp. 75–76, 1994.

[10] C. Alexander:, The Timeless Way of Building: 9780195024029: Amazon.com: Books. Oxford University Press, 1979.

[11] A. H. Eden and Y. Hirshfeld, “Principles in formal specification of object oriented design and architecture” CASCON ’01 Proc. 2001 Conf. Cent. Adv. Stud. Collab. Res., p. 3, 2001.

[12] M. E. Fayad, C. Chiang, P. Chacin, S. Ramaswamy, A. Sánchez-Ruíz, and S. Nurcan, “The first international workshop on patterns languages” in Companion to the 22nd ACM SIGPLAN conference on Object oriented programming systems and applications companion - OOPSLA ’07, p. 743, 2007.

[13] F. Khomh and Y. Guéhéneuc, “Do Design Patterns Impact Software Quality Positively?”, Softw. Maint. Reengineering. CSMR 2008. 12th Eur. Conf., pp. 274–278, 2008.

[14] T. Winn and P. Calder, “A pattern language for pattern language structure”, Proceeding CRPIT ’02 Proc. 2002 Conf. Pattern Lang. programs, vol. 13, pp. 45–58, 2003.

Page 136: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

128

[15] A. Lauder and S. Kent, “Precise visual specification of design patterns”, ECOOP’98 — Object-Oriented Programming, vol. 1445, pp. 230–236, 1998.

[16] G. Cepeda Porras and Y.-G. Guéhéneuc, “An empirical study on the efficiency of different design pattern representations in UML class diagrams”, Empir. Softw. Eng., vol. 15, no. 5, pp. 493–522, 2010.

[17] K. Lano, J. C. Bicarregui, and S. Goldsack, “Formalising design patterns”, p. 11, 1996.

[18] A. Le Guennec, G. Sunyé, and J.-M. Jézéquel, “Precise modeling of design patterns”, pp. 482–496, 2000.

[19] J. K. H. Mak, C. S. T. Choy, and D. P. K. Lun, “Precise modeling of design patterns in UML”, Proceedings. 26th Int. Conf. Softw. Eng., 2004.

[20] U. Zdun and P. Avgeriou, “Modeling architectural patterns using architectural primitives”, ACM SIGPLAN Not., vol. 40, no. 10, p. 133, 2005.

[21] J. Dong, S. Yang, and K. Zhang, “Visualizing Design Patterns in Their Applications and Compositions”, IEEE Trans. Softw. Eng., vol. 33, no. 7, pp. 433–453, 2007.

[22] K. N. Loo, S. P. Lee, and T. K. Chiew, “UML Extension for Defining the Interaction Variants of Design Patterns”, IEEE Softw., vol. 29, no. 5, pp. 64–72, 2012.

[23] N. C. Debnath, A. Garis, D. Riesco, and G. Montejano, “Defining OCL constraints for the Proxy Design Pattern Profile”, 2007 IEEE/ACS International Conference on Computer Systems and Applications, pp. 880–885, 2007.

[24] T. Mikkonen, “Formalizing design patterns”, Proc. 20th Int. Conf. Softw. Eng., 1998.

[25] J. Niere, W. Schäfer, J. P. Wadsack, L. Wendehals, and J. Welsh, “Towards pattern-based design recovery”, pp. 338–348.

[26] A. Blewitt, A. Bundy, and I. Stark, “Automatic verification of Java design patterns,” Proc. 16th Annu. Int. Conf. Autom. Softw. Eng. (ASE 2001), 2001.

[27] N. S. N. Shi and R. a. Olsson, “Reverse Engineering of Design Patterns from Java Source Code”, 21st IEEE/ACM Int. Conf. Autom. Softw. Eng., 2006.

[28] J. Dong, Y. Zhao, and T. Peng, “Architecture and design pattern discovery techniques-a review”, Proc. Int. Conf. Softw. Eng. Res. Pract. (SERP), USA, p. 11, 2007.

[29] C. Kramer and L. Prechelt, “Design recovery by automated search for structural design patterns in object-oriented software”, Proceedings of WCRE ’96: 4rd Working Conference on Reverse Engineering, pp. 208–215. 1996.

Page 137: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

129

[30] D. Beyer, A. Noack, and C. Lewerentz, “Efficient relational calculation for software analysis”, IEEE Trans. Softw. Eng., vol. 31, no. 2, pp. 137–149, 2005.

[31] A. H. Eden, A. Yehudai, and J. Gil, “Precise specification and automatic application of design patterns”, Proceedings 12th IEEE International Conference Automated Software Engineering, pp. 143–152, 1997.

[32] A. H. Eden, “A Theory of Object-Oriented Design”, Inf. Syst. Front., vol. 3, pp. 379–391, 2002.

[33] A. H. Eden, E. Gasparis, and J. Nicholson, “LePUS3 and Class-Z Reference Manual”, Computer (Long. Beach. Calif), pp. 1–19, 2009.

[34] E. Gasparis, J. Nicholson, and A. H. Eden, “LePUS3: An object-oriented design description language”, Lect. Notes Comput. Sci. (including Subser. Lect. Notes Artif. Intell. Lect. Notes Bioinformatics), vol. 5223 LNAI, pp. 364–367, 2008.

[35] D. Maplesden, J. Hosking, and J. Grundy, “A visual language for design pattern modelling and instantiation”, Proc. IEEE Symp. Human-Centric Comput. Lang. Environ. (Cat. No.01TH8587), pp. 2–3, 2001.

[36] D. Maplesden, J. Hosking, and J. Grundy, “Design Pattern Modelling and Instantiation using DPML”, Proc. Fortieth Int. Conf. Tools Pacific Objects internet, Mob. Embed. Appl. - CRPIT ’02, vol. 10, pp. 3–11, 2002.

[37] R. B. France, D. K. Kim, S. Ghosh, and E. Song, “A UML-based pattern specification technique”, IEEE Trans. Softw. Eng., vol. 30, no. 3, pp. 193–206, 2004.

[38] D. K. Kim, “A meta-modeling approach to specifying patterns”, 2004.

[39] D. K. Kim and L. Lu, “Inference of design pattern instances in UML models via logic programming,” 11th IEEE Int. Conf. Eng. Complex Comput. Syst., 2006.

[40] D. K. Kim and W. Shen, “An approach to evaluating structural pattern conformance of UML models”, Proceedings of the 2007 ACM symposium on Applied computing - SAC ’07, p. 1404, 2007.

[41] IBM, “IBM - Rational Rose Enterprise”, Disponible: http://www-03.ibm.com/software/products/es/enterprise. [Último acceso: 31-Jul-2015].

[42] D. K. Kim and W. Shen, “Evaluating pattern conformance of UML models: A divide-and-conquer approach and case studies”, Softw. Qual. J., vol. 16, no. 3, pp. 329–359, 2008.

[43] H. Albin-Amiot, P. Cointe, Y.-G. Gueheneuc, and N. Jussien, “Instantiating and detecting design patterns: putting bits and pieces together”, Proc. 16th Annu. Int. Conf. Autom. Softw. Eng. (ASE 2001), 2001.

Page 138: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

130

[44] M. Elaasar, L. C. Briand, and Y. Labiche, “A metamodeling approach to pattern specification”, Model Driven Engineering Languages and Systems, vol. 4199, pp. 484–498, 2006.

[45] H. Zhu and L. Shan, “Well-formedness, consistency and completeness of graphic models”, Proc. UKSIM’06, Oxford, UK, pp. 47–53, 2006.

[46] M. Elaasar, L. C. Briand, and Y. Labiche, “VPML : An Approach to Detect Design Patterns of MOF-Based Modeling Languages”, pp. 1–42, 2013.

[47] “QVT 1.2,” OMG, 2015. Disponible: http://www.omg.org/spec/QVT/1.2/. [Último acceso: 01-Sep-2015].

[48] J. Fernandes, Ralf Lämmel, J. Visser, and J. Saraiva, Generative and Transformational Techniques in Software Engineering III: International Summer School, GTTSE 2009, Braga, Portugal, July 6-11, 2009, Revised Papers. Springer, 2011.

[49] “Graphical Modeling.” Disponible: https://eclipse.org/modeling/graphical.php. [Último acceso: 01-Sep-2015].

[50] “medini QVT.” Disponible: http://projects.ikv.de/qvt. [Último acceso: 01-Sep-2015].

[51] “Eclipse Modeling Project.” Disponible: https://eclipse.org/modeling/emf/. [Último acceso: 01-Sep-2015].

[52] K. Lano and S. Kolahdouz-Rahimi, “Model-Transformation Design Patterns”, IEEE Trans. Softw. Eng., vol. 40, no. 12, pp. 1224–1259, 2014.

[53] M. Elaasar, L. C. Briand, and Y. Labiche, “An Approach to Detecting Design Patterns in MOF- Based Domain-Specific Models with QVT,” pp. 1–41, 2010.

[54] “MDA Specifications,” OMG, 2014. Disponible: http://www.omg.org/mda/specs.htm. [Último acceso: 28-Jul-2015].

[55] P. H. T. Costa and E. Dias Canedo, “Using a MDD approach to develop software systems”, 2015 10th Iberian Conference on Information Systems and Technologies (CISTI), pp. 1–6, 2015.

[56] “CWM,” OMG, 2003. Disponible: http://www.omg.org/spec/CWM/. [Último acceso: 28-Jul-2015].

[57] P. Denning, C. Martell, and V. Cerf., IEEE Xplore Book Home Page - Great Principles of Computing. MIT Press, 2015.

[58] E. Rodrigues, M. Bernardino, L. Costa, A. Zorzo, and F. Oliveira, “PLeTsPerf - A Model-Based Performance Testing Tool”, 2015 IEEE 8th International Conference on Software Testing, Verification and Validation (ICST), pp. 1–8, 2015.

Page 139: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

131

[59] S. Herbold, A. De Francesco, J. Grabowski, P. Harms, L. M. Hillah, F. Kordon, A.-P. Maesano, L. Maesano, C. Di Napoli, F. De Rosa, M. A. Schneider, N. Tonellotto, M.-F. Wendland, and P.-H. Wuillemin, “The MIDAS Cloud Platform for Testing SOA Applications”, 2015 IEEE 8th International Conference on Software Testing, Verification and Validation (ICST), pp. 1–8, 2015.

[60] A. Ati, “An Automatic Transformation From COSA Software Architecture To EJB Platform”, 2008 3rd International Conference on Information and Communication Technologies: From Theory to Applications, pp. 1–6, 2008.

[61] F. Jarray, H. Chniter, and M. Khalgui, “New adaptive middleware for real-time embedded operating systems”, 2015 IEEE/ACIS 14th International Conference on Computer and Information Science (ICIS), pp. 610–618, 2015.

[62] A. B. H. Ali, M. Khalgui, and S. Ben Ahmed, “UML MARTE-based design of reconfigurable distributed embedded control systems”, 2013 IEEE International Conference of IEEE Region 10 (TENCON 2013), pp. 1–4, 2013.

[63] A. Di Marco and S. Pace, “Model-driven approach to Agilla Agent generation”, 2013 9th International Wireless Communications and Mobile Computing Conference (IWCMC), pp. 1482–1487, 2013.

[64] S. Tucci-Piergiovanni, C. Mraidha, E. Wozniak, A. Lanusse, and S. Gerard, “A UML Model-Based Approach for Replication Assessment of AUTOSAR Safety-Critical Applications”, 2011IEEE 10th International Conference on Trust, Security and Privacy in Computing and Communications, pp. 1176–1187, 2011.

[65] X. Qiu and L. Zhang, “Providing Support for Specifying Redundancy Tactics Using Aspect-Oriented Modeling”, 2013 13th International Conference on Quality Software, pp. 183–186, 2013.

[66] O. Ongsiriporn and T. Senivongse, “UML profile for fault tolerance patterns for service-based systems”, The 2013 10th International Joint Conference on Computer Science and Software Engineering (JCSSE), pp. 240–245, 2013.

[67] M. Gogolla, M. Kuhlmann, and L. Hamann, “Consistency, independence and consequences in UML and OCL models”, Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), vol. 5668 LNCS, pp. 90–104, 2009.

[68] H. M. Chavez, “Formalization of UML Composition in OCL”, 2012 IEEE/ACIS 11th International Conference on Computer and Information Science, pp. 675–680, 2012.

[69] M. T. T. That, S. Sadou, and F. Oquendo, “Using Architectural Patterns to Define Architectural Decisions”, 2012 Joint Working IEEE/IFIP Conference on Software Architecture and European Conference on Software Architecture, pp. 196–200, 2012.

Page 140: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

132

Page 141: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

133

Apéndice A

Especificaciones OMG

Construcciones básicas utilizadas por MOF

MOF usa cinco construcciones básicas para definir un lenguaje de modelado de las

cuales vimos dos (clase y atributo):

Clases: usadas para definir tipos de elementos en un lenguaje de modelado. Por

ejemplo, la relación de dependencia de UML es una clase definida en MOF, que

representa el tipo de todas las dependencias que pueden crearse en un modelo UML.

Generalización: define herencia entre clases. Por ejemplo UML Classifier es una

generalización de UML Class. La subclase hereda todas las características de la clase

padre.

Atributos: usados para definir propiedades de elementos del modelo. Los atributos

tienen un tipo y una multiplicidad.

Asociaciones: definen relaciones entre clases. Una relación tiene dos extremos, cada

uno de los cuales puede tener definido un nombre de rol, navegabilidad y multiplicidad

Operaciones: definen operaciones dentro del ámbito de una clase, junto con una lista

de parámetros.

Las construcciones básicas de MOF permiten construir el lenguaje UML. A

continuación se describen los metamodelos correspondientes a los paquetes de UML

especificados en la Superestructura definidos por la OMG. En UML un diagrama es en

realidad más que una colección de elementos de notación. Por ejemplo, un diagrama

de clase puede contener una clase, una asociación y otros elementos. A continuación

se presenta un diagrama de clases con los principales elementos y su descripción

correspondiente.

Page 142: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

134

Metamodelo Diagrama de Clases

El diagrama de clases fue extraído de [7] como se muestra en la figura A1 y define los

constructores para el modelado basado en clases.

Figura A.1: Diagrama de clases del paquete Kernel.

Diagramas UML

Un diagrama es la representación gráfica de un conjunto de elementos con sus

relaciones. En concreto, un diagrama ofrece una vista del sistema a modelar. Para

poder representar correctamente un sistema, UML ofrece una amplia variedad de

diagramas para visualizar el sistema desde varias perspectivas. UML incluye los

siguientes diagramas:

Diagrama de colaboración.

Diagrama de casos de uso.

Diagrama de clases.

Diagrama de objetos.

Diagrama de secuencia.

Diagrama de estados.

Diagrama de actividades.

Page 143: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

135

Diagrama de componentes.

Diagrama de despliegue.

Para modelar el comportamiento dinámico del sistema están los de interacción,

colaboración, estados y actividades. Los diagramas de componentes y despliegue

están enfocados a la implementación del sistema.

En resumen, UML resuelve de forma bastante satisfactoria un viejo problema del

desarrollo de software como es su modelado gráfico. Además, se ha llegado a una

solución unificada basada en lo mejor que había hasta el momento, lo cual lo hace

todavía más excepcional.

Sintaxis UML para Diagramas de Clase

1. Representación de una clase

· Una clase se representan como un rectángulo dividido en tres partes (tres

compartimentos).

· En el compartimento superior, centrado, va el nombre de la clase.

· El segundo compartimento contiene los atributos, en la forma:

visibilidad nombreAtributo: tipo

· El tercer compartimento contiene los métodos, en la forma:

visibilidad nombreMétodo(parámetros): tipoRetorno.

· Los parámetros van separados por comas y se especifica el nombre y el tipo.

· Los constructores no tienen tipo de retorno.

· La visibilidad, de atributos y métodos, puede ser:

- privado

+ público

# protegido

~ de paquete

Page 144: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

136

Ejemplo figura A.2 :

Figura A.2: Notación gráfica de una clase.

Es posible representar una clase usando sólo el compartimento del nombre, o el

compartimento del nombre y uno de los dos siguientes (atributos o métodos). Cuando

se representa una clase de esta forma no es posible deducir nada de los

compartimentos faltantes.

Ejemplo figura A.3 :

Figura A.3: Ejemplo de clases.

2. Paquetes

· Un paquete se representa de la siguiente forma, ver figura A.4:

Figura A.4: Notación gráfica de paquete.

La relación de un paquete con las clases que contiene, se representa como se ilustra

en la figura A.5 :

Page 145: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

137

Figura A.5: Paquete con clases.

En un diagrama de clases, cuando se desea incluir una clase en otro paquete se

escribe, en el compartimento correspondiente al nombre de la clase, el nombre del

paquete seguido de dos puntos. Como se muestra en la figura A.6 :

Figura A.6: Citar clase de otro paquete.

3. Herencia

· La herencia se representa con una línea continua que va de la clase hija a la clase

padre, y que termina en un triángulo vacío (Fig. A.7).

Figura A.7: Ejemplo gráfico de herencia.

En el ejemplo anterior la clase Cuadrado es hija de la clase FiguraGeométrica y

hereda todos sus atributos y métodos. En este caso sólo es necesario mostrar los

métodos que se sobrescriben. Es decir, cuadrado sobrescribe el método área, pero no

el método perímetro, aunque tiene ambos métodos.

Page 146: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

138

4. Asociación

· Una asociación (relación entre dos clases) se representa como una línea continua

entre dos clases, y puede tener el nombre de la relación sobre esta línea (figura A.8).

Figura A.8: Ejemplo de asociación bidireccional.

En el ejemplo anterior cada Avión tiene una relación con Piloto, pero también cada

Piloto tiene relación con Avión. Esta es una relación en ambos sentidos.

Para mostrar que la relación sólo tiene un sentido se muestra con una flecha que

indica el sentido de la relación (figura A.9).

Figura A.9: Ejemplo de asociación unidireccional.

En este ejemplo un Pasajero conoce el Avión (o aviones) con el cual viaja, pero el

Avión no tiene ninguna relación con los Pasajeros. Para determinar cuántos objetos de

cada clase participan en una relación (multiplicidad), se escribe el rango de la forma:

límiteInferior, límiteSuperior (tabla. A.1).

Tabla A-1: Multiplicidad de una asociación.

· La multiplicidad se muestra en el extremo “destino” de la relación (figura A.10) :

Figura A.10: Ejemplos de multiplicidad de una asociación.

En este caso las relaciones son:

- Un Piloto tiene relación con cero o más aviones.

Page 147: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

139

- Un Avión tiene relación con uno, dos o tres pilotos.

- Una Aerolínea tiene relación con cero o muchos aviones.

- Un Avión tiene relación con una Aerolínea.

Aunque estas relaciones se traducirán en atributos en las clases, estos atributos no se

muestran en el diagrama de clases.

5. Interfaces

· Una interfaz se puede representar como una clase. En el primer compartimento del

rectángulo debe ir la palabra “interfaz” encerrada en símbolos de << y >>. En los otros

compartimientos, se trabaja igual que con las clases (figura A.11).

Figura A.11: Ejemplo gráfico de una interfaz.

Para mostrar que una clase implementa una interfaz, se utiliza una línea punteada

desde la clase hacia la interfaz, que termina en un triángulo vacío (figura A.12).

Figura A.12: Ejemplo gráfico implementación de una interfaz.

Diagrama de Interacciones

Las Interacciones modelan aspectos dinámicos de un sistema

Una interacción es un comportamiento que incluye un conjunto de mensajes que

intercambian entre sí un conjunto de objetos dentro de un contexto para lograr un

propósito.

Page 148: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

140

Figura A.13: Elementos del diagrama de Interacción/Secuencia.

Los aspectos dinámicos se modelan como flujos de control.

A través del intercambio de mensajes secuenciales sencillos como en la figura A.13, o

Flujos más complejos con bifurcaciones, iteraciones, recursión y concurrencia (figura

A.14). En los flujos más complejos se utilizan operadores de interacción. Los

operadores de interacción se aplican fragmentos del diagrama denominados

Combinedfragment, es decir, fragmentos combinados. Se representan como regiones

rectangulares dentro del diagrama que engloban parte de las interacciones del

diagrama. El tipo de operador se indica en la etiqueta de la esquina superior

izquierda.�El cuerpo del operador (alcance) lo representan las líneas de vida que

abarca.

Message=Mensaje : define una

comunicación particular entre

líneas de vida de una

interacción.

ExecutionSpecification : unidad de

comportamiento dentro de la línea de vida

, cuya duración es representada por Start y

Finish (ExecutionOcurrenceSpecification :

momento de inicio o final de una

ExecutionSpecificacion)

Lifeline = Línea de vida :

representa un objeto como una

línea vertical punteada con un

rectángulo de encabezado y con

rectángulo a través de la línea

principal que denotan la

activación, es decir el período de

tiempo en el cual el objeto se

encuentra desarrollando alguna

operación.

Page 149: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

141

Figura A.14: Ejemplo de fragmento combinado con operador LOOP.

Operadores de interacción

Flujo de control

loop – repetir (iterar) un fragmento de interacción

opt – opcional (se ejecuta si se cumple una condición)

alt – selección entre varias alternativas (regiones separadas por líneas discontinuas

horizontales). Existe el “else”.

par – concurrencia (paralelismo entre las regiones definidas)

break – fragmento de ruptura elegido como alternativa al resto de la interacción

Orden

seq – ordenación débil (Secuenciación parcial)

strict – ordenación estricta

critical – fragmento atómico a efectos de validez

Combinedfragment: es

una expresión de

fragmento, definida por

un operador de

interacción y sus

operandos

InteractionOperator:

especifica la operación

definida para el fragmento

combinado.

Page 150: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

142

Causalidad

assert – requerido (el fragmento representa una aserción)

neg – “no puede ocurrir” (especificación negativa)

ignore / consider – listas de mensajes a ignorar o a considerar

Diagrama de Estados

El Diagrama de Estados modela el comportamiento de una parte del sistema

El comportamiento es modelado en términos del estado en el cual se encuentra el

objeto, qué acciones se ejecutan en cada estado y cuál es el estado al que transita

después de un determinado evento.

Cada objeto está en un estado en cierto instante y el estado está caracterizado

parcialmente por los valores algunos de los atributos del objeto. El estado en el que se

encuentra un objeto determina su comportamiento. Los diagramas de Estados son

grafos dirigidos y en UML son deterministas. Los estados inicial y final están

diferenciados del resto. La transición entre estados es instantánea y se debe a la

ocurrencia de un evento. Los principales elementos del diagrama de estados son

Estados y Transiciones.

Figura A.15: Diagrama de estados.

Máquina de Estados UML

Una máquina de estados describe el comportamiento de un proceso (clase activa) o

de una operación (a través de un method). La máquina de estados de UML 2 es una

notación gráfica definida para una máquina de estados finitos comunicados. Provee

una vista de la máquina con foco en sus estados. Si su máquina de estados

implementa el comportamiento de una operación, quiere decir que la operación define

la especificación.

A B Evento [condición] / Acción

Estado

State

Transición

Transition

Page 151: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

143

La máquina de estados tiene dos elementos principales: State y Transition. Transition

conecta dos State. Siempre hay un State donde está posicionada la máquina de

estados. Este es el State activo. Al comienzo de una ejecución siempre está en el

estado inicial, que en un proceso solo debe ser uno. La máquina de estados ingresa

en otro estado a través de la conexión de una Transition. Desde el State activo se

dispara una Transition originada por un evento.

En este perfil hay cuatro suposiciones respecto de la máquina de estados:

• La máquina de estados es ejecutada secuencialmente.

• Una actividad solo puede ser ejecutada sobre transiciones

• Solo hay un evento externo simple que lee desde la cola de entrada. El próximo

evento externo solo será leído desde la cola de entrada si no hay transición

seleccionable desde el estado activo, el cual es habilitado y disparado (principio de

run-to-completion).

• Las guardas de transición no tienen efectos colaterales.

• Los eventos que no pueden disparar ninguna transición son descartadas

silenciosamente a menos que sean diferidos.

Una máquina de estados parte el procesamiento de eventos en pasos simples. La

semántica del perfil está basada en el hecho de que cada evento es colocado en una

cola de entrada y procesado por turnos. Cada evento es capaz de invocar un trigger

que es procesado por un paso denominado run-to-completion (RTC). Si un paso RTC

está pendiente, es despachado a la máquina de estados después que el paso previo

RTC ha sido completado.

SEMANTICA DE RUN-TO-COMPLETION

La ejecución semántica de una máquina de estados UML contiene una secuencia de

pasos run-to-completion (RTC).En particular, un paso es un cambio desde una

configuración (estado activo, variables, colas) a otro de la máquina de estados. Al

comienzo, la secuencia de pasos comienza en la configuración inicial de la máquina

de estados con variables inicializadas por defecto o valores predefinidos y colas de

signo vacío. Una transición múltiple representa la cadena de transición completa entre

dos estados. En un paso RTC de una configuración, un evento es obtenido desde la

Page 152: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

144

cola de entrada de eventos. Estos disparan la selección de un conjunto consistente de

transiciones múltiples habilitadas – salidas desde el estado de la configuración en uso

y sus guardas son satisfechas. Si tal conjunto – paso – existe, todas sus transiciones

múltiples son ejecutadas sucesivamente. En particular, cuando un evento es

despachado ello puede resultar que una o múltiples transiciones son habilitadas

dependiendo de los triggers de las transiciones. Especialmente, solo transiciones que

son disparados por el tipo de evento correspondiente puede ser habilitado. Si no hay

transiciones habilitadas, el evento disparador es silenciosamente descartado sin

ningún efecto por defecto. Para evitar esta pérdida de un evento disparador, un trigger

puede ser especificado como deferred en el estado activo. Por lo cual, el trigger puede

ser procesado más tarde. La máquina de estados selecciona un subconjunto de

transiciones habilitadas y las ejecuta. Esto toma la máquina de estados en una nueva

configuración activa de máquina de estados. Este cambio de configuración de la

máquina de estados se llama un paso.

Nota : Guardas (guard): condición que permite controlar el disparo de una transición.

Región

Una región es una parte ortogonal de una máquina de estados o de un estado

compuesto. Contiene estados y transiciones. Una región habilita la concurrencia

dentro de la especificación de una máquina de estados. Como en este perfil no se

trabaja con concurrencia debe haber solo una «region» dentro de una especificación

de una «stateMachine».

State

Un «state» representa una condición particular en la cual la máquina de estados

espera por un evento. Este evento puede ser un trigger por ejemplo. Una transición

también puede ser interpretada como el resultado de una condición que se evalúa a

true, esta condición específica se llama guarda. Una transición conecta dos estados o

pseudoestados uno con otro, pero con un estado fuente y un estado destino en un

conjunto ordenado. El próximo estado puede ser considerado alcanzable en un

instante, posiblemente sin consumir tiempo del sistema.

Page 153: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

145

Transition

Una transición es un link directo entre un estado fuente y uno destino. Una transición

puede ser parte de una transición compuesta. Una transición compuesta representa el

camino completo de todas las transiciones ejecutadas como reacción de la máquina

de estados a la ocurrencia de un evento de un tipo particular.

Page 154: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

146

Page 155: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

147

Apéndice B

OCL

El ejemplo de la figura B.1 se emplea para explicar los distintos elementos del lenguaje

OCL.

Figura B.1: Ejemplo Diagrama de Clase.

Self

Cada expresión OCL se escribe en el contexto de una instancia de un tipo específico.

En una expresión OCL, la palabra reservada self se usa para referir a la instancia

contextual. Por ejemplo, si el contexto es Company, entonces self se refiere a una

instancia de Company.

Especificando el Contexto UML

El contexto de una expresión OCL dentro de un modelo UML puede ser especificado a

través de una bien llamada declaración de contexto al comienzo de una expresión

OCL. La declaración de contexto de las restricciones se muestra en las siguientes sub

clausulas. La declaración de contexto es opcional.

Invariantes

La expresión OCL puede ser parte de una Invariante la cual es una Constraint

estereotipada como un «invariant». Cuando la invariante está asociada con un

Clasificador, se lo refiere como un “type” en la clausula. Una expresión OCL es un

invariante del tipo y debe ser verdadero para todas las instancias de aquel tipo en

Page 156: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

148

cualquier momento. (Todas las expresiones OCL que expresan invariantes son del tipo

Boolean.) Por ejemplo, si el contexto del tipo Company en la Figura B.1, la siguiente

expresión especificaría un invariante en la que el número de empleados siempre debe

exceder 50:

context Company inv:

self.numberOfEmployees > 50

Donde self es una instancia de tipo Company. Esta invariante mantiene para cada

instancia del tipo Company. El tipo de la instancia contextual de una expresión OCL, el

cual es parte de un invariante, está escrito con la palabra clave Context, seguido por el

nombre del tipo. La etiqueta inv: declara la restricción como «invariant».

Context Company inv:

self.numberOfEmployees > 50

En la mayoría de los casos, la palabra reservada self puede ser evitada porque el

contexto es claro. Como alternativa para self, se puede definir un alias en lugar de self.

Por ejemplo:

Context c : Company inv:

c.numberOfEmployees > 50

Esta invariante es equivalente a la anterior. Opcionalmente el nombre de la restricción

puede ser escrito después de la palabra clave inv, que permite a la restricción ser

referenciada por el nombre.

En el siguiente ejemplo el nombre de la restricción es enoughEmployees.

context c : Company inv enoughEmployees:

c.numberOfEmployees > 50

Pre- y Postcondiciones

La expresión OCL puede ser parte de una Precondition o Postcondition,

correspondiente a los estereotipos «precondition» y «postcondition» de una restricción,

asociadas con una Operación u otras características de comportamiento. La instancia

contextual self entonces es una instancia del tipo que posee la operación o método

como una característica. La declaración de contexto en un OCL usa la palabra clave

Context, seguida por el tipo y la declaración de la operación. El estereotipo de la

Page 157: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

149

restricción contiene las etiquetas ‘pre:’ y ‘post:’ antes que las Preconditions y

Postconditions reales. Por ejemplo:

Context Typename::operationName(param1 : Type1, ... ): ReturnType

pre : param1 > ... post: result = ...

El nombre self se puede usar en la expresión que refiere al objeto en el cual la

operación fue llamada. La palabra reservada result denota el resultado de la

operación, si existe. Los nombres de los parámetros (param1) se pueden usar en la

expresión OCL. En el diagrama ejemplo, se puede escribir:

Context Person::income(d : Date): Integer

post: result = 5000

Opcionalmente, el nombre de la precondición o postcondición puede ser escrito

después de la palabra clave pre o post, que permite a la restricción ser referenciada

por el nombre. En el siguiente ejemplo el nombre de la precondición es parameterOk

y el nombre de la postcondición es resultOk. En el metamodelo UML, estos nombres

son los valores del atributo name de la metaclase Constraint que es heredada desde el

ModelElement.

Context Typename::operationName(param1 : Type1, ... ): ReturnType

pre parameterOk: param1 > ...

post resultOk : result = ...

Package Context

La declaración de contexto anterior es demasiado precisa cuando el paquete en el

cual el Clasificador incumbe es claro desde el medio ambiente. Para especificar

explícitamente en el cual el paquete es invariante, pre o postcondition. Estas

restricciones pueden ser encerradas entre las sentencias 'package' y 'endpackage'.

Las sentencias package tiene la sintaxis:

Package Package::SubPackage

Context X inv:

... alguna invariante ...

Page 158: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

150

Context X::operationName(..)

pre: ... alguna precondición ...

endpackage

Un archivo OCL (o cadena) puede contener cualquier número de sentencias package,

permitiendo así a todas las invariantes, precondiciones, postcondiciones para ser

escritos y almacenados en un archivo. Este archivo puede co-existir con modelo UML

como una entidad separada.

Expresión Operación

Valores Inicial y Derivado

Una expresión OCL puede ser usado para indicar el resultado de una operación de

consulta. Esto puede ser hecho usando la siguiente sintaxis:

Context Typename::operationName(param1 : Type1, ... ): ReturnType

body: -- alguna expresión

La expresión debe ajustarse al tipo de resultado de la operación. Como en las pre y

postcondiciones, los parámetros se pueden usar en la expresión. Las expresiones pre,

postcondiciones, y body se pueden mezclar juntas después de un contexto de

operación. Por ejemplo:

Context Person::getCurrentSpouse() : Person

pre: self.isMarried = true

body: self.mariages->select( m | m.ended = false ).spouse

Una expresión OCL se puede usar para indicar el valor inicial o derivado de un atributo

o un extremo de asociación. Esto puede ser hecho usando la siguiente sintaxis:

Context Typename::attributeName: Type

init: -- una expresión que representa el valor inicial

context Typename::assocRoleName:

Type derive: -- una expresión que representa la regla de derivación

Page 159: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

151

La expresión debe ajustarse al tipo del resultado del atributo. En el caso de que el

contexto sea un extremo la expresión debe ajustarse al clasificador en ese extremo

cuando la multiplicidad es a lo sumo uno, o Set, o OrderedSet cuando la multiplicidad

es mayor a uno. Las expresiones Inicial y de derivación pueden ser mezcladas juntas

después de un contexto. Por ejemplo:

Context Person::income : Integer

init: parents.income->sum() * 1% -- dinero de bolsillo

derive: if underAge

then parents.income->sum() * 1% -- dinero de bolsillo

else job.salary – ingresos del trabajo regular

endif

La restricción de derivación debe ser satisfecha en cualquier momento, por lo tanto, la

derivación incluye la inicialización. Los dos se permiten en la misma property pero no

deben ser contradictorios. Por cada property debería haber al menos una restricción

de inicialización y al menos una restricción de derivación.

Otros tipos de Expresiones

Tipos y valores básicos.

Cualquier expresión OCL se puede usar como el valor de un atributo de una Expresión

de metaclase UML o uno de sus subtipos. En OCL, un número de tipos básicos están

predefinidos y disponibles para el modelador en todo momento. Estos tipos de valores

predefinidos son independientes de cualquier modelo de objeto y son parte de la

definición de OCL. El valor más básico en OCL es un valor de uno de los tipos

básicos. Los tipos básicos de OCL, con los ejemplos correspondientes de sus valores,

son mostrados en la tabla B.1. OCL define un número de operaciones sobre los tipos

predefinidos. La tabla da algunos ejemplos de las operaciones en los tipos

predefinidos.

Page 160: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

152

Tabla B-1: Tipos OCL básicos y sus valores.

OCL define un número de operaciones sobre los tipos predefinidos. La tabla B.2 da

algunos ejemplos de operaciones en los tipos predefinidos.

Tabla B-2: Ejemplos de operaciones matemáticas en los tipos predefinidos.

Tabla B-3: Ejemplos de operaciones de cadena en los tipos predefinidos.

Collection, Set, Bag, Sequence, y Tuple son tipos básicos también.

Tipos del Modelo UML

Tipo Enumeración

Expresiones Let

Cada expresión OCL está escrito en el contexto de un modelo UML, un número

de clasificadores (tipos/clases,…), sus características y asociaciones, y sus

generalizaciones. Todos los clasificadores del modelo UML son tipos en las

expresiones OCL que están embebidas en el modelo. Las Enumeraciones son

Datatypes en UML y tienen un nombre, como cualquier otro clasificador. Una

enumeración define un número de literales de enumeración que representan

los posibles valores de la enumeración. Dentro de OCL se puede referir al valor

de una enumeración. Cuando se tiene un Datatype denominado Gender en el

Page 161: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

153

modelo ejemplo con los valores ‘female’ o ‘male’ que se pueden emplear de

esta manera:

Context Person inv: gender = Gender::male

Algunas veces una sub-expresión es usada más de una vez en una constraint. La

expresión let expression permite definir una variable que puede ser usada en la

restricción.

Context Person inv:

let income : Integer = self.job.salary->sum() in

if isUnemployed then income < 100 else income >= 100 endif

Una expresión puede ser incluida en cualquier clase de expresión OCL. Solo es conocido

dentro de su expresión específica. Una declaración de variables dentro de un let debe tener un

tipo declarado y un valor inicial.

Operaciones adicionales/atributos a través de expresiones «definition»

La expresión Let permite a una variable ser usada en una expresión OCL. Para habilitar el

reúso de variables/operaciones sobre múltiples expresiones OCL se puede usar una restricción

con el estereotipo «definition», en el cual son definidas variables/operaciones auxiliares. Esta

restricción «definition» debe ser atachada a un Clasificador y puede contener solo definiciones

de variables y/o operaciones, nada más. Todas las variables y operaciones definidas en la

restricción «definition» son conocidas en el mismo contexto donde cualquier propiedad del

Clasificador puede ser usada. Tales variables y operaciones son atributos y operaciones con el

estereotipo «OclHelper» del clasificador. Ellos son usados en una expresión OCL exactamente

de la misma manera como se usan atributos y operaciones. La sintaxis de las definiciones del

atributo u operación es similar a la expresión Let, pero cada definición de atributo y operación

son establecidas con la palabra clave ‘def’ como se muestra.

Context Person

def: income : Integer = self.job.salary->sum()

def: nickname : String = ‘Little Red Rooster’

def: hasTitle(t : String) : Boolean = self.job->exists(title = t)

Las operaciones o atributos definidos por "expresiones de definición" pueden ser estáticos

como se muestra en el siguiente ejemplo.

Page 162: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

154

Context MyClass

static def : globalId() : Integer = ...

Los nombres de los atributos/operaciones en una expresión let pueden no estar en

conflicto con los nombres de los respectivos atributos/extremos y operaciones del

Clasificador.

Objetos y propiedades

Las expresiones OCL pueden referirse a clasificadores, atributos, fin de asociaciones,

métodos y operaciones (o métodos) de modelos UML. En un diagrama de clases, los

atributos, asociaciones finales, y operaciones (libre de efectos colaterales) son

propiedades dentro de las expresiones OCL.

Cabe mencionar que self hace referencia a un objeto, y “self.propiedad” se relaciona al

valor de una propiedad para self. En el siguiente ejemplo, se muestra cómo el valor de

una propiedad para un objeto se expresa a través de OCL.

Context Person inv:

self.isMarried

La forma de especificar el valor de un atributo en OCL, también es mostrado por medio

de un ejemplo. En este caso, la expresión “self.age” especifica el valor del atributo age

para una instancia de Person. Dicha expresión es expuesta en forma seguida.

Context Person inv:

self.age > 0

A partir de un objeto específico, es posible navegar una asociación de un diagrama de

clases para alcanzar a otros objetos. Esto se logra a partir de las asociaciones finales

de una asociación (el role name), tal como se muestra a continuación,

object.associationEndName

El valor de la expresión previa es el conjunto de objetos que están en el otro extremo

de associationEndName. Si la multiplicidad en el final de la asociación es “0..1” o 1, el

Page 163: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

155

resultado de la expresión es un objeto. Pero si la multiplicidad es “*”, el resultado es un

conjunto.

Context Company

inv: self.manager.isUnemployed = false

inv: self.employee->notEmpty()

En el ejemplo que se muestra, “self.manager” devuelve una instancia (un objeto) de la

clase persona ya que la multiplicidad del fin de asociación es uno. En cambio,

“self.employee” devuelve un conjunto, dado que la multiplicidad del fin de asociación

es superior a uno. Por defecto, la navegación a través de una asociación resulta en un

conjunto. Pero si la asociación está adornada con “{ordered}”, entonces resulta en un

conjunto ordenado (OrderedSet). El tipo Collect incluye a los tipos Set, OrderedSet,

Bag y Sequence. Como tipos predefinidos de OCL, tienen asociadas operaciones

predefinidas. Una propiedad de Collect se accede por medio del símbolo “->”, seguido

del nombre de la propiedad; por ejemplo,

Context Person inv:

self.employer->size() < 3

Figura B.2: Uso de operador oclAsType().

Cuando las propiedades se redefinen para un tipo, la propiedad de los supertipos

pueden ser accedida usando la operación oclAsType(). La utilidad de dicha operación

se evidencia en el ejemplo asociado a la figura B.2. La clase ModelElement tiene dos

subclases Note y Dependency. Si se desea acceder al atributo source, desde el

contexto Dependecy (el cual hereda de ModelElement), pueden surgir ambigüedades

que solo son resueltas a través del uso del operador oclAsType(). Esto queda explícito

en la siguiente restricción.

Page 164: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

156

Context Dependency

inv: self.oclAsType(Dependency).source->isEmpty()

inv: self.oclAsType(ModelElement).source->isEmpty()

Existen otras operaciones predefinidas que resultan de utilidad. Dos de las más

importantes son oclIsType y oclIsKindOf, cuya sintaxis se muestra a continuación,

oclIsTypeOf(t : OclType):Boolean

oclIsKindOf(t : OclType):Boolean

La operación oclIsTypeOf devuelve true si el tipo del self y “t” es el mismo; y

oclIsKindOf devuelve true si el self y “t” es el mismo o si es igual a su supertipo. En

forma seguida, se ejemplifica la utilización de la primera de dichas operaciones.

Context Person

inv: self.oclIsTypeOf( Person ) -- es verdadero

inv: self.oclIsTypeOf( Company) -- es falso

Page 165: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

157

Apéndice C

Métodos y atributos del metamodelo UML utilizados

allInstances (): Para referirse a todas las instancias de un elemento se aplica la

expresión allInstances. Por ejemplo Class.allInstances representa el conjunto de todas

las instancias de una clase, allInstances puede usarse en un elemento a la hora de

evaluar una expresión.

OwnedOperation: Para referirse a operaciones de un elemento ( interface, clase). Las

operaciones se definen por una signatura, es decir, contienen el nombre de la

operación y su parámetro.

Method: Implementa una operación, lo que implica describir su contenido.

Specification: Define las características de comportamiento que el comportamiento

implementa. Una especificación puede tomar distintas formas: actividad, máquina de

estados.

ownedParameter :Describe los parámetros de una operación.

direction: Define la dirección de un parámetro: de retorno, entrada, salida,

entrada/salida.

uml: ParameterDirectionKind: Enumeración que contiene la clase de parámetro al

que se está haciendo referencia: entrada/salida (in/out) o retorno (return). Por ejemplo

para preguntar si la dirección del parámetro de la operación de un objeto llamado

Objeto1 se puede formular:

Objeto1.ownedParameter.direction=uml::ParameterDirectionKind::return

Si el resultado es true la clase de dirección de un parámetro es de retorno

type : Define el tipo de un elemento (Class, Object). Por ejemplo el tipo de una

operación1 con una operación2:

operacion1.ownedParameter.type= operacion2.ownedParameter.type

Page 166: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

158

general : Refiere al elemento general (clasificador o clase abstracta) en una relación

de generalization (herencia). Por ejemplo si existe una relación de herencia entre la

clase1 y la clase2 :

clase2.general hace referencia a clase1

isAbstract : Es un atributo de clases y operaciones de tipo booleano que define a un

elemento de tipo abstracto. Por ejemplo si se definió la clase1 como clase abstracta:

clase1.isAbstract devuelve true como resultado

property: Es una característica estructural de un clasificador. Hace referencia a un

atributo de una clase o al extremo de una asociación.

attribute: Referencia a las properties , atributos directos de un clasificador.

Aggregation: Especifica el tipo de agregación del extremo de una asociación: puede

simbolizar una asociación, una agregación o una composición, es decir de tipo none,

aggregate o composite.

uml::AggregationKind: Enumeración que contiene los tipos de agregación existentes

y se usa en el momento de realizar una comparación. Por ejemplo para preguntar si el

tipo de agregación de un extremo de asociación es de tipo composite se puede

formular:

Atributo1.aggregation= uml::AggregationKind::composite si el resultado es true el

tipo de agregación es una composición.

relatedElement: En el caso de conocerse una relación pero no conocer los

elementos relacionados , con este atributo se consulta los elementos relacionados.

ownedStereotype: Referencia los estereotipos de un elemento (por ejemplo los

estereotipos de un paquete).

specification: Define las características de comportamiento que el comportamiento

implementa. Una especificación puede tomar distintas formas: actividad, máquina de

estados.

attribute: Referencia a las properties , atributos directos de un clasificador.

Message.allInstances(): Selecciona las instancias de tipo mensaje.

Page 167: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

159

Lifeline.allInstances(): Selecciona todos los objetos tipo lifeline.

MessageSort :Se refiere a la clase de comunicación reflejada por el mensaje.

Tipos de MessageSort: synchCall (sincrónica), asynchCall (asincrónica), asynchSignal

(Señal asincrónica), createMessage (mensaje de creación), deleteMessage (mensaje

de borrado), reply (respuesta).

covered: Referencia una lifeline (línea de vida) a partir de un fragmento de interacción

o de una ocurrencia dentro de una interacción.

represents: Referencia el tipo de una línea de vida , ya que cada línea de vida es de

un tipo de clasificador especifico.

coveredBy: Referencia el fragmento de la interacción dentro del cual se encuentra

una lifeline.

Expresiones del lenguaje ocl utilizadas

Para construir las restricciones sobre los elementos de la arquitectura se emplean

expresiones OCL. A seguir un resumen de dichas expresiones y su significado.

Context: Palabra reservada para indicar el contexto de una instancia particular. En el

caso de las restricciones definidas a continuación los elementos contextuales son

estereotipos que extienden una clase, clasificador, operación o paquete.

self: En una expresión OCL el nombre self indica una instancia del contexto.

oclIsTypeOf (): Devuelvo true si el tipo del objeto evaluado es igual al del argumento.

substring (inferior, superior): Selecciona un conjunto de caracteres de un string. Por

ejemplo el nombre de un elemento desde el carácter inferior hasta el carácter superior.

implies: Establece que si la primera parte de la expresión es verdadera entonces la

segunda parte debe ser verdadera, si la primera parte es falsa, no se conoce el valor

de la segunda parte.

->: Dado un conjunto de instancias, se hace referencia al conjunto a través de este

símbolo.

A partir del símbolo flecha se pueden aplicar las siguientes expresiones al conjunto

Page 168: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

160

exists (): Especifica que hay al menos un elemento de que cumple una condición

definida entre paréntesis.

select (): Se obtiene un subconjunto de una colección para los que una expresión es

verdadera.

notEmpty (): El conjunto de elementos no está vacío.

forAll: Especifica una condición que debe ocurrir para todos los elementos de una

colección

Page 169: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

161

Apéndice D

Uso de perfiles en Rational Software de IBM

A continuación se describe sintéticamente los pasos para crear un perfil en RSA. El primer paso

es crear un proyecto de tipo perfil UML. Para lo cual se hace click sobre el menú Archivo, y se

selecciona luego Nuevo. Aparece un menú del que se selecciona Otros. A continuación aparece

la pantalla de la figura D.1, se selecciona la carpeta Capacidad de extensión UML y de esa

carpeta Proyecto de perfil UML.

Figura D.1: Creación de proyecto de perfiles.

Se puede escribir el nombre del proyecto como se muestra en la figura D.2 que en nuestro

caso es EjemploPerfil.

Page 170: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

162

Figura D.2: Proyecto de perfil UML.

Una vez creado el proyecto se muestra una carpeta sobre el margen izquierdo del

menú y se selecciona la carpeta Perfil dentro de Diagramas. Haciendo click derecho

se selecciona Añadir Diagrama y Diagramade clase.

Figura D.3: Extensión de perfiles.

En el lateral derecho de la pantalla se puede observar la paleta de herramientas.

Figura D.4: Paleta de elementos gráficos.

Haciendo click sobre aparece el conjunto de metaelementos del

metamodelo UML. Se selecciona el metaelemento Class (figura D.4).

Page 171: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

163

Figura D.5 : Elementos del metamodelo UML.

Posteriormente se selecciona el elemento al que se le coloca un

nombre, en este caso patternappliedClass. Se selecciona luego el elemento

para dotar al estereotipo de las propiedades de la metaclase. El

resultado puede verse en la figura D.6.

Figura D.6: Ejemplo de perfil.

Una vez elaborado el diagrama , y corregido cualquier error dentro del diagrama se liberar el

perfil. Haciendo click derecho sobre la carpeta que se encuentra en el lateral

izquierdo ( ver figura D.3), aparece un menú donde se selecciona la opción

Figura D.7: Liberación de perfil.

Liberar y en un cuadro de dialogo colocar un nombre de etiqueta del perfil (figura D.7).

Page 172: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

164

Figura D.8 : Aplicación de perfiles.

En la definición de la arquitectura se han aplicado perfiles de los niveles 0 y 1, para

realizar esta acción a nuestro perfil ejemplo se clickea dos veces sobre y

aparece una pantalla, donde se selecciona la estiqueta Detalles. Dentro de esa

pantalla hay varios cuadros. Se realiza un click sobre del cuadro Perfiles

Importados y se muestra el cuadro de dialogo de la figura XX. Para escoger un perfil

del espacio de trabajo se selecciona la opción Perfil en espacio de trabajo y luego

.

Al aparecer el cuadro de dialogo de la figura D.9 se selecciona el perfil a importar. En

este caso se elige el PerfilNivel0 y se presiona , con lo que en el cuadro

Perfiles importados ahora aparace dicho perfil.

Page 173: Formalización de Patrones con Perfiles UML · es la Formalización de Patrones de Comportamiento desde Perfiles UML y especificaciones OCL. A través del estudio del metamodelo de

165

Figura D.9 : Perfil importado.

Si se observa la parte izquierda de la pantalla el ejemplo tiene, después de la importación,

agregados los estereotipos del perfil Nivel 0 (figura D.10).

Figura D.10 : Perfil Nivel 0 aplicado al ejemplo.