universidad politÉcnica de madrid - fi.upm.es · esta tesis se desarrolla un proceso para aplicar...

135
FACULTAD DE INFORMÁTICA UNIVERSIDAD POLITÉCNICA DE MADRID UNIVERSIDAD POLITÉCNICA DE MADRID FACULTAD DE INFORMÁTICA TRABAJO FIN DE CARRERA HERRAMIENTA DE SOPORTE DE PATRONES DE DISEÑO AUTORES: José María Pérez Vence & Alejandro García García TUTOR: Ana María Moreno Sanchez-Capuchino

Upload: hoangnguyet

Post on 29-Sep-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

FACULTAD DE INFORMÁTICA UNIVERSIDAD POLITÉCNICA DE MADRID

UNIVERSIDAD POLITÉCNICA DE MADRID

FACULTAD DE INFORMÁTICA

TRABAJO FIN DE CARRERA

HERRAMIENTA DE SOPORTE DE PATRONES DE DISEÑO AUTORES: José María Pérez Vence & Alejandro García García TUTOR: Ana María Moreno Sanchez-Capuchino

1

Resumen

En nuestros tiempos, el desarrollo del software es un negocio que mueve grandes cantidades

de recursos, tanto económicos como de personas. Es necesario desarrollar aplicaciones en

tiempos y esfuerzos cada vez más pequeños para mejorar la productividad del ejercicio. En

esta tesis se desarrolla un proceso para aplicar patrones de diseño software a diseños

específicos, mediante la creación de un sistema experto y una librería para generar

documentos de intercambio de metamodelos.

Abstract

Nowadays, development of software is a business that moves a large amount of resources,

both financial and people. It is necessary to develop applications in time and effort getting

smaller to improve the productivity of the exercise. In this thesis is developed a process to

apply software design patterns to specific designs by means of an expert system and a library

for generating metamodels exchange documents.

2

Índice

Resumen ........................................................................................................................................ 1

Abstract ......................................................................................................................................... 1

Índice ............................................................................................................................................. 2

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

1.1 Presentación del problema ........................................................................................... 4

1.2 Descripción de la estructura del documento ................................................................ 7

2 Material base – Directrices de usabilidad ............................................................................. 8

3 Objetivos ............................................................................................................................. 14

3.1 Roles y responsabilidades ........................................................................................... 14

3.1.1 Usuario/Desarrollador ......................................................................................... 14

3.1.2 Administrador y/o Experto .................................................................................. 14

3.2 Descripción de objetivos ............................................................................................. 15

3.2.1 Administración .................................................................................................... 15

3.2.2 Usuario/Desarrollador ......................................................................................... 16

3.3 Satisfacer objetivos ..................................................................................................... 17

3.3.1 Administración .................................................................................................... 17

3.3.2 Usuario/Desarrollador ......................................................................................... 18

4 Conocimientos ..................................................................................................................... 20

4.1 Sistema Experto ........................................................................................................... 20

4.2 UML ............................................................................................................................. 21

4.2.1 MOF ..................................................................................................................... 22

4.3 XML .............................................................................................................................. 23

4.4 XSD .............................................................................................................................. 24

4.5 Lógica funcional (Acciones, flujos y estados) .............................................................. 25

4.6 XMI .............................................................................................................................. 26

5 Investigación ....................................................................................................................... 27

5.1 Guía de diseño ............................................................................................................. 28

5.1.1.1 Generar xsd (XML SchemaDocument) ............................................................ 29

5.2 Guía de elicitación ....................................................................................................... 38

5.2.1 Bases de Datos .................................................................................................... 39

5.2.2 Generar XSD (XML SchemaDocument) ............................................................... 40

5.2.2.1 Automatizar la definición de responsabilidades. ............................................ 42

5.2.2.2 Manejo de modelos en el sistema. ................................................................. 43

3

5.3 Ofrecer modelos reusables ......................................................................................... 54

5.3.1 Primera aproximación ......................................................................................... 55

5.3.1.1 XML Data Binding ............................................................................................ 56

5.3.1.2 De XML a UML ................................................................................................. 61

5.3.1.3 Reflexiones de la primera aproximación ......................................................... 62

5.3.2 Segunda aproximación ........................................................................................ 63

5.3.2.1 XMI .................................................................................................................. 63

5.3.2.2 Aplicación de XMI en el proyecto .................................................................... 64

5.3.2.3 UMLGraph ....................................................................................................... 65

5.3.2.4 Otras librerías parecidas.................................................................................. 66

5.3.2.5 Construcción de una librería ........................................................................... 67

5.3.2.6 XMI & StarUML ................................................................................................ 67

5.3.2.7 Representación XMI ........................................................................................ 68

5.3.2.8 Representación en objetos ............................................................................. 99

5.3.3 Reflexiones de la segunda aproximación .......................................................... 100

6 Desarrollo .......................................................................................................................... 101

6.1 Especificación de Requisitos Software ...................................................................... 101

6.2 Diseño ........................................................................................................................ 104

6.2.1 Casos de uso ...................................................................................................... 104

6.2.2 Clases ................................................................................................................. 107

6.3 Implementación ........................................................................................................ 113

6.4 Instalación ................................................................................................................. 118

7 Resultados ......................................................................................................................... 119

8 Conclusiones y trabajos futuros ........................................................................................ 120

9 Bibliografía ........................................................................................................................ 121

Anexo 1. Patrones de usabilidad-Undo ..................................................................................... 123

4

1 Introducción

Este trabajo forma parte de una investigación que ha sido reflejada en dos proyectos final de

carrera. El otro proyecto final de carrera lleva por título “Herramienta de soporte de patrones

de diseño. Parte I. Administrador” y cuyo autor ha sido José María Pérez Vence. La estructura

común a ambos proyectos comprenderá la introducción, el material base, los objetivos y la

investigación A partir de este último capítulo mencionado, cada tomo particularizará su

proyecto en base al ámbito que desarrolla, Administrador o Usuario/Desarrollador.

Con este documento se pretende presentar una herramienta para ayudar a desarrolladores

software a la hora de incluir patrones de diseño a sus proyectos. Concretamente, el estudio de

aplicación se centra en patrones de usabilidad generados por investigadores del área de

Ingeniería del Software de la Facultad de Informática de la UPM. Sin embargo, posteriormente

veremos que el marco de uso del proceso/herramienta se extiende a cualquier patrón

software definido sobre un estándar descrito en la sección 2. Material Base.

1.1 Presentación del problema

El problema raíz al cual se plantea dar solución se podría resumir en la necesidad de

automatizar y simplificar el proceso mediante el cual un desarrollador software puede aplicar

un patrón de diseño a su proyecto, en tiempo y coste efectivos. Para ello se plantea la

construcción de una herramienta que dé soporte a dicho proceso.

El caso de uso base, es decir, el proceso manual que realiza un desarrollador para aplicar los

patrones, parte de la siguiente situación:

1. Un desarrollador quiere introducir en sus modelos un determinado patrón de

usabilidad (por ejemplo, “deshacer”).

2. Existen una serie de patrones de usabilidad ya creados por investigadores del área de

Ingeniería del Software de la UPM, cuyo formato es en papel y en el que se incluyen,

entre otros, una guía de responsabilidades a satisfacer por el sistema software que los

incluya y unos modelos de diseño genéricos que se particularizarán en función de las

responsabilidades elegidas.

3. El desarrollador define aquellas responsabilidades que necesita incluir.

4. El patrón indica qué componentes del modelo genérico son aplicables según las

responsabilidades elegidas.

5. El desarrollador construye sus modelos específicos teniendo en cuenta los

componentes de los modelos genéricos recomendados en los patrones.

5

A medida que profundizamos en ello, determinamos varios problemas inherentes al

mencionado y con tal peso que formaría el groso de una fase de investigación previa a la

resolución del presente trabajo.

Como hemos indicado, partimos de unos patrones en formato papel que contienen modelos

de diseño y un conjunto de responsabilidades, más adelante en la sección 2. Material base –

Directrices de usabilidad, se explicara cómo están definidos los patrones de diseño, pero a este

nivel podemos definir los modelos de diseño como diagramas de diseño y las

responsabilidades como flujos y estados, ¿cómo los introducimos en nuestro sistema? ¿Cómo

podemos modificarlos en función de las necesidades del usuario? ¿Cómo manejar los flujos de

todos los patrones otorgando una cierta ambigüedad para que la solución esté abierta para la

inclusión de patrones sin tener que modificar el sistema? Y, finalmente, ¿cómo ofreceremos el

resultado una vez terminado el proceso, para que los modelos puedan ser utilizados por el

desarrollador?

Todas estas cuestiones son, a alto nivel, con las que nos hemos encontrado y a las que da

solución el proceso que hemos definido.

Con el fin de tener una visión más clara del mismo, a continuación se muestra en la figura 1

como se representa el proceso a modo de caja negra:

Figura 1: proceso genérico de uso de los patrones

6

La explicación de la figura 1 es muy simple. A través de una guía de elicitación y de las

respuestas proporcionadas por el usuario se construye documentos específicos. La guía de

elicitación expresa el procedimiento para la construcción de un sistema software. Se pretende

conseguir un sistema que a partir de la documentación en papel y de las respuestas que indica

un usuario, genere documentación y modelos de diseño personalizados.

Este es el primer ejemplo donde podemos diferenciar claramente la separación del trabajo en

dos. Una parte estará encargada de la administración interna del proyecto, más

concretamente en cómo introducir los documentos proporcionados en el sistema. La otra

parte se encarga de transformar la información que conforma el sistema en documentos

personalizados gracias a la aportación de un usuario, es decir, estará dirigida a un

usuario/desarrollador.

7

1.2 Descripción de la estructura del documento

En esta sección describiremos la estructura de la que está compuesta esta tesis.

Primeramente, explicaremos de manera detallada en qué consiste el material proporcionado

por el departamento de Ingeniería del Software de la UPM, es decir, analizaremos en

profundidad los patrones de usabilidad proporcionados y qué podemos extraer de esta

información.

A continuación describiremos los objetivos. Puesto que la investigación ha sido divida en dos

trabajos, los objetivos están divididos separando el trabajo general a realizar por roles. De esta

forma, se irá componiendo el documento en base a estos roles.

Una vez descritos los objetivos, debemos realizar una explicación sobre los conceptos que

vamos a manejar a lo largo del trabajo.

Más adelante entraremos en la investigación. En la investigación se ha seguido dividiendo el

trabajo en partes más pequeñas siguiendo los objetivos sobre los que se ha investigado y por

tanto, que se han abordado en la etapa de investigación.

Después, explicaremos el desarrollo de la aplicación realizada para solventar el problema

adherido al rol que documenta esta tesis.

De manera resumida, la estructura del documento consta de:

Material Base – Directrices de usabilidad

Objetivos

o Usuario/Desarrollador

o Administrador

Conocimientos (Antecedentes)

Investigación

o Introducir modelos en el sistema

o Automatizar la definición de responsabilidades

o Manejo de modelos en el sistema

o Ofrecer modelos reusables

Desarrollo

Resultados

Conclusiones y trabajos futuros

Bibliografía

8

2 Material base – Directrices de usabilidad

Como hemos indicado, inicialmente partimos de la necesidad de automatizar el proceso

mediante el que se aplican los patrones de usabilidad facilitados por el departamento de

Ingeniería del Software. Estos patrones consisten en unas directrices de usabilidad que

redactan de forma completa la descripción y el uso de cada uno de los patrones. El documento

original relativo al patrón de usabilidad “Undo”, se proporciona en el Anexo1.

Cada patrón facilitado se compone de una serie de pautas y recomendaciones a seguir para

llevar a cabo su implementación. Cada guía consta de:

- Resumen: primer acercamiento al patrón donde se explica de manera muy resumida

en qué consiste, que problemas resuelve, en qué tipo de contexto podemos

encontrarnos ese problema, mecanismos que incluye, familia a la que pertenece, etc.

Figura 2: Resumen

9

- Tabla Guía de Elicitación de Usabilidad: esta tabla agrupa los diferentes aspectos que

iremos desglosando más profundamente en los siguientes módulos. Es decir, por cada

recomendación que da el HCI, se relaciona por un lado con métodos de elaboración

del patrón, por otro las preguntas que deben realizarse a los usuarios y por último,

muestra unos ejemplos.

Figura 3: guía de elicitación

- Modelo de Casos de Uso: diagrama general y completo de los casos de uso del patrón.

Figura 4: modelo de casos de uso

10

- Agrupación de las responsabilidades del sistema: diagrama de estado del sistema

donde se muestra de forma gráfica las responsabilidades del sistema. A través de esta

guía elaboraremos el flujo y los estados que contendrá el formulario final.

Figura 5: responsabilidades del sistema

Abreviaturas y significado:

[Id]_Q[n]

[Id]_L[n]

U_Q1: Pregunta 1 del patrón Undo.

U_L3: Lista 3 del patrón Undo.

[Id] Identificador de patrón

[n] Número de orden Q Pregunta L Lista

11

- Tabla Guía de Diseño Genéricas: relaciona las responsabilidades del sistema con sus

componentes de forma genérica.

Figura 6: guía de diseño general

- Tabla Guía de Diseño Concreta: relaciona las responsabilidades del sistema con sus

componentes a nivel de objeto.

Figura 7: guía de diseño específica

12

- Diagrama de clases: Diagrama de clases completo del patrón.

Figura 8: modelo de clases

13

- Diagramas de secuencia: un diagrama de secuencia por cada interacción.

Figura 9: modelo de interacción

Todas estas directrices muestran cada patrón de forma completa, es decir, de algún modo

debemos mapear esta información genérica a elementos software para que en fases

posteriores dichos elementos software puedan ser particularizados según las decisiones del

usuario.

Como podemos apreciar, existe una clara clasificación de los elementos facilitados en las

directrices:

Documentación en formato gráfico UML: disponemos de los tres tipos de modelos

más útiles y comunes: modelo de casos de uso, modelo de secuencia y modelo de

clases.

Documentación en formato flujo de estados: corresponde a la Agrupación de las

responsabilidades del sistema. El flujo muestra las responsabilidades que debe

tener el diseño que estamos creando en función de ciertas condiciones.

Documentación en formato de texto o tabla: el formato del resto de la

documentación facilitada corresponde con algún tipo de formato office.

14

3 Objetivos

Una vez planteado el problema del cual partimos, automatizar el proceso mediante el cual un

usuario/desarrollador puede aplicar patrones a sus diseños, podemos pasar a la siguiente fase.

Ésta se centra en determinar los objetivos del proyecto, describirlos y definir cómo van a ser

satisfechos. Así mismo, se especificarán los roles y responsabilidades de los participantes del

sistema.

3.1 Roles y responsabilidades

Antes de explicar en qué consisten los objetivos, explicaremos los roles y responsabilidades de

los actores involucrados en el sistema. Posteriormente, una vez conocidos los roles, podremos

comprender la separación lógica establecida a lo largo de toda la tesis.

3.1.1 Usuario/Desarrollador

El usuario/desarrollador será nuestra base de respuesta y tendrá la responsabilidad de la

solución obtenida por el sistema. Deberá ir respondiendo a las preguntas que el sistema le irá

proponiendo y de forma totalmente transparente se irá conformando el resultado que se

entregará como fin. No es necesario que tenga claro que patrones usará y de qué manera,

puesto que es lo que va a obtener del sistema, pero si deberá tener un conocimiento previo

sobre qué y en qué formato va a obtener la respuesta. Por lo tanto estamos hablando de que

el usuario deberá ser un actor especializado, que tenga conocimientos de diseño software.

3.1.2 Administrador y/o Experto

El administrador será el encargado de introducir la base de conocimientos, es decir, de que el

sistema experto contenga toda su inteligencia/lógica para desarrollar las preguntas y que a

partir de las respuestas pueda también construir el resultado personalizado. En ciertas

ocasiones, el administrador también podrá actuar como usuario/desarrollador en caso de que

éste sea el que introduzca los datos (respuestas) en el sistema. El administrador incorporará

todo el conocimiento necesario al sistema a través de una importación de datos externos.

15

3.2 Descripción de objetivos

A continuación se listan los objetivos que se han fijado. Se engloban en dos grupos definidos

en base al destino: Administración y Usuario/Desarrollador.

3.2.1 Administración

Introducir modelos a nuestro sistema.

Los modelos de diseño asociados a cada patrón son diagramas de casos de uso, clases y

colaboración en formato UML. Es necesario definir un procedimiento a través del cual

mapear dichos diagramas a elementos que una aplicación informática pueda tratar.

Ambigüedad para el intercambio de conocimiento.

El sistema no debe ser estático, sino que debe ser capaz de procesar y asimilar nuevo

conocimiento, en forma de nuevos patrones o modificaciones en los mismos. De este

modo, es necesario que el conocimiento no esté embebido en el sistema.

Ofrecer modelos reusables.

Puesto que el fin más primitivo del proyecto es ofrecer la posibilidad de obtener modelos

basados en unos patrones genéricos, es de vital importancia que los modelos que

ofrezcamos tengan un formato que pueda ser utilizado en cuantos más ámbitos mejor. Por

tanto es necesario estudiar los estándares y tendencias sobre el modelado de diseño para

que el producto final posea el valor de seguir un estándar extendido y que las aplicaciones

actuales (y futuras) puedan utilizarlo.

16

3.2.2 Usuario/Desarrollador

Automatizar la definición de responsabilidades.

Puesto que cada patrón contiene un conjunto de responsabilidades que pueden incluirse o

no al resultado final, es necesario crear un flujo mediante el que el sistema sea capaz de

conducir y asimilar las particularizaciones sobre los patrones existentes en el sistema.

Manejo de modelos en el sistema.

Al mismo tiempo que el sistema transcurre por el flujo de elicitación, pasa por diferentes

estados, en los cuales para pasar al siguiente han de realizarse acciones sobre los

elementos de los modelos. Finalmente se entregarán diagramas como elemento más

representativo. De este modo, es necesario establecer cómo van a traducirse estas

acciones.

Así mismo es importante abstraer al usuario de toda la lógica, relativamente compleja, que

el sistema maneja para determinar y procesar las acciones que alteran los modelos.

Entorno de la aplicación

Para que el proceso pueda ser utilizado es preciso crear una aplicación a la que los

usuarios puedan acceder y utilizar. Puesto que existen múltiples formas de presentarlo es

necesario definir un entorno de aplicación.

17

3.3 Satisfacer objetivos

En este apartado, plantearemos cómo dar solución a los objetivos marcados. Es importante

puntualizar que el fin de la sección no es entrar en detalle en la solución implementada, ni

describir todas las posibilidades que hemos manejado, sino destacar qué conceptos hay que

tener en cuenta para satisfacer los objetivos. La sección en la que se detallan las soluciones y

decisiones es la sección 5. Investigación.

A continuación se describen dichos conceptos por objetivo y que a su vez se han agrupado en

objetivos de Administración y objetivos de Usuario/Desarrollador.

3.3.1 Administración

Introducir modelos a nuestro sistema

Como hemos indicado, los modelos de diseño software que contienen los patrones siguen

el lenguaje de modelado de sistemas de software más conocido y utilizado en la

actualidad, UML (Unified Modeling Language), referirse al apartado 4.2. UML.

Introducir los modelos al sistema pasa por construir entidades que pueda manejar, y por

tanto de algún modo, mapear diagramas UML a elementos software. Para ello, es

necesario encontrar o construir una librería que maneje esta información.

Por otro lado, también es importante recordar que el proceso que definimos se encargará

de particularizar los diseños de patrones a los requerimientos del usuario, y por tanto que

los modelos a personalizar deberán precargarse en el sistema previamente a su utilización.

Ambigüedad para el intercambio de conocimiento.

El propósito de este objetivo se centra en definir el mecanismo con el que se introducirá

conocimiento al sistema. De este modo, es necesario crear un lenguaje que el sistema

entienda y sepa procesar.

Para ello podemos pensar en un lenguaje de etiquetas, mediante el cual, el sistema una

vez leída una etiqueta sabe qué tiene que hacer con su contenido.

En este punto introduciremos el concepto de XML (Extensible Markup Language),

explicado en el apartado 4.3 XML. Gracias a él podemos satisfacer todas nuestras

necesidades en este ámbito, el sistema podrá leer y procesar el contenido de ficheros XML

y a su vez podremos introducir nuevos ficheros XML que correspondan a cuantos patrones

queramos introducir.

Ofrecer modelos reusables

En una primera instancia para satisfacer este objetivo, tenemos que conocer en qué

ámbitos pueden ser reusables los modelos que entreguemos. Comprobamos que son dos:

por un lado herramientas CASE para crear código a partir de modelos de diseño y por otro

herramientas de diseño para poder editar modelos.

Partimos con una gran ventaja y es que existe un estándar enormemente extendido para

el intercambio de meta-modelos, XMI (XML Metadata Interchange) desarrollado en el

apartado 4.6 XMI.

18

3.3.2 Usuario/Desarrollador

Automatizar la definición de responsabilidades

Como se ha indicado, este objetivo pasa por construir un flujo que abstraiga al usuario de

la lógica que el sistema sigue para concretar las responsabilidades del sistema por cada

patrón.

Para satisfacer dicho objetivo, el sistema debe definir y ofrecer al usuario unas preguntas a

modo de cuestionario, y a través de ellas pasar por diferentes estados.

Así mismo el comportamiento del sistema debe ser siempre el mismo para unas

condiciones determinadas.

Una vez explicado esto, debemos analizar en primera instancia que tipo de sistema vamos

a crear. Debido al carácter tan especifico del dominio, determinamos construir un sistema

experto. En la sección 4.1 Sistema Experto se define este concepto.

A continuación, debemos establecer qué conocimiento requerimos y definirlo:

Necesitaremos conocimiento de flujo, a qué estado pasará el sistema con cada condición,

y conocimiento de acciones, qué deberá hacer el sistema en cada estado en el que se

encuentre.

Manejo de modelos en el sistema

En este punto debemos presentar cómo satisfacer la necesidad de tratar los elementos

software que representan los modelos de diseño.

Como se ha indicado, a medida que el usuario pasa a través de la guía de elicitación se irán

definiendo las responsabilidades y por tanto es en este punto dónde debemos introducir

un mecanismo para personalizar los diagramas precargados (ver Introducir modelos a

nuestro sistema).

Cuando pensamos en estos mecanismos introducimos el concepto de acción, el cual está

desarrollado en el apartado 4.5 lógica funcional (Acciones, flujos y estados).

Entorno de la aplicación

Necesitamos crear una aplicación que parte de dos necesidades: poseer la lógica de un

sistema experto, y ser portable.

Estas premisas nos han llevado a pensar en centralizar el proceso y el conocimiento en un

sistema remoto, ofreciendo acceso a través de la red.

Lo ideal sería la construcción de una única aplicación que si introdujéramos algún cambio,

pudiera estar reflejado en todas las distribuciones del proyecto. Es por esto por lo que se

ha escogido un entorno web que permita mantener la consistencia de los cambios,

permita usar la herramienta sin necesidad de instalación y realice la labor de distribución.

19

Una vez realizado el análisis inicial, deberemos realizar el trabajo de especialización en el

campo que estamos trabajando y es por eso que la etapa más importante del proyecto sea la

investigación de lo que se puede llegar a crear a partir de conocimientos expertos.

Más adelante, considerando una especialización profunda en este ámbito, deberemos llegar a

la toma de decisiones, punto decisivo a la hora de tomar referencias de esfuerzo, puesto que

aprobar una decisión errónea nos llevará a un punto donde deberemos probablemente

retornar.

Puesto que nos veremos implicados dentro de un proceso iterativo, realizaremos cada una de

las fases que consta el proceso unificado tantas veces como nos sea necesario para alcanzar

nuestra meta.

20

4 Conocimientos

Una vez explicada la información facilitada, debemos analizar los conceptos en los que

debemos especializarnos y tecnologías que se adaptan a la construcción de la solución.

En los siguientes apartados veremos las definiciones y características de cada uno de ellos,

haciendo constancia de lo que aporta al sistema.

Puesto que no es el fin del proyecto el estudio de estas tecnologías, sino que han sido vitales

sus aplicaciones, en las siguientes secciones se presentan las descripciones de los mismos.

4.1 Sistema Experto

Los sistemas expertos son llamados así porque emulan el comportamiento de un experto en

un dominio concreto y en ocasiones son usados por éstos. Con los sistemas expertos se busca

una mejor calidad y rapidez en las respuestas dando así lugar a una mejora de la productividad

del experto.

Un sistema experto es un conjunto de programas que, sobre una base de conocimientos,

posee información de uno o más expertos en un área específica. Se puede entender como una

rama de la inteligencia artificial, donde el poder de resolución de un problema en una

aplicación, viene del conocimiento de un dominio específico. Estos sistemas imitan las

actividades de un humano para resolver problemas de distinta índole (no necesariamente

tiene que ser de inteligencia artificial). También se dice que un Sistema Experto se basa en el

conocimiento declarativo (hechos sobre objetos, situaciones) y el conocimiento de control

(información sobre el seguimiento de una acción).

Para que un sistema experto sea una herramienta efectiva, los usuarios deben interactuar de

una forma fácil, reuniendo dos capacidades para poder cumplirlo:

1. Explicar sus razonamientos o base del conocimiento: los sistemas expertos se deben

realizar siguiendo ciertas reglas o pasos comprensibles de manera que se pueda

generar la explicación para cada una de estas reglas, que a la vez se basan en hechos.

2. Adquisición de nuevos conocimientos o integrador del sistema: son mecanismos de

razonamiento que sirven para modificar los conocimientos anteriores. Sobre la base de

lo anterior se puede decir que los sistemas expertos son el producto de investigaciones

en el campo de la inteligencia artificial ya que ésta no intenta sustituir a los expertos

humanos, sino que se desea ayudarlos a realizar con más rapidez y eficacia todas las

tareas que realiza.

Normalmente se están mezclando diferentes técnicas o aplicaciones aprovechando las

ventajas que cada una de estas ofrece para poder objetivos de forma más segura. Un ejemplo

de estas técnicas sería nuestro sistema a desarrollar.

21

4.2 UML

Lenguaje Unificado de Modelado (LUM o UML, por sus siglas en inglés, Unified Modeling

Language) es el lenguaje de modelado de sistemas de software más conocido y utilizado en la

actualidad; está respaldado por el OMG (Object Management Group). Es un lenguaje gráfico

para visualizar, especificar, construir y documentar un sistema. UML ofrece un estándar para

describir un "plano" del sistema (modelo), incluyendo aspectos conceptuales tales como

procesos de negocio y funciones del sistema, y aspectos concretos como expresiones de

lenguajes de programación, esquemas de bases de datos y componentes reutilizables.

Es importante resaltar que UML es un "lenguaje de modelado" para especificar o para describir

métodos o procesos. Se utiliza para definir un sistema, para detallar los artefactos en el

sistema y para documentar y construir. En otras palabras, es el lenguaje en el que está descrito

el modelo.

Se puede aplicar en el desarrollo de software entregando gran variedad de formas para dar

soporte a una metodología de desarrollo de software (tal como el Proceso Unificado Racional o

RUP), pero no especifica en sí mismo qué metodología o proceso usar.

UML no puede compararse con la programación estructurada, pues UML significa Lenguaje

Unificado de Modelado, no es programación, solo se diagrama la realidad de una utilización en

un requerimiento. Mientras que, programación estructurada, es una forma de programar

como lo es la orientación a objetos, sin embargo, la programación orientada a objetos viene

siendo un complemento perfecto de UML, pero no por eso se toma UML sólo para lenguajes

orientados a objetos.

UML cuenta con varios tipos de diagramas, los cuales muestran diferentes aspectos de las

entidades representadas.

En UML 2.0 hay 13 tipos diferentes de diagramas. Para comprenderlos de manera concreta, a

veces es útil categorizarlos jerárquicamente.

Los Diagramas de Estructura enfatizan en los elementos que deben existir en el sistema

modelado:

Diagrama de clases

Diagrama de componentes

Diagrama de objetos

Diagrama de estructura compuesta (UML 2.0)

Diagrama de despliegue

Diagrama de paquetes

Los Diagramas de Comportamiento enfatizan en lo que debe suceder en el sistema modelado:

Diagrama de actividades

Diagrama de casos de uso

Diagrama de estados

22

Los Diagramas de Interacción son un subtipo de diagramas de comportamiento, que enfatiza

sobre el flujo de control y de datos entre los elementos del sistema modelado:

Diagrama de secuencia

Diagrama de comunicación, que es una versión simplificada del Diagrama de

colaboración (UML 1.x)

Diagrama de tiempos (UML 2.0)

Diagrama global de interacciones o Diagrama de vista de interacción (UML 2.0)

4.2.1 MOF

El Meta-Object Facility (MOF) también fue creado por el OMG (Object Management Group)

para la ingeniería basada en el modelo . La página oficial de referencia se puede encontrar en

el sitio web de OMG (http://www.omg.org/).

MOF parte del Lenguaje de Modelado Unificado (UML), el OMG tenía la necesidad de

una arquitectura de modelado para definir el estándar UML. MOF se ha diseñado como una

arquitectura de cuatro capas. Proporciona un modelo de meta-meta en la capa superior,

llamada la capa “M3”. Este modelo M3 es el lenguaje utilizado para la construcción de

metamodelos MOF, llamada “M2-modelos”. El ejemplo más prominente de un nivel 2 del

modelo MOF es el metamodelo UML, el modelo que describe el propio UML. Estos M2-

modelos describen los elementos de la M1-capa, y por lo tanto M1-modelos. Estos serían, por

ejemplo, modelos de escritos en UML. La última capa es la “M0” o “capa de datos”. Se utiliza

para describir los objetos del mundo real.

Más allá del modelo M3, MOF describe los medios para crear y manipular modelos y

metamodelos mediante la definición de interfaces CORBA que describen las

operaciones. Debido a las similitudes entre el M3-modelo y la estructura de los modelos UML,

los metamodelos MOF son usualmente modelados como diagramas de clases UML. Un nivel de

soporte de MOF es XMI , que define un formato de intercambio basado en XML para los

modelos en el M3, M2 o M1-capa.

23

4.3 XML

XML, siglas en inglés de eXtensible Markup Language (lenguaje de marcas extensible), es un

metalenguaje extensible de etiquetas desarrollado por el World Wide Web Consortium (W3C).

Es una simplificación y adaptación del SGML y permite definir la gramática de lenguajes

específicos (de la misma manera que HTML es a su vez un lenguaje definido por SGML). Por lo

tanto XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes

para diferentes necesidades. Algunos de estos lenguajes que usan XML para su definición son

XHTML, SVG, MathML.

XML no ha nacido sólo para su aplicación en Internet, sino que se propone como un estándar

para el intercambio de información estructurada entre diferentes plataformas. Se puede usar

en bases de datos, editores de texto, hojas de cálculo y casi cualquier cosa imaginable.

XML es una tecnología sencilla que tiene a su alrededor otras que la complementan y la hacen

mucho más grande y con unas posibilidades mucho mayores. Tiene un papel muy importante

en la actualidad ya que permite la compatibilidad entre sistemas para compartir la información

de una manera segura, fiable y fácil.

XML, con todas las tecnologías relacionadas, representa una manera distinta de hacer las

cosas, más avanzada, cuya principal novedad consiste en permitir compartir los datos con los

que se trabaja a todos los niveles, por todas las aplicaciones y soportes. Así pues, el XML juega

un papel importantísimo en este mundo actual, que tiende a la globalización y la

compatibilidad entre los sistemas, ya que es la tecnología que permitirá compartir la

información de una manera segura, fiable, fácil. Además, XML permite al programador y los

soportes dedicar sus esfuerzos a las tareas importantes cuando trabaja con los datos, ya que

algunas tareas tediosas como la validación de estos o el recorrido de las estructuras corre a

cargo del lenguaje y está especificado por el estándar, de modo que el programador no tiene

que preocuparse por ello.

Vemos que XML no está sólo, sino que hay un mundo de tecnologías alrededor de él, de

posibilidades, maneras más fáciles e interesantes de trabajar con los datos y, en definitiva, un

avance a la hora de tratar la información, que es en realidad el objetivo de la informática en

general. XML, o mejor dicho, el mundo XML no es un lenguaje, sino varios lenguajes, no es una

sintaxis, sino varias y no es una manera totalmente nueva de trabajar, sino una manera más

refinada que permitirá que todas las anteriores se puedan comunicar entre sí sin problemas,

ya que los datos cobran sentido.

24

4.4 XSD

XSD (XML Schema) es un lenguaje de esquema utilizado para describir la estructura y las

restricciones de los contenidos de los documentos XML de una forma muy precisa, más allá de

las normas sintácticas impuestas por el propio lenguaje XML. Se consigue así una percepción

del tipo de documento con un alto nivel de abstracción. Fue desarrollado por el World Wide

Web Consortium (W3C) y alcanzó el nivel de recomendación en mayo de 2001.

El término "XML Schema" es utilizado con varios significados dentro del mismo contexto de

descripción de documentos, y es importante tener en cuenta las siguientes consideraciones:

1. "XML Schema" es el nombre oficial otorgado a la recomendación del W3C, que elaboró

el primer lenguaje de esquema separado de XML (la definición de tipo de documentos

(DTD) forma parte de XML).

2. Es habitual referirse a los esquemas como "XML schema" de forma genérica, pero se

recomienda utilizar el término “documento esquema” (schema document) o

"definición de esquema"(schema definition), y reservar “XML Schema” para la

denominación de este lenguaje específico.

3. Aunque genéricamente se utilice "XML schemas", XSDL (XSD Language) es el nombre

técnico de los lenguajes de esquema de XML como:

Definición de Tipo de Documento (DTD)

Namespace Routing Language (NRL)

Document Schema Definition Languages (DSDL)

Document Definition Markup Language (DDML)

Document Structure Description (DSD)

Schema for Object-Oriented XML (SOX)

XML Schema es un lenguaje de esquema escrito en XML, basado en la gramática y pensado

para proporcionar una mayor potencia expresiva que las DTD, menos capaces al describir los

documentos a nivel formal.

Los documentos esquema (XSD) se concibieron como una alternativa a las DTD, más

complejas, intentando superar sus puntos débiles y buscar nuevas capacidades a la hora de

definir estructuras para documentos XML. El principal aporte de XML Schema es el gran

número de tipos de datos que incorpora. De esta manera, XML Schema aumenta las

posibilidades y funcionalidades de aplicaciones de procesado de datos, incluyendo tipos de

datos complejos como fechas, números y strings.

La programación en Schema XML se basa en Namespaces. Cada Namespace contiene

elementos y atributos que están estrechamente relacionados con el Namespace para que a la

hora de definir un elemento o un atributo, siempre se creará una conexión entre los diferentes

campos de éste. Además, esta forma de trabajar nos permite relacionar elementos que no

están en el mismo Namespace.

Después de escribir un Schema XML se puede confirmar la correcta realización mediante la

validación de esquemas XML.

25

4.5 Lógica funcional (Acciones, flujos y estados)

Como se muestra en la figura 5 del apartado 2 Material base, la guía de elicitación se presenta

como un tipo de diagrama de flujo.

Un diagrama de flujo es una representación gráfica de un algoritmo o proceso. Se utiliza en

disciplinas como la programación, la economía, los procesos industriales y la psicología

cognitiva. Estos diagramas utilizan símbolos con significados bien definidos que representan

los pasos del algoritmo, y representan el flujo de ejecución mediante flechas que conectan los

puntos de inicio y de término.

Un diagrama de flujo siempre tiene un único punto de inicio y un único punto de término.

Además, todo camino de ejecución debe permitir llegar desde el inicio hasta el término.

Simbología y significado:

Rectángulo: Actividad (Representa la ejecución de una o más actividades o

procedimientos).

Rombo: Decisión (Formula una pregunta o cuestión).

Paralelogramo: Producto (Representa un resultado).

Rectángulo redondeado: Agrupación (Representa responsabilidades)

Figura 10: diagrama de flujo del sistema

26

4.6 XMI

XMI o XML Metadata Interchange (XML de Intercambio de Metadatos) es el nombre que

recibe el estándar para el intercambio de metamodelos usando XML. Su principal objetivo es

permitir un intercambio de metainformación entre herramientas de modelado basadas en

UML y repositorios de metainformación basados en MOF en entornos distribuidos

heterogéneos. Incluye tres estándares: XML, UML y MOF.

Al utilizar XML permite una gran flexibilidad en la estructura de la información, ya que esta no

se especifica como sucede en HTML, lo que permite tener más de una vista de un documento

al estar separado el contenido de la estructura.

XMI es el único estándar para el intercambio de información en entornos de trabajo

distribuido donde se colabora para conseguir un objetivo común.

La especificación para el intercambio de diagramas fue escrita para proveer una manera de

compartir modelos UML entre diferentes herramientas de modelado. En versiones anteriores

de UML se utilizaba un esquema XML para capturar los elementos utilizados en el diagrama;

pero este esquema no decía nada acerca de cómo el modelo debía graficarse.

Para solucionar este problema la nueva Especificación para el Intercambio de Diagramas fue

desarrollada mediante un nuevo esquema XML que permite construir una representación SVG

(Scalable Vector Graphics). Típicamente esta especificación es solamente utilizada por quienes

desarrollan herramientas de modelado UML.

UML es un estándar que define un lenguaje de modelado orientado a objetos que es

soportado por una gama de herramientas de diseño gráfico y MOF es un estándar que define

un marco de trabajo para definir modelos de metainformación y proporciona herramientas

con interfaces programadas para almacenar y acceder a metainformación en un repositorio. Es

por esto, que el hecho de incluir tres estándares como XML, UML y MOF, permite a los

desarrolladores de sistemas distribuidos compartir modelos de objetos y otra información

sobre Internet. De esta forma se consigue un modelado, una gestión y una publicación de

metainformación estándar a través de la web, utilizando UML y MOF para el diseño de

metamodelos y XML para transferir la información.

27

5 Investigación

En este apartado se desarrollará el cuerpo de la investigación que se ha realizado para

construir la solución.

Se ha separado en tres grandes grupos, según los tres procesos el que el sistema manejará,

guía de diseño, guía de elicitación y ofrecer modelos reusables.

Cada proceso está descrito en dos apartados diferentes en los que encontraremos una

descripción del proceso, las investigaciones de tecnologías estudiadas en relación a las

necesidades, y el resultado que se obtuvo, manteniendo en su presentación un orden

cronológico.

A modo de resumen, al inicio en cada una de las etapas de investigación, se incluyen gráficos

explicativos. A continuación, en la Figura 11, se presenta el gráfico general del proceso.

Figura 11: gráfico general del proceso

Como podemos observar se ha realizado una separación sobre la documentación que se

maneja en el sistema. La documentación en papel por tanto se ha separado en documentación

de diseño y en documentación de elicitación.

28

5.1 Guía de diseño

Haciendo referencia a los objetivos, la guía de diseño satisface el objetivo de Introducir

modelos a nuestro sistema, y por tanto, hacemos referencia a la parte de administración. La

guía de diseño es el proceso que define todos los elementos que inicialmente deben estar

cargados de forma invariable en el sistema. Estos elementos a los que se hacen mención son

todos aquellos elementos relacionados con el diseño software. La figura 12 explica de forma

gráfica de qué se trata:

Figura 12: guía de diseño

Para la creación de un modelo, independientemente de la manera que queramos

estructurarlo, debemos tener en cuenta las características del mismo, es decir, no podemos

considerar que la estructura prevista de inserción de datos para el modelo de clases, vaya a

funcionar de forma parecida para el modelo de casos de uso, ya que los elementos internos de

cada modelo son totalmente diferentes.

Otra duda que se plantea frente a una personalización, es si una creación de cero de un

modelo sería correcta. Una construcción progresiva a través de inclusiones simples de

elementos parece lo más lógico, pero quizá no sea lo más óptimo para algunos casos, puesto

que las personalizaciones de algunos modelos comprenden pocas variaciones frente al modelo

completo. Partiendo de esta duda, cabe la posibilidad de contemplar una precarga que facilite

de alguna manera la inclusión de ciertos elementos e incluso que pueda existir la posibilidad

de partir de un modelo completo para después ir particularizando con acciones simples el

mismo.

De estas dos tendencias, surge una necesidad de realizar y mantener una precarga, que para

cualquier caso inicial, siempre sea la misma a modo de simplificación del formulario y de sus

acciones.

29

A partir de ahora nos encontramos con una situación de toma de decisiones de un gran

impacto:

Cómo construir la estructura interna de los modelos de diseño.

Realizar una estandarización de un método de precarga en base a acciones.

5.1.1.1 Generar xsd (XML SchemaDocument)

Para construir la guía de diseño de cada uno de los patrones, se utilizará un esquema XSD que

permita generar y validar documentos XML. Cada documento XML corresponderá a la guía de

diseño de un patrón, es decir, haciendo un símil con la programación orientada a objetos, el

esquema XSD representa una clase en la que se define la estructura y los documentos XML

representan las instancias de la clase con contenido propio (objetos).

A continuación se presenta la definición del esquema en función del objetivo que satisface, en

él destacaremos los elementos relevantes y se describirá el significado de las etiquetas

utilizadas. La figura 13 representa más en profundidad el proceso concreto de la guía de

diseño.

Figura 13: proceso de introducción de la guía de diseño

Como podemos observar, primero se ha realizado una traducción de la documentación de

diseño en formato UML (imágenes) a una documentación de diseño en un formato que puede

ser interpretado por una aplicación (XSD). Más adelante, deberemos introducir esa

información en el sistema (objetos).

30

Antes de comenzar a definir la estructura del documento XSD, se muestra brevemente el

formato que debe seguir el documento. Deberá tener dos partes diferenciadas:

Cabecera: irá siempre al principio del documento y deberá contener las propiedades

del documento:

o XML parser (con el que se validará este documento)

o targetNameSpace: Establece el Identificador uniforme de recursos

(Identificador URI) del espacio de nombres de destino del esquema.

o Xmlns:tns: Establece el identificador único “tns” como como espacio de

nombres de destino del esquema.

o elementFormDefault=”qualified”: Indica que todos los elemento, incluso

locales, deben ser cualificados en los documentos de instancia.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://xml.netbeans.org/schema/ DesignPreload "

xmlns:tns="http://xml.netbeans.org/schema/DesignPreload "

elementFormDefault="qualified">

Cuerpo: contendrá el resto de la información del esquema XSD asociada al patrón que

queramos representar.

A continuación describiremos todo el posible contenido del cuerpo del documento XSD.

31

5.1.1.1.1 Introducir modelos en el sistema

Como se indica en la descripción de objetivos, es necesario definir un procedimiento a través

del cual se puedan mapear diagramas UML a elementos del sistema. El procedimiento se

encargará de precargar elementos de los diagramas UML de cada patrón.

De este modo se ha definido un esquema de precarga de diseño que contenga los campos

precisos para construir la guía de diseño:

<xs:element name="DesignPreload">

<xs:annotation>

<xs:documentation>Design preload xml schema</xs:documentation>

</xs:annotation>

Existe un elemento complejo llamado Precarga que englobará a todos los diagramas:

<xs:complexType>

<xs:sequence>

<xs:element name="Precarga">

<xs:complexType>

<xs:sequence>

Los diagramas UML estarán representados en XSD de la siguiente manera:

Diagrama de clases: tendremos un diagrama de clases por cada patrón:

<xs:element name="DiagramaClases" type="tns:dclase" minOccurs="0"

maxOccurs="1"/>

Diagrama de casos de uso: también deberemos incorporar un diagrama de casos de

uso:

<xs:element name="DiagramaCasosDeUso"type="tns:duso"minOccurs="0"maxOccurs="1"/>

Diagramas de interacción: puesto que el número de diagramas de interacción

dependerá de cada patrón, en este punto podremos añadir los diagramas de

interacción necesarios:

<xs:element name="DiagramasInteraccion" type="tns:dinteraccion" minOccurs="0"

maxOccurs="unbounded"/>

32

5.1.1.1.1.1 Modelo de clases

El modelo de clases se representa a través de un tipo complejo llamado “dclase”. Este tipo

incorpora una serie indeterminada de clases, es decir, una lista de clases conforman el

diagrama completo. Esto es posible gracias a que cada clase incorpora a su vez todos los

atributos, método y relaciones posibles.

<xs:complexType name="dclase">

<xs:sequence>

<xs:element name="Clase" type="tns:clase" minOccurs="0" maxOccurs="unbounded" />

</xs:sequence>

</xs:complexType>

Como se ha indicado, a la hora de añadir una clase al diagrama de clases, necesitaremos los

valores típicos de una clase. Pasamos directamente a describirlos:

Nombre de la clase:

<xs:complexType name="anadirClase">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

Atributos de la clase, es importante mencionar que podrá aparecer un número

indeterminado de atributos:

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="atributo" type="xs:string"/>

</xs:sequence>

Métodos de la clase, a su vez, podremos encontrar un número indeterminado de

métodos:

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="metodo" type="xs:string"/>

</xs:sequence>

Relaciones de la clase con otras clases. Puesto que existen diferentes tipos de

relaciones y cada una de ellas contiene diferentes tipos de datos se ha creado una

etiqueta para cada una de ellas.

o Dependencias: Representa un tipo de relación muy particular, en la que una

clase es instanciada (su instanciación es dependiente de otro objeto/clase). El

uso más particular de este tipo de relación es para denotar la dependencia que

tiene una clase de otra.

<xs:element name="dependency" type="tns: associationType " minOccurs="0" maxOccurs="unbounded"/>

o Asociaciones: Indica relaciones de mandato bidireccionales. Conlleva

dependencia semántica y no establece una dirección de dependencia. Tienen

cardinalidad.

<xs:element name="association" type="tns: associationType " minOccurs="0" maxOccurs="unbounded"/>

33

o Composiciones: Es un tipo de relación estática, en donde el tiempo de vida del

objeto incluido está condicionado por el tiempo de vida del que lo incluye.

<xs:element name="composition" type="tns:comp_aggr" minOccurs="0" maxOccurs="unbounded"/>

o Agregaciones: Es un tipo de relación dinámica, en donde el tiempo de vida del

objeto incluido es independiente del que lo incluye.

<xs:element name="aggregation" type="tns:comp_aggr" minOccurs="0" maxOccurs="unbounded"/>

o Generalizaciones: Indica que una subclase hereda los métodos y atributos

especificados por una Super Clase, por ende la Subclase además de poseer sus

propios métodos y atributos, poseerá las características y atributos visibles de

la Super Clase

<xs:element name="generalization" type="tns:generalization" minOccurs="0" maxOccurs="unbounded"/>

Los tipos de datos que se manejarán se han agrupado en tres grupos en base al contenido que

manejarán:

Tipo asociación(associationType): Este tipo se utilizará tanto para relaciones de

dependencia como para relaciones de asociación.

<xs:complexType name="associationType">

<xs:sequence>

Se caracteriza por tres elementos:

o association-class: indicará el nombre de la clase con la que se relaciona

<xs:element name="association-class" type="xs:string"/>

o association-multiplicity: de forma opcional se podrá indicar la multiplicidad de

la relación. Los valores que podrá tener son: “optional”, “one” o “many”.

<xs:element name="association-multiplicity" type="tns:multiplicityVal" minOccurs="0"

maxOccurs="1"/>

o role-name: de forma opcional se podrá indicar la etiqueta que llevará la

relación.

<xs:element name="role-name" type="xs:string" minOccurs="0" maxOccurs="1"/>

Tipo composición/agregación(comp_aggr): Este tipo se utilizará tanto para relaciones

de composición como para relaciones de agregación.

<xs:complexType name="comp_aggr">

<xs:sequence>

En este caso, este tipo complejo de datos contiene dos etiquetas:

o association-class: indicará el nombre de la clase con la que se relaciona

<xs:element name="association-class" type="xs:string"/>

o role-name: de forma opcional se podrá indicar la etiqueta que llevará la

relación.

<xs:element name="role-name" type="xs:string" minOccurs="0" maxOccurs="1"/>

34

Tipo generalización (generalization): Este tipo se utilizará únicamente para el tipo de

relaciones de generalización.

<xs:complexType name="generalization">

<xs:sequence>

En este caso, este tipo complejo de datos contiene una etiqueta:

o Class-name: indicará el nombre de la clase con la que se relaciona.

<xs:element name="class-name" type="xs:string"/>

35

5.1.1.1.1.2 Modelo de casos de uso

Los diagramas de casos de uso se representan a través del tipo complejo “duso”. Este tipo

complejo contendrá un número indeterminado de actores y de casos de uso.

<xs:complexType name="duso">

<xs:sequence>

<xs:element name="Actor" type="xs:string" minOccurs="0" maxOccurs="unbounded" />

<xs:element name="CasoDeUso" type="tns:casoUso" minOccurs="0" maxOccurs="unbounded" />

</xs:sequence>

</xs:complexType>

Tal y como pasaba en el modelo de clases, necesitaremos la información típica de un casos de

uso; nombre del mismo y las relaciones que posee con otros casos de uso. Se han definido 3

tipos de relaciones posibles: asociación, inclusión y extensión.

<xs:complexType name="anadirCasoUso">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

<xs:element name="associationUC" type="tns:relationUC" minOccurs="0"

maxOccurs="unbounded"/>

<xs:element name="include" type="tns:relationUC" minOccurs="0" maxOccurs="unbounded"/>

<xs:element name="extend" type="tns:relationUC" minOccurs="0" maxOccurs="unbounded"/>

</xs:sequence>

</xs:complexType>

La etiqueta relationUC engloba todas las relaciones. La relación está compuesta por el origen

de la relación (source), y el destino (target). Por lo general el campo source estará vacío,

indicando así que el origen de la relación es el propio caso de uso que la contiene. En algunos

casos, siempre que el origen sea un actor, el elemento “source” expresará un origen.

<xs:complexType name="relationUC">

<xs:sequence>

<xs:element name="target" type="xs:string"/>

<xs:element name="source" type="xs:string" minOccurs="0" maxOccurs="1"/>

</xs:sequence>

</xs:complexType>

36

5.1.1.1.1.3 Modelo de interacción

Por último hablaremos del modelo de interacción. Los diagramas de interacción son

completos, por tanto se ha definido incluir todos los diagramas durante la precarga con una

variable que indicará si están activos, es decir si en base a las responsabilidades definidas se

aplican a la particularización del usuario, o si por el contrario no estarán habilitados.

La representación de los diagramas de interacción se realiza a través del tipo complejo

“dinteraccion”. Cada diagrama de interacción individual estará representado por la etiqueta

“DiagramaInteraccion”.

<xs:complexType name="dinteraccion">

<xs:sequence>

<xs:element name="DiagramaInteraccion"minOccurs="0"maxOccurs="unbounded">

Las etiquetas que se manejan en este tipo de datos serán las siguientes:

Asignación, este tipo nos permitirá indicar si un diagrama está activo desde la precarga

o si por el contrario se tendrá que activar durante la fase de elicitación. Los valores que

podrá tomar son Active” (visible) o “Inactive” (no visible).

<xs:sequence>

<xs:element name="asignacion">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:enumeration value="Active"/>

<xs:enumeration value="Inactive"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

Nombre del diagrama, puesto que podrán existir varios diagramas para un mismo

documento, éstos deberán tener un nombre para referenciarlos.

<xs:element name="nombre" type="xs:string"/>

Objeto, existirán un número indeterminado de elementos “objeto”, que representarán

todos los objetos que existen en un diagrama de interacción concreto.

<xs:element name="objeto" type="tns:objeto" minOccurs="0" maxOccurs="unbounded" />

Interacción, también existirán tantas interacciones como sean necesarias. Éstas

representas las peticiones entre objetos que existen en el diagrama. Hemos de tener

en cuenta que el orden con el que se suceden establece el orden de las peticiones.

<xs:element name="interaccion" type="tns:interaccion" minOccurs="0" maxOccurs="unbounded"/>

37

Analizando el elemento objeto, observamos que contiene un elemento nombre y un elemento

clase, que será el nombre de la clase a la que pertenece este objeto.

<xs:complexType name="objeto">

<xs:sequence>

<xs:element name="nombre" type="xs:string" minOccurs="0" maxOccurs="1"/>

<xs:element name="clase" type="xs:string"/>

</xs:sequence>

</xs:complexType>

En el tipo complejo llamado “interaccion” se representan todos los elementos simples

necesarios para definir una interacción. Por un lado tendremos los objetos emisor,

“objetoEmisor”, y receptor “objetoReceptor”, por otro el nombre del método a ejecutar,

“methodName”, y por último tendremos que definir el tipo del estímulo, “type” y los

parámetros del mensaje, “param”.

<xs:complexType name="interaccion">

<xs:sequence>

<xs:element name="objetoEmisor" type="xs:string"/>

<xs:element name="objetoReceptor" type="xs:string"/>

<xs:element name="methodName" type="xs:string"/>

<xs:element name="param" type="xs:string" minOccurs="0"/>

<xs:element name="tipo" type="tns:tipoMensaje"/>

</xs:sequence>

</xs:complexType>

El tipo del mensaje está representado por los cuatro tipos de estímulos existentes: llamada

“call”, envío “send”, retorno “return”, creación “create” y destrucción “destroy”

<xs:simpleType name="tipoMensaje">

<xs:restriction base="xs:string">

<xs:enumeration value="call"/>

<xs:enumeration value="send"/>

<xs:enumeration value="return"/>

<xs:enumeration value="create"/>

<xs:enumeration value="destroy"/>

</xs:restriction>

</xs:simpleType>

</xs:schema>

38

5.2 Guía de elicitación

La guía de elicitación describe el proceso lógico mediante el que se definirán las

responsabilidades. Como se ha explicado en el apartado 2.2.5 Lógica funcional, está

representado por un diagrama de flujo que incorpora el proceso o algoritmo.

Figura 14: gráfico del proceso de elicitación

Nuestro cometido en este punto es tratar de encontrar una solución para mapear los

elementos de un diagrama a elementos software del sistema.

El contenido a mapear para desarrollar el flujo consta de los siguientes elementos:

1. Identificador de la pregunta: Corresponde a un identificador único por diagrama, de

esta forma será posible referirnos a una pregunta de forma inequívoca.

2. Contenido de la pregunta: Corresponde al texto que se mostrará cuando el sistema

presente un elemento pregunta.

3. Flujo: Corresponde al identificador de la siguiente pregunta a la se pasará en función

de la respuesta del usuario.

4. Acciones: Contiene la información asociada a las operaciones que se realizarán para

particularizar los modelos genéricos de los patrones.

Independientemente del lenguaje de programación utilizados, debemos crear una estructura

de tipos de datos en la que incluir la información. Sin embargo, en este punto tenemos que

tomar una decisión en cuanto a la forma de introducir el contenido correspondiente los

patrones de diseño.

39

Por un lado, introducir en el propio código del sistema el contenido de los patrones hace que

nuestro sistema fuera muy sensible a cambios. Es decir, tanto si alguno de los patrones se

modificara o se deseara incluir alguno nuevo, sería necesario modificar el código del sistema.

Por tanto, en este punto fue necesario tomar una decisión en cuanto al método con el que se

introduciría, de forma externa al sistema, los datos referentes a la guía de elicitación.

5.2.1 Bases de Datos

Analizando la posibilidad de incluir una base de datos para representar la elicitación en el

sistema, observamos la correcta aproximación a los elementos anteriormente citados, como

son los patrones y los formularios.

Por un lado tenemos que la representación de un patrón consta simplemente de un nombre y

éste debe llevar asociado un único formulario, por lo que determinamos que no supondría

ningún problema en el modelado.

Por otro lado tenemos el formulario, donde necesitaremos incluir información sobre la

identificación de la pregunta, que será el identificador de cada pregunta, la descripción de la

pregunta, las posibles bifurcaciones y por último las acciones a realizar dependiendo de las

respuestas. Estas acciones a priori complican notablemente el modelo entidad-relación puesto

que la diversidad de éstas hace complejo el diseño de dicho modelo. Además, teniendo en

cuenta el grado de ambigüedad que se le quiere aportar al sistema, realizar un cambio en

algún tipo de acción podría tener un elevado impacto sobre el comportamiento funcional del

sistema.

Si tenemos en cuenta otros factores como son la sostenibilidad y el uso de una base de datos

para el sistema propuesto, parece que la propuesta pierde peso. Puesto que lo que se intenta

generar es un sistema experto, los cambios producidos en él representan en el futuro un

porcentaje excesivamente bajo, por lo que no tiene mucho sentido mantener levantada una

base de datos para realizar únicamente tareas de consulta. Además la centralización de datos

que requiere el sistema, se realiza a través de la distribución web, y dicha distribución al

necesitar únicamente labores de consulta no requerirá concurrencia a la hora de realizar una

escritura, puesto que las salidas producidas por el sistema serán únicas para cada caso.

Por estas razones, es más lógico pensar en una solución que implemente una base de

conocimientos estática, es decir, que se pueda extraer de un soporte de datos estático, como

por ejemplo un fichero.

Para la creación de un metamodelo en un fichero, la forma de representarlo de forma más

cercana a un lenguaje natural es a través de un fichero XML. Este fichero debe seguir un

esquema fijado a modo de acotación de dominio del sistema, es decir, que tengamos una

verificación de que todo elemento introducido en el fichero está correctamente formateado y

validado como se comenta a continuación.

40

5.2.2 Generar XSD (XML SchemaDocument)

Después de descartar el uso de una base de datos como base de conocimiento del sistema,

centraremos la construcción de ésta en la creación de un esquema XML (XSD).

De este modo, para construir la guía de elicitación de cada uno de los patrones, se utilizará un

esquema XSD que permitiera generar y validar documentos XML. Cada documento XML

corresponderá a la guía de elicitación de un patrón.

Figura 15: proceso de introducción de documentación de elicitación

En la figura 15, se explica de forma gráfica el proceso que debemos seguir para introducir la

guía de elicitación en el sistema, es decir, traducir la información de la que disponemos

inicialmente en un tipo de documentación que pueda ser interpretada por el sistema. Como

podemos observar, se ha dividido en dos pasos, primero se realiza una traducción y después se

introduce esa traducción en el sistema (objetos).

41

A continuación se presenta la definición del esquema en función del objetivo que satisface, en

él destacaremos los elementos relevantes y se describirá el significado de las etiquetas

utilizadas.

Antes de comenzar a definir la estructura del documento XSD, se muestra brevemente el

formato que debe seguir el documento. Deberá tener dos partes diferenciadas:

Cabecera: irá siempre al principio del documento y deberá contener las propiedades

del documento:

o XML parser (con el que se validará este documento)

o targetNameSpace: Establece el Identificador uniforme de recursos

(Identificador URI) del espacio de nombres de destino del esquema.

o Xmlns:tns: Establece el identificador único “tns” como como espacio de

nombres de destino del esquema.

o elementFormDefault=”qualified”: Indica que todos los elemento, incluso

locales, deben ser cualificados en los documentos de instancia.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://xml.netbeans.org/schema/Formulario"

xmlns:tns="http://xml.netbeans.org/schema/Formulario"

elementFormDefault="qualified">

Cuerpo: contendrá el resto de la información del esquema XSD asociada al patrón que

queramos representar.

Los apartados posteriores se centrarán en el desarrollo del cuerpo del documento xsd.

42

5.2.2.1 Automatizar la definición de responsabilidades.

Como se indica en la descripción de objetivos, este espacio hace referencia a la necesidad de

crear un flujo mediante el que el sistema sea capaz de conducir y asimilar las

particularizaciones sobre los patrones existentes en el sistema.

De este modo, se ha definido un formulario que contenga los campos precisos para construir

el flujo:

<xs:element name="Formulario">

<xs:annotation>

<xs:documentation>Formulario xml schema</xs:documentation>

</xs:annotation>

<xs:complexType>

Cada formulario, por tanto, contiene un número indeterminado de Preguntas:

<xs:sequence>

<xs:element name="Pregunta" minOccurs="0" maxOccurs="unbounded">

<xs:complexType>

<xs:sequence>

A su vez, cada pregunta engloba el contenido a mapear para desarrollar el flujo. Consta de los

elementos descritos previamente:

5. Identificador de la pregunta: Corresponde a un identificador único por diagrama, de

esta forma será posible referirnos a una pregunta de forma inequívoca.

<xs:element name="id" type="xs:integer"/>

6. Contenido de la pregunta: Corresponde al texto que se mostrará cuando el sistema

presente un elemento pregunta.

<xs:element name="valor" type="xs:string"/>

7. Flujo: Corresponde al identificador de la siguiente pregunta a la se pasará en función

de la respuesta del usuario.

Si el usuario respondiera Si:

<xs:element name="nodoSI" type="xs:integer"/>

Si el usuario respondiera No:

<xs:element name="nodoNO" type="xs:integer"/>

8. Acciones: Contiene la información asociada a las operaciones que se realizarán para

particularizar los modelos genéricos de los patrones.

El sistema realizará indeterminadas acciones en función de la respuesta del usuario,

por tanto:

Si el usuario respondiera Sí, se listaría las acciones tras la etiqueta:

<xs:element name="accionesSI" type="tns:acciones" minOccurs="0"/>

Si por el contrario contestara No, se listaría tras la etiqueta:

<xs:element name="accionesNO" type="tns:acciones" minOccurs="0"/>

En este punto es necesario hacer una explicación mucho más extensa del contenido,

por lo que en el siguiente sub-apartado se desarrollaran todas las posibles acciones.

43

5.2.2.2 Manejo de modelos en el sistema.

Como se ha indicado, al mismo tiempo que el sistema transcurre por el flujo de elicitación,

pasa por diferentes estados, en los cuales para pasar al siguiente han de realizarse

acciones sobre los elementos de los modelos.

Este apartado se ocupa de describir cómo se han definido estas acciones. Aunque hasta

ahora únicamente hemos hablado de las acciones que particularizarán los modelos de

diseño genéricos, existen más tipos de acciones que personalizarán diferentes aspectos

genéricos de los patrones.

El esquema nos permitirá elegir por cada acción un tipo de los listados a continuación:

<xs:complexType name="acciones">

<xs:sequence>

<xs:element name="accion" minOccurs="0" maxOccurs="unbounded">

<xs:complexType>

<xs:choice>

<xs:element name="fichero" type="tns:fichero"/>

<xs:element name="table" type="tns:table"/>

<xs:element name="system" type="tns:system"/>

<xs:element name="diseno" type="tns:diseno"/>

</xs:choice>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

A continuación, en los siguientes apartados se presentarán y definirán las acciones del

sistema en función de su tipología.

44

5.2.2.2.1 Acciones de tipo Fichero

Este tipo de acciones se harán cargo de crear los ficheros que describirán los requisitos de

diseño.

La mejor forma de entender este concepto es con un ejemplo:

En el patrón Undo, encontramos la siguiente pregunta.

¿Qué acciones del usuario están consideradas como peligrosas?

De este modo, la respuesta a la misma corresponderá a la lista de acciones

potencialmente peligrosas.

Para representar esta información en el esquema se han utilizado dos etiquetas, nombre

de la lista, en este caso “Lista de acciones potencialmente peligrosas”, y ruta que indicará

dónde se creará el fichero que contendrá dicha lista.

<xs:complexType name="fichero">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

<xs:element name="ruta" type="xs:string"/>

</xs:sequence>

</xs:complexType>

No es necesario incluir una etiqueta para hacer referencia al contenido que el usuario

responderá porque no forma parte del patrón, sino del material personalizado y por tanto

su sitio es en una primera instancia un objeto software del sistema y finalmente un

documento pdf que se entregará al usuario.

45

5.2.2.2.2 Acciones de tipo Tabla

Este tipo de acciones se encargan de personalizar el contenido de las tablas de los patrones,

estas son: Tabla 1. Guía de elicitación de usabilidad, Tabla 2. Guía de diseño genérico y Tabla 3.

Guía de diseño concreto, descritas en el apartado x.

En este caso y puesto que las tablas que se incluyen en los patrones son completas, las

personalizaciones sobre las mismas se basarán en eliminar responsabilidades, y en definitiva

eliminar filas de las tablas. De este modo las etiquetas que se han definido para este fin son el

nombre de la tabla que se desea personalizar y eliminarFila, que indica el número de la fila

que tiene que desaparecer para eliminar una responsabilidad concreta de la tabla genérica:

<xs:complexType name="table">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

<xs:element name="eliminarFila" type="xs:integer"/>

</xs:sequence>

</xs:complexType>

46

5.2.2.2.3 Acciones de tipo Sistema

Este tipo de acciones responde a la necesidad de ejecutar acciones en base a una condición.

Dichas condiciones hacen referencia a preguntas que ya se han contestado anteriormente, de

este modo la acción que aparezca a continuación de una acción de tipo sistema, sólo se

ejecutará en caso de que el valor contestado a una pregunta anterior sea un valor

determinado.

Las etiquetas que se han utilizado son question y response, que indica el identificador de una

pregunta anterior y la respuesta que se debe haber dado para que la siguiente acción se

ejecute.

<xs:complexType name="system">

<xs:sequence>

<xs:element name="question" type="xs:string"/>

<xs:element name="response" type="xs:string"/>

</xs:sequence>

</xs:complexType>

47

5.2.2.2.4 Acciones de tipo Diseño

Este tipo de acciones hacen referencia al manejo de los modelos de diseño en el sistema.

Puesto que pueden realizarse diferentes tipos de acciones de diseño en función de a qué

modelo afecte, una acción de diseño nos permitirá elegir entre los siguientes sub-tipos:

Añadir Clase: añade una clase al diagrama de clases del patrón con el que se está

trabajando.

Añadir Método: añade un método a una clase determinada.

Añadir Atributo: añade un atributo a una clase determinada.

Añadir Relación: añade una relación entre dos clases.

Añadir Caso de Uso: añade un caso de uso al diagrama de casos de uso del patrón con

el que se está trabajando.

Eliminar Petición: elimina una petición de un diagrama de interacción determinado.

Modificar Petición: modifica los atributos de una petición de un diagrama de

interacción determinado.

Añadir Diagrama: añade un diagrama de interacción al sistema.

<xs:complexType name="diseno">

<xs:choice>

<xs:element name="anadirClase" type="tns:anadirClase"/>

<xs:element name="anadirMetodo" type="tns:anadirMetodo"/>

<xs:element name="anadirAtributo" type="tns:anadirAtributo"/>

<xs:element name="anadirRelacion" type="tns:anadirRelacion"/>

<xs:element name="anadirCasoUso" type="tns:anadirCasoUso"/>

<xs:element name="eliminarPeticion" type="tns:eliminarPeticion"/>

<xs:element name="modPeticion" type="tns:modPeticion"/>

<xs:element name="anadirDiagrama" type="xs:string"/>

</xs:choice>

</xs:complexType>

Puesto que cada uno de estos elementos está compuesto por varios tipos de información, en

los siguientes apartados se mostrará una descripción completa de los mismos. Para una

mejor comprensión, los agruparemos en función del modelo de diseño al que hagan

referencia: modelo de clases, modelo de casos de uso y modelo de interacción.

48

5.2.2.2.4.1 Modelo de clases

5.2.2.2.4.1.1 Acción Añadir Clase

A la hora de añadir una clase al diagrama de clases, necesitaremos los valores típicos de una

clase. Pasamos directamente a describirlos:

Nombre de la clase:

<xs:complexType name="anadirClase">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

Atributos de la clase, es importante mencionar que podrá aparecer un número

indeterminado de atributos:

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="atributo" type="xs:string"/>

</xs:sequence>

Métodos de la clase, a su vez, podremos encontrar un número indeterminado de

métodos:

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="metodo" type="xs:string"/>

</xs:sequence>

Relaciones de la clase con otras clases. Puesto que existen diferentes tipos de

relaciones y cada una de ellas contiene diferentes tipos de datos se ha creado una

etiqueta para cada una de ellas.

o Dependencias: Representa un tipo de relación muy particular, en la que una

clase es instanciada (su instanciación es dependiente de otro objeto/clase). El

uso más particular de este tipo de relación es para denotar la dependencia que

tiene una clase de otra.

<xs:element name="dependency" type="tns: associationType " minOccurs="0" maxOccurs="unbounded"/>

o Asociaciones: Indica relaciones de mandato bidireccionales. Conlleva

dependencia semántica y no establece una dirección de dependencia. Tienen

cardinalidad.

<xs:element name="association" type="tns: associationType " minOccurs="0" maxOccurs="unbounded"/>

o Composiciones: Es un tipo de relación estática, en donde el tiempo de vida del

objeto incluido está condicionado por el tiempo de vida del que lo incluye.

<xs:element name="composition" type="tns:comp_aggr" minOccurs="0" maxOccurs="unbounded"/>

o Agregaciones: Es un tipo de relación dinámica, en donde el tiempo de vida del

objeto incluido es independiente del que lo incluye.

<xs:element name="aggregation" type="tns:comp_aggr" minOccurs="0" maxOccurs="unbounded"/>

49

o Generalizaciones: Indica que una subclase hereda los métodos y atributos

especificados por una Super Clase, por ende la Subclase además de poseer sus

propios métodos y atributos, poseerá las características y atributos visibles de

la Super Clase

<xs:element name="generalization" type="tns:generalization" minOccurs="0" maxOccurs="unbounded"/>

Los tipos de datos que se manejarán se han agrupado en tres grupos en base al contenido que

manejarán:

Tipo asociación(associationType): Este tipo se utilizará tanto para relaciones de

dependencia como para relaciones de asociación.

<xs:complexType name="associationType">

<xs:sequence>

Se caracteriza por tres elementos:

o association-class: indicará el nombre de la clase con la que se relaciona

<xs:element name="association-class" type="xs:string"/>

o association-multiplicity: de forma opcional se podrá indicar la multiplicidad de

la relación. Los valores que podrá tener son: “optional”, “one” o “many”.

<xs:element name="association-multiplicity" type="tns:multiplicityVal" minOccurs="0"

maxOccurs="1"/>

o role-name: de forma opcional se podrá indicar la etiqueta que llevará la

relación.

<xs:element name="role-name" type="xs:string" minOccurs="0" maxOccurs="1"/>

Tipo composición/agregación(comp_aggr): Este tipo se utilizará tanto para relaciones

de composición como para relaciones de agregación.

<xs:complexType name="comp_aggr">

<xs:sequence>

En este caso, este tipo complejo de datos contiene dos etiquetas:

o association-class: indicará el nombre de la clase con la que se relaciona

<xs:element name="association-class" type="xs:string"/>

o role-name: de forma opcional se podrá indicar la etiqueta que llevará la

relación.

<xs:element name="role-name" type="xs:string" minOccurs="0" maxOccurs="1"/>

Tipo generalización(generalization): Este tipo se utilizará únicamente para el tipo de

relaciones de generalización.

<xs:complexType name="generalization">

<xs:sequence>

En este caso, este tipo complejo de datos contiene una etiqueta:

o Class-name: indicará el nombre de la clase con la que se relaciona.

<xs:element name="class-name" type="xs:string"/>

50

5.2.2.2.4.1.2 Acción Añadir Método

Este tipo de acciones responde a la necesidad de añadir métodos a clases concretas. Por tanto

las etiquetas que manejará este tipo de acciones son methodName, para indicar el nombre del

método que se añadirá y clase, que muestra el nombre de la clase a la que se le añadirá el

método antes indicado.

<xs:complexType name="anadirMetodo">

<xs:sequence>

<xs:element name="methodName" type="xs:string"/>

<xs:element name="clase" type="xs:string"/>

</xs:sequence>

</xs:complexType>

5.2.2.2.4.1.3 Acción Añadir Atributo

Del mismo modo que se podrán añadir métodos, el sistema nos permitirá añadir atributos a

alguna clase determinada. Para ello, se han definido las siguientes etiquetas: attributeName

para apuntar el nombre del atributo y clase para indicar a qué clase habrá que añadir el

atributo.

<xs:complexType name="anadirAtributo">

<xs:sequence>

<xs:element name="attributeName" type="xs:string"/>

<xs:element name="clase" type="xs:string"/>

</xs:sequence>

</xs:complexType>

5.2.2.2.4.1.4 Acción Añadir Relación

Este tipo de acciones resuelve la necesidad de añadir relaciones entre clases que no existieran.

Como se ha explicado anteriormente existen varios tipos de relaciones y puesto que ya se han

definido como tipos de datos, en este punto las etiquetas que se manejarán son origen, para

indicar la clase de la que parte la relación y como destino podremos elegir un tipo de relación,

dentro de ese tipo de relación se asignará entre otros atributos la clase destino.

<xs:complexType name="anadirRelacion">

<xs:sequence>

<xs:element name="origen" type="xs:string"/>

<xs:choice>

<xs:element name="dependency" type="tns:association"/>

<xs:element name="association" type="tns:association"/>

<xs:element name="composition" type="tns:comp_aggr"/>

<xs:element name="aggregation" type="tns:comp_aggr"/>

<xs:element name="generalization" type="tns:generalization"/>

51

5.2.2.2.4.2 Modelo de casos de uso

En cuanto al modelo de casos de uso, encontraremos dos tipos de acciones: Añadir Caso de

Uso y Añadir Relación UC.

5.2.2.2.4.2.1 Acción Añadir Caso de Uso

En el caso de añadir caso de uso, necesitaremos la información típica de un casos de uso;

nombre del mismo y las relaciones que posee con otros casos de uso. Se han definido 3 tipos

de relaciones posibles: asociación, inclusión y extensión.

<xs:complexType name="anadirCasoUso">

<xs:sequence>

<xs:element name="nombre" type="xs:string"/>

<xs:element name="associationUC" type="tns:relationUC" minOccurs="0"

maxOccurs="unbounded"/>

<xs:element name="include" type="tns:relationUC" minOccurs="0" maxOccurs="unbounded"/>

<xs:element name="extend" type="tns:relationUC" minOccurs="0" maxOccurs="unbounded"/>

</xs:sequence>

</xs:complexType>

5.2.2.2.4.2.2 Acción Añadir Relación UC

El contenido de las relaciones para los casos de uso se simplifica en dos etiquetas: origen(source) de la

relación, que indica el nombre del caso de uso del que se parte y destino(target) que indica el nombre del

caso de uso de destino.

<xs:complexType name="relationUC">

<xs:sequence>

<xs:element name="target" type="xs:string"/>

<xs:element name="source" type="xs:string" minOccurs="0" maxOccurs="1"/>

</xs:sequence>

</xs:complexType>

Puesto que este tipo de datos se utiliza para tanto para definir las relaciones dentro de la

creación un caso de uso como para añadir un relación individual, la etiqueta source será

opcional ya que si estamos creando un caso de uso nuevo el origen ya es conocido.

52

5.2.2.2.4.2.3 Modelo de interacción

Por último hablaremos de las acciones referentes al modelo de interacción. Puesto que los

modelos de interacción introducidos en el sistema son completos, contienen todas las

peticiones posible, existen tres tipos de acciones: eliminar peticiones de un diagrama,

modificar peticiones o añadir diagramas completos, en este punto es necesario una

explicación.

Como se ha indicado, los diagramas de interacción son completos, por tanto se ha definido

incluir todos los diagramas durante la precarga con una variable que indicará si están activos,

es decir si en base a las responsabilidades definidas se aplican a la particularización del

usuario, o si por el contrario no estarán habilitados.

53

5.2.2.2.4.3 Acción Eliminar Petición

Este tipo de acciones define la información necesaria para eliminar una petición de un

diagrama, para ello serán necesarias las siguientes etiquetas: diagrama, que indica el nombre

del diagrama al que hace referencia la acción, y objetoEmisor, objetoReceptor y

methodName(nombre del método) para localizar la petición concreta que será eliminada.

xs:complexType name="eliminarPeticion">

<xs:sequence>

<xs:element name="diagrama" type="xs:string"/>

<xs:element name="objetoEmisor" type="xs:string"/>

<xs:element name="objetoReceptor" type="xs:string"/>

<xs:element name="methodName" type="xs:string"/>

</xs:sequence>

</xs:complexType>

5.2.2.2.4.4 Acción Modificar Petición

Modificar una petición, al igual que el apartado anterior, pasa por localizar la petición que

quiere modificarse y por indicar los parámetros de la misma.

Para ello se han definido las siguientes etiquetas: diagrama, que indica el nombre del

diagrama al que hace referencia la acción; objetoEmisor, objetoReceptor y

methodName(nombre del método) para localizar la petición concreta, y parámetros(param)

que contendrá la información que desea modificarse.

<xs:complexType name="modPeticion">

<xs:sequence>

<xs:element name="diagrama" type="xs:string"/>

<xs:element name="objetoEmisor" type="xs:string"/>

<xs:element name="objetoReceptor" type="xs:string"/>

<xs:element name="methodName" type="xs:string"/>

<xs:element name="param" type="xs:string" minOccurs="0"/>

</xs:sequence>

</xs:complexType>

5.2.2.2.4.5 Acción Añadir Diagrama

Por último, la acción de añadir un diagrama se traduce en activarlo, para lo cual únicamente

será necesario indicar el nombre del diagrama que se ha de habilitar.

<xs:element name=" anadirDiagrama " type="xs:string"/>

54

5.3 Ofrecer modelos reusables

Este apartado describe el proceso mediante el cual el usuario del sistema obtiene la

documentación generada por el sistema. Como anteriormente hemos hablado, esta

documentación se estructura en diferentes formatos, pero en este apartado nos centraremos

únicamente en el formato de diseño UML y sus representaciones.

Figura 16: proceso de obtención de modelos reusables

La figura 16 explica el proceso de obtención de modelos reusables, es decir, de qué manera

trasformamos la información que tenemos en el sistema (en objetos) en algún tipo de

información que pueda ser reutilizada por otro programa, es este caso de diseño.

Lo cierto es que la investigación que realizamos para lograr este objetivo fue la más compleja y

la que duró más tiempo, de hecho podemos hablar de una primera aproximación sobre la cual

tuvimos que desechar el proceso que se había definido, y una segunda aproximación que nos

permitió llegar al resultado final. De este modo el desarrollo del apartado se divide en dos

grupos, Primera y Segunda aproximación.

55

5.3.1 Primera aproximación

Una vez que sabemos de qué forma introduciremos en el sistema el conocimiento (guía de

diseño y guía de elicitación) y cómo se manipularán los modelos de diseño genéricos dentro

del sistema a través de acciones, debemos realizar un estudio sobre las posibilidades que

tenemos para ofrecer un resultado reutilizable.

El resultado a ofrecer debe seguir un estándar, como se ha indicado el estándar de diseño

software es UML y por tanto el fin de este estudio es transformar los objetos que se han

creado en el sistema y que representan diagramas de clases, casos de uso e interacción, en

diagramas UML.

En esta primera aproximación realizaremos dividiremos el proceso en dos partes:

1. Transformar de objetos a XML

2. Transformar de XML a UML

La figura explica de manera gráfica dicha división:

Figura 17: división del proceso de ofrecer modelos reusables

56

5.3.1.1 XML Data Binding

El término XML data binding se refiere al proceso para representar información de un

documento XML en objetos en memoria de un computador y viceversa. En nuestro caso

particular, debemos generar documentos XML a partir de los objetos java del sistema.

Para ello, encontramos Castor XML, un framework para realizar XML Data Binding. A diferencia

de las principales APIs para XML: DOM (Document Object Model) y SAX (Simple API for XML),

que se ocupan de la estructura de un documento XML, Castor permite hacer frente a los datos

definidos en un documento XML a través de un modelo de objetos que representa esos datos.

Castor XML puede hacer Marshalling y Unmarshalling de objetos Java y de XML. En la mayoría

de los casos, el marco de marshaling usa un conjunto de ClassDescriptors y FieldDescriptors

para describir como un objeto de base mapeado y viceversa desde un XML.

Figura 18: Marshalling & Unmarshalling

Para aquellos no familiarizados con los términos "marshal" y "unmarshal", es simplemente el

acto de convertir una secuencia de bytes desde y hacia un objeto.

El acto de "Marshall" consiste en convertir un objeto en un documento XML, y "unmarshalling"

de un documento XML a un objeto.

El mapeo a XML que proporciona Castor es una manera de simplificar la unión entre objetos

Java con un documento XML. Castor permite transformar los datos contenidos en un modelo

de objetos Java en un documento XML siguiendo los estándares fijados por el W3C.

A pesar de que es posible confiar en el comportamiento por defecto que Castor realiza al pasar

de objetos Java a un documento XML, puede ser necesario tener más control sobre este

comportamiento. Por ejemplo, si un modelo de objetos de Java ya existe, el mapeo Castor XML

puede ser utilizado como un puente entre el documento XML el modelo de objetos de Java.

Castor permite definir algunas de sus formas de realizar los procesos de marshalling y

unmarshalling utilizando un archivo de configuración. Este archivo le proporciona información

explícita a Castor sobre la forma de un documento XML dado y un conjunto dado de objetos

Java que se relacionan entre sí.

57

Un archivo de configuración de Castor es una buena manera de disociar los cambios en la

estructura de un modelo de objetos Java desde los cambios en el formato del documento XML

correspondiente.

5.3.1.1.1 Descripción general

La información del mapeo se especifica mediante un documento XML. Este documento está

escrito desde el punto de vista del objeto de Java y describe cómo las propiedades del objeto

se traducen en XML. Un obstáculo para el archivo de configuración es que Castor debe ser

capaz de deducir sin ambigüedades de qué modo un elemento/atributo XML dado tiene que

traducirse en el modelo de objetos durante el proceso de marshalling.

El archivo de configuración para cada objeto describe cómo cada uno de sus campos tiene que

ser transformado a XML. Un campo es una abstracción de una propiedad de un objeto. Se

puede corresponder directamente a una variable de clase pública o indirectamente a una

propiedad a través de algunos métodos de acceso (getters y setters).

Es posible utilizar el mapping y el comportamiento por defecto de Castor: cuando Castor tiene

que manejar un objeto o un conjunto de datos XML, pero no se puede encontrar información

sobre él en el archivo de configuración, su comportamiento se basará en la configuración que

tiene por defecto. Castor utiliza el API de Java para inspeccionar los objetos de Java y

determinar qué hacer con ellos.

58

5.3.1.1.2 Aplicación de Castor al sistema

Ahora que sabemos que Castor puede realizar de forma automática el mapping a XML

siguiendo los estándares del W3C tan sólo nos queda construir el archivo de configuración en

formato XML en el que se apoye Castor para realizar el proceso de marshalling.

Figura 19: aplicación de castor al sistema

Para realizar el mapeo de una clase Java a XML debemos especificar todos y cada uno de los

elementos de los que se compone una clase, es decir, que si en una clase tenemos un atributo

que es a su vez otra clase (o un elemento que sea de un tipo complejo o que no esté

predefinido como tipo estándar) deberemos definirlo en el archivo de configuración.

59

A continuación veremos un ejemplo para el diagrama de clases:

La clase ClassDiagram tiene 2 campos, el primero será el nombre traducido como un String y el

segundo campo será una colección del tipo ClassType, es decir, se trata de otra clase.

<mapping>

<class name="Diagram.ClassDiagram">

<map-to xml="Diagram"/>

<field name="name" type="java.lang.String">

<bind-xml name="Name" node="attribute"/>

</field>

<field name="classes" type="Diagram.ClassType" collection="arraylist">

<bind-xml name="Class" node="element"/>

</field>

</class>

La clase ClassType está compuesta por:

<class name="Diagram.ClassType">

<map-to xml="Class"/>

<field name="name" type="java.lang.String">

<bind-xml name="Name" node="attribute"/></field>

Name: nombre que se traduce en String

<field name="methods" type="java.lang.String" collection="arraylist">

<bind-xml name="Method" node="element"/></field>

methos: métodos que se traducen en una lista de Strings

<field name="attributes" type="java.lang.String" collection="arraylist">

<bind-xml name="Attribute" node="element"/></field>

atributes: atributes que se traducen en una lista de Strings

<field name="associations" type="Diagram.RelationType" collection="arraylist">

<bind-xml name="Association" node="element"/></field>

associations: asociaciones que se traducen en una lista de tipo

RelationType.

<field name="compositions" type="Diagram.RelationType" collection="arraylist">

<bind-xml name="Composition" node="element"/></field>

compositions: asociaciones que se traducen en una lista de tipo

RelationType.

<field name="aggregations" type="Diagram.RelationType" collection="arraylist">

<bind-xml name="Aggregation" node="element"/></field>

aggregations: asociaciones que se traducen en una lista de tipo

RelationType.

60

<field name="generalizations"type="Diagram.RelationType"collection="arraylist">

<bind-xml name="Generalization" node="element"/></field>

generalizations: asociaciones que se traducen en una lista de tipo

RelationType.

<field name="dependencies" type="Diagram.RelationType" collection="arraylist">

<bind-xml name="Dependency" node="element"/></field>

dependencies: asociaciones que se traducen en una lista de tipo

RelationType.

Por último la clase RelationType se traducirá de la siguiente manera:

<class name="Diagram.RelationType">

<field name="multiplicity" type="java.lang.String">

<bind-xml name="Multiplicity" node="element"/></field>

multiplicity: mutiplicidad de la relacion que se traduce en String.

<field name="RelationTarget" type="java.lang.String">

<bind-xml name="RelationTarget" node="element"/></field>

RelationTarget: nombre del destino de la relación que se traduce en String.

<field name="roleName" type="java.lang.String">

<bind-xml name="RoleName" node="element"/></field>

roleName: nombre que se le da a la relación que se traduce en String.

61

5.3.1.2 De XML a UML

Llegados a este punto, tenemos unos documentos XML que contienen los modelos de diseño.

Puesto que la salida deben ser modelos de diseño, éstos se representan en UML y UML está

representado en XML, el siguiente paso se centra en hacer que los documentos XML sigan el

estándar de UML con el fin de que una herramienta CASE pueda representar su contenido en

diagramas gráficos.

La figura 20 refleja de forma gráfica el punto donde nos encontramos explicado

anteriormente.

Figura 20: de XML a UML

Por tanto, debemos realizar una búsqueda para comprobar si existe algún tipo de aplicación ya

construida o librería que nos permita pasar de XML a UML. Es muy difícil pensar que a partir

de un XML construido de forma personalizada pueda existir una librería que pueda

estandarizarlo a UML, pero podríamos encontrar alguna otra librería que a partir de algún paso

previo o a través de la librería Castor sea capaz de realizar esta conversión.

Si nos fijamos en cómo es un documento UML por dentro, observamos que su estructura es la

de un documento de XML pero además, el propio programa que lo ha generado introduce

ciertas etiquetas que solamente él puede entender.

Debemos dar un paso atrás y replantearnos si debemos continuar con la misma estructura

interna que maneja los objetos (maneja y crea), porque a partir del mapeo no conseguimos

estandarizar nada, simplemente vemos líneas futuras a través de la construcción de otra

herramienta que traduzca el XML obtenido (aunque esté basado en el W3C) en UML. De

manera ilustrativa, en la figura 21 se muestra el proceso fallido.

Figura 21: fallo al pasar de XML a UML

62

5.3.1.3 Reflexiones de la primera aproximación

Llegados a un punto donde se proporciona una salida válida pero no óptima, debemos

plantearnos hasta qué punto debemos optimizar el producto obtenido.

Partimos de que ya tenemos un documento generado en XML, y que además sigue un

estándar fijado por una organización que se dedica a crear y difundir estándares. Pero, ¿es

realmente lo que nosotros queremos en una herramienta de este estilo? ¿Hasta qué punto

vamos a ser exigentes con el resultado final?

Puesto que el deseo inicial de toda la investigación siempre fue obtener algo que pueda ser

usado y no solo conformarnos con algo que en un futuro puede ser transformado para ser

usado, debemos dar un paso atrás hasta el punto que veamos necesario.

En un principio el retroceso en la investigación/desarrollo no debería tener un gran impacto

puesto que la mayor parte de los objetivos están cubiertos, por lo que tenemos que centrarnos

en la obtención de un formato estándar, que puede seguir o no la estandarización XML pero

que alguna herramienta CASE, o simplemente un editor de imágenes pueda entender.

Así pues, volvemos al punto de tener ya un patrón personalizado en objetos y necesitamos de

alguna manera hacer una persistencia de ellos de forma que otra aplicación (relacionada con

diseño software) pueda entenderlo.

63

5.3.2 Segunda aproximación

La situación de la investigación a esta altura nos obliga a plantearnos nuevos caminos para

conseguir el único objetivo aún no resuelto, la confección de los diseños específicos.

Partiendo de nuevo de la necesidad de poder obtener el resultado en un formato estándar que

pueda ser entendido por una herramienta, de nuevo nos plantea las líneas futuras o presentes

del proyecto. ¿Es necesaria una representación portable? La respuesta es simple, no, pero

entonces el trabajo no estará terminado, orientando el resultado a unas líneas nuevas de

desarrollo de una aplicación que soporte la representación ya alcanzada.

Otra necesidad inducida por el trabajo terminado es la representación gráfica. Es posible que

estemos pasando por alto la existencia de algo tan evidente como una representación gráfica

a través de una manipulación de objetos y que puedan facilitar una salida en formato de

imagen.

Si de alguna manera pudiéramos combinar estos aspectos tendríamos un proyecto cerrado y

habremos satisfecho todos los objetivos iniciales propuestos para este proyecto. La

combinación de todos es conocido que es posible y ya existe, es decir, la representación que

ofrecen las herramientas CASE que están en el mercado. Estas herramientas por un lado

permiten el almacenamiento de archivos propios de la herramienta con una extensión propia,

y por otro, suelen permitir una exportación a una imagen de forma que pueda ser utilizada

para otros fines.

De manera que un nuevo enfoque o visión de las líneas de investigación podría consistir en

analizar internamente una herramienta de edición de diseño y en alguna manera existente de

intercambio de información entre ellas. De este nuevo enfoque surge el concepto XMI,

explicado en el punto 4.6 XMI.

5.3.2.1 XMI

El concepto XMI nace como fruto de investigar la posibilidad de intercambio de información

entre herramientas CASE.

Este estándar XML debería aportarnos al proyecto un alto nivel de portabilidad de modo que la

salida facilitada por el sistema pudiera no solo ser interpretada por otras herramientas, sino

puede ser editada, facilidad que sería aportada al proyecto de modo adicional.

Es decir, podríamos crear un proyecto de diseño nuevo a partir de las inclusiones de elementos

que se han realizado a través de una importación en XMI o bien, usar estos elementos para un

proyecto ya creado.

A continuación describiremos de qué manera aplicaremos el estándar XMI en el proyecto.

64

5.3.2.2 Aplicación de XMI en el proyecto

Este nuevo concepto de cara al proyecto, tiene muchas utilidades por lo que debemos conocer

de qué manera nos será útil en su aplicación. Puesto que XMI ya es un estándar extendido y

usado por muchos programas y aplicaciones, lo ideal sería encontrar una librería que nos

proporcionara una forma de representación de UML en objetos, y que además, sea capaz de

transcribirlos en formato XMI.

La aplicación de XMI en el proyecto además supondrá evitarnos un paso intermedio puesto

que no necesitaremos transformar información a UML sino que la representación de XMI, aún

siendo un formato XML, nos permite ofrecer los modelos de manera que sea reusables por

otras aplicaciones externas. La figura 22 nos muestra este único proceso.

Figura 22: aplicación de XMI en el proyecto

65

5.3.2.3 UMLGraph

UMLGraph permite la especificación declarativa y el dibujo de diagramas casos de uso, de

clase y diagramas de secuencia en UML. La especificación primeramente se hace en formato

de texto, para luego ser transformarlo en la representación gráfica apropiada.

Los diseñadores suelen crear sus diagramas de modelo utilizando un editor de dibujo. Sin

embargo, todos los editores de dibujo realizan una manipulación exigente y tediosa a la hora

de dibujar formas en el lienzo. El esfuerzo y las habilidades de coordinación motora necesaria

para esta actividad son en su mayoría irrelevantes para el resultado final: a diferencia de los

modelos de arquitectura e ingeniería mecánica, la aparición de modelos de un sistema

software están sólo marginalmente relacionados con la calidad del diseño de software

representados. Lo ideal sería una mezcla de ambas teorías, puesto que, son teorías

complementarias.

El nivel de abstracción de una librería como esta debe ser muy elevada, puesto que la

construcción interna de los diferentes modelos aceptados debe ser trivial para el programador,

es decir, la construcción del sistema deberá hacerse a través de métodos fachada.

La apuesta inicial en esta librería se basa en su capacidad para representar a nivel de objeto

todos los tipos de diagramas que necesitamos para nuestro fin (casos de uso, clases e

interacción).

Como elemento adicional, UMLGraph proporciona unos métodos de representación en

formato gráfico, muy útiles a la hora de poder realizar un depurado de los modelos

construidos, pudiendo componer una salida gráfica de hasta tres tipos de formatos: JPG, SVG y

PNG.

La importación de XMI se realiza de forma inmediata a través de un método único a modo de

fachada. Sin embargo, la exportación a XMI, que se realiza a través de otro método único de

forma análoga a la importación, pero en este caso tan solo soporta la exportación del modelo

de clases.

De manera que, aunque sea una librería muy completa en cuanto a posibilidades gráficas, no

lo es en cuanto a exportación de sus componentes en XMI. Por lo tanto, no es una librería

válida para aplicar en el proyecto.

66

5.3.2.4 Otras librerías parecidas

La búsqueda por la red de proyectos ya acabados y documentados prosiguió por encontrar una

librería que se adaptara de forma total a nuestro objetivo. El hecho de conseguir mapear

objetos en XMI es algo que no es nuevo, muchas herramientas CASE lo hacen sin ningún tipo

de complejidad, por lo que la nueva búsqueda deberá estar dirigida a librerías usadas en estas

herramientas CASE.

Ejemplos de librerías son las que nos presenta Novosoft:

NS MDF Library

NS UML library

Estas librerías con las empleadas en una famosa herramienta CASE construida en Java,

ArgoUML, y puesto que la aplicación final estará escrita en Java, podría sernos de gran utilidad.

El problema que arrastran estas librerías es la escasa documentación de su API, por lo que la

evaluación el tiempo de comprensión de las librerías debe ser medido de forma muy precisa

para las posibles decisiones futuras.

Existen algunos plugins para ciertas herramientas IDE de desarrollo, por lo que también nos

hace pensar que podríamos conducir la investigación hacia la comprensión de la

documentación de estos plugins orientados al desarrollo y no al diseño, es decir, obtener de

algún modo el código fuente de los plugins.

Llegados a este punto, llega una toma de decisiones que afectará al resto del proyecto en

cuanto a tiempo se refiere. Podemos seguir buscando algo que se ajuste a lo que necesitamos,

o bien, evaluar el tiempo de desarrollo que podría suponer construir una librería de este tipo

para el proyecto. Si tenemos en cuenta que existen muchas herramientas de desarrollo que

proporcionan un plugin llamado “ingeniería inversa”, es deducible que no suponen un esfuerzo

excesivamente grande llevar a cabo su construcción.

Analizando cuidadosamente el tiempo que podría conllevar la especialización en una

herramienta ya construida, sin apenas información, notamos que sería un tiempo muy

parecido a la construcción propia de la herramienta, pero con una ventaja importante para la

construcción; conocemos el producto porque lo hemos realizado nosotros mismos. Por lo que

si hubiera cualquier problema en la integración con la aplicación final, encontraríamos más

fácilmente como solventarlo.

67

5.3.2.5 Construcción de una librería

Una vez tomada la decisión de construir nuestra propia librería, debemos saber cómo

comenzar su creación. La línea lógica de investigación está compuesta por los estándares

propuestos y las aplicaciones y/o API’s que los contemplan e implementan.

5.3.2.6 XMI & StarUML

Partiendo de que XMI es un estándar creado por la OMG, accederemos a los estándares

publicados por esta organización, y realizaremos un estudio sobre las consideraciones y

recomendaciones que nos ilustran estos documentos.

La documentación de los estándares de XMI los podemos encontrar en la página

http://www.omg.org/spec/XMI/2.1.1/ . En esta página existen varias versiones y éstas en

varios formatos de archivos (PDF, PS etc.), pero básicamente todas ellas disciernen en

pequeñas puntualizaciones. Todas ellas nos hablan del esquema a seguir y de las distintas

formas de representación que dispone XMI, por lo que no es suficiente para la confección de la

librería.

Una forma de complementar esta documentación es examinar una herramienta CASE que

permita la exportación a XMI, que tenga licencia de libre distribución y que además, podamos

obtener su código fuente. Una de estas herramientas es StarUML.

StarUML es una herramienta de diseño (CASE) escrita en Pascal y que proporciona un interfaz

cómodo y sencillo. Además, entre sus opciones de importación y exportación se encuentra la

opción de importar/exportar desde/a XMI por lo que es idónea para nuestro propósito. El

código fuente encontrado se encuentra en un repositorio de desarrollo donde podremos

descargar todo el proyecto. El fin de su publicación es tener la posibilidad de incorporar

algunas mejoras y realizar correcciones de posibles bugs. Este repositorio se encuentra en dos

formatos de control de versiones: SVN (subversion) y CVS (Concurrent version system).

svn co https://staruml.svn.sourceforge.net/svnroot/staruml staruml para SVN

cvs -d:pserver:[email protected]:/cvsroot/staruml login

cvs -z3 -d:pserver:[email protected]:/cvsroot/staruml co -P

modulename para CVS

De modo que a través de las salidas provocadas por las exportaciones a XMI de StarUML, junto

con las especificaciones declaradas en los estándares que propone la OMG, obtenemos una

representación en XML (XMI) para los 3 tipos de diagramas UML que necesitamos representar.

Cabe destacar que una familiarización con el manejo de la herramienta, facilita enormemente

el trabajo de construcción de la representación, ya que cada variable de cada atributo XMI que

veremos a continuación es modificable a través de la propia herramienta y es visible tanto de

forma gráfica como de forma textual.

68

5.3.2.7 Representación XMI

Vamos a explicar cuál es la representación de cada tipo de diagrama UML y sus componentes.

Explicaremos el significado de cada atributo de XMI en la representación UML, es decir,

realizaremos una traducción partiendo del formato gráfico hasta llegar al formato de texto

XML (XMI). Deberemos entender previamente que cada elemento expresado en un formato

XML, requiere el uso de atributos XML y de Nodos hijos que nos servirán para ir explicando el

hecho de que un elemento puede contener varios elementos relacionados directamente con él

(namespaces), de tal forma que iremos explicando desde la capa más externa a la más interna.

Empezaremos con el formato que debe tener el documento.

5.3.2.7.1 Formato general

Antes de comenzar a definir la representación XMI de UML, debemos mencionar brevemente

el formato que debe seguir el documento. Deberá tener dos partes diferenciadas:

Cabecera: irá siempre al principio del documento y deberá contener información

adicional al documento. Estos datos informativos serán:

o Versión XMI

o Fecha

o Propietario.

o Contacto

o Exportador

o Versión del exportador

o Otra información de interés

Ej:

<XMI xmi.version="1.1" timestamp="Thu Oct 28 14:16:25 2010">

<XMI.header>

<XMI.documentation>

<XMI.owner/>

<XMI.contact/>

<XMI.exporter>TxemaAlex</XMI.exporter>

<XMI.exporterVersion>1.0</XMI.exporterVersion>

<XMI.notice/>

</XMI.documentation>

<XMI.metamodel xmi.name="UML" xmi.version="1.3"/>

</XMI.header>

Cuerpo: contendrá el resto de la información XMI asociada al proyecto que queramos

representar.

A continuación describiremos todo el posible contenido del cuerpo del documento XMI.

69

5.3.2.7.2 Representación de un proyecto

El proyecto simboliza todo el conjunto de diagramas que se van a detallar en el mismo

documento XMI. Para ello, deberemos definir una serie de etiquetas padre o nodos raíz de las

cuales todas las demás etiquetas dependan. Esto expresado en formato XMI (XML) será:

<XMI.content>

Comenzaremos el documento con una etiqueta XMI.content que será nuestro nodo raíz de

todo el documento.

<UML:Model xmi.id="UMLProject.1">

A continuación deberemos escribir el proyecto con la etiqueta UML:Model seguida por el

atributo id que expresará el identificador anteriormente comentado.

<UML:Namespace.ownedElement>

Por último abriremos la etiqueta UML:Namespace.ownedElement a partir de la cual

escribiremos el contenido del proyecto.

70

5.3.2.7.3 Representación de un modelo

En el estándar UML existen muchos tipos de modelos de los cuales nos quedaremos tan sólo

con 3 de ellos: los diagramas o modelos de casos de uso, los diagramas o modelos de clases y

los diagramas o modelos de secuencia/interacción. La representación del modelo pues,

significara crear el nodo padre que contendrá todo nuestro diagrama. De tal forma que para

representar en XMI cualquiera de los diagramas anteriormente citados tendremos que añadir:

<UML:Model xmi.id="undoUseCase" name="undoUseCase" visibility="public"

isSpecification="false" namespace="DUPP" isRoot="false" isLeaf="false" isAbstract="false">

Donde:

id: identificador único en todo el fichero. En caso de solo existir un solo modelo, podría

coincidir con el nombre dado al modelo.

name: nombre que se le quiera dar al modelo.

visibility: tipo de visibilidad del modelo. Puede ser:

o public: publico.

o private:privado.

o protected:protegido.

o package:paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al proyecto.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

Después de la declaración de cada diagrama, deberemos introducir la etiqueta

“<UML:Namespace.ownedElement>” exactamente de la misma manera que para el proyecto,

indicando así que a continuación introduciremos los elementos relacionados con el diagrama

en cuestión.

Cada modelo tendrá a partir de aquí una representación interna diferente, por lo que iremos

explicando poco a poco cada uno de los modelos.

71

5.3.2.7.4 Representación del modelo de casos de uso

Dividiendo el modelo de casos de uso en elementos/componentes podemos dividir éstos en 3

grandes grupos: actores, casos de uso y relaciones. XMI por su lado también hace esta

diferenciación de tal modo que directamente dentro del nodo padre del modelo se distinguen

actores, casos de uso y todo tipo de relaciones diferenciadas por su carácter en UML: include,

extend, association y generalization. Explicaremos de qué manera se representan todos estos

componentes internos.

Para visualizar de forma gráfica se presenta a continuación y pequeño esquema de la

organización del modelo de casos de uso en XMI. Este esquema correspondería a la jerarquía

interna del XML, es decir, si navegáramos de izquierda a derecha, iríamos de la etiqueta padre

(raíz) a las etiquetas hijas (hojas). La simbología representada es la estándar en cuanto a

cardinalidades:

num: cardinalidad obligatoria.

num1..num2: cardinalidad variable (de num1 a num2)

*: cardinalidad variable (de 0 a infinito)

Figura 23: esquema modelo casos de uso

72

5.3.2.7.4.1 Actor

Especifica un rol jugado por un usuario o cualquier otro sistema que interactúa con el sujeto.

Ejemplo:

<UML:Actor xmi.id="UMLActor.3" name="actor" visibility="public" isSpecification="false"

namespace="UMLModel.2" isRoot="false" isLeaf="false" isAbstract="false"

participant=" UMLAssociationEnd.7 UMLAssociationEnd.15"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al actor. Aparecerá como nombre en UML

visibility: tipo de visibilidad del actor. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

participant: es una lista separada por espacios en blanco que representan las

relaciones que tiene con los casos de uso.

También tiene la posibilidad de incluir otros atributos propios de los casos de uso, pero no

tienen sentido, como por ejemplo un include o un extend, por lo que no se especificarán en el

apartado del actor.

73

5.3.2.7.4.2 UseCase

Técnica para la captura de requisitos potenciales de un nuevo sistema o una actualización de

software. Cada caso de uso proporciona uno o más escenarios que indican cómo debería

interactuar el sistema con el usuario o con otro sistema para conseguir un objetivo específico.

Ejemplo:

<UML:UseCase xmi.id="UMLUseCase.4" name="caso1" visibility="public"

isSpecification="false" namespace="UMLModel.2" isRoot="false" isLeaf="false"

isAbstract="false" participant="UMLAssociationEnd.8" extend2="UMLExtend.11"

include="UMLInclude.9"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al caso de uso. Aparecerá como nombre en UML

visibility: tipo de visibilidad del caso de uso. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

participant: lista separada por espacios en blanco que representan las relaciones que

tiene (asociaciones).

include: lista separada por espacios en blanco que representan las relaciones

“include”que tiene (como origen).

include2: lista separada por espacios en blanco que representan las relaciones

“include” que tiene (como destino).

extend: lista separada por espacios en blanco que representan las relaciones “extend”

que tiene (como origen).

extend2: lista separada por espacios en blanco que representan las relaciones

“extend” que tiene (como destino).

generalization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como origen).

specialization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como destino).

En el caso del ejemplo, el caso de uso “caso1”, tiene visibilidad pública y 3 relaciones. Una de

ellas es una asociación de la cuál es destino, una include de la cuál es origen y una extend de la

cuál es destino también. Los atributos de los tipos de relaciones no.

74

5.3.2.7.4.3 Association

Relación (asociación) entre un actor y un caso de uso que denota la participación del actor en

dicho caso de uso.

Ejemplo:

<UML:Association xmi.id="UMLAssociation.6" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2">

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación. Normalmente suele ir vacio al no

llevar nombre la relacion

visibility: tipo de visibilidad de la relacion. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

La relación en XMI tiene un nodo hijo <Association.connection> que a su vez tiene dos nodos

hijos <AssociationEnd>. El primero de ellos estará relacionado con el origen de la relación, y el

segundo con el destino.

75

5.3.2.7.4.4 AssociationEnd

Indica el elemento destino de una relación. Cada “AssociationEnd” tiene todos los atributos

necesarios para expresar en una relación UML:

<UML:AssociationEnd xmi.id="UMLAssociationEnd.7" name="" visibility="public"

isSpecification="false" isNavigable="false" ordering="unordered" aggregation="none"

targetScope="instance" changeability="changeable" association="UMLAssociation.6"

type="UMLActor.3"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación. Normalmente suele ir vacio. No tiene

relevancia.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

isNavigable: es un booleano que determina si es el origen (false) o el destino (true). En

caso de que la relación no tenga sentido de navegación, los dos AssociationEnd

tendrán que ser true.

ordering: indica si es una relación que tiene orden (ordered) o no (unordered).

targetScope: nos muestra el ámbito del objetivo. Puede ser:

o instance : instancia.

o classifier: clase.

changeability: puede ser:

o changeable: que puede ser modificado.

o frozen: no editable.

o addonly: solo se puede añadir pero no borrar.

association: siempre será el identificador de la “Association” padre.

type: en cada caso, será el identificador del extremo al que está ligado, es decir, si este

“AssociationEnd” representa al origen, el id que deberá contener este campo será el id

del origen.

76

5.3.2.7.4.5 Include

Relación de dependencia entre dos casos de uso que denota la inclusión del comportamiento

de un escenario en otro.

Ejemplo:

<UML:Include xmi.id="UMLInclude.9" name="" visibility="public" isSpecification="false"

namespace="UMLModel.2" base="UMLUseCase.4" addition="UMLUseCase.5"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación include.

visibility: tipo de visibilidad de la relación include. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

base: identificador de un caso de uso que representa el origen de la relación.

addition: identificador de un caso de uso que representa el destino de la relación.

Deberán aparecer tantos elementos UML:Include como relaciones include existan en el

modelo, detallando de esta forma la relación de forma distinguida.

77

5.3.2.7.4.6 Extend

Relación de dependencia entre dos casos de uso que denota que un caso de uso es una

especialización de otro.

<UML:Extend xmi.id="UMLExtend.11" name="" visibility="public" isSpecification="false"

namespace="UMLModel.2" base="UMLUseCase.4" extension="UMLUseCase.10"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación extend.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

base: identificador de un caso de uso que representa el destino de la relación.

extension: identificador de un caso de uso que representa el origen de la relación.

Deberán aparecer tantos elementos UML:Extend como relaciones extend existan en el

modelo, detallando de esta forma la relación de forma distinguida. Nótese que en este caso, el

atributo “base” es el caso de uso destino y el atributo “extensión” el origen, puesto que, el

sentido de la relación por su semántica debería ser así.

78

5.3.2.7.4.7 Dependency

Relación entre dos casos de uso que refleja que el origen depende del destino.

<UML:Dependency xmi.id="UMLDependency.12" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2" client="UMLActor.3"

supplier="UMLUseCase.5"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación dependency.

visibility: tipo de visibilidad de la realción. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

base: identificador de un caso de uso que representa el destino de la relación.

extension: identificador de un caso de uso que representa el origen de la relación.

Deberán aparecer tantos elementos UML:Extend como relaciones extend existan en el

modelo, detallando de esta forma la relación de forma distinguida. Nótese que en este caso, el

atributo “base” es el caso de uso destino y el atributo “extensión” el origen, puesto que, el

sentido de la relación por su semántica debería ser así.

79

5.3.2.7.4.8 Generalization

Relación que denota una especificación de un caso de uso en otro.

<UML:Generalization xmi.id="UMLGeneralization.13" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2" discriminator="" child="UMLUseCase.5"

parent="UMLUseCase.10"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación generalization.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

discriminator: nombre que se le puede asignar a la relación para distinguirlo de otra.

child: identificador de un caso de uso que representa el origen de la relación.

parent: identificador de un caso de uso que representa el destino de la relación.

Deberán aparecer tantos elementos UML:Extend como relaciones extend existan en el

modelo, detallando de esta forma la relación de forma distinguida. Nótese que en este caso, el

atributo “base” es el caso de uso destino y el atributo “extensión” el origen, puesto que, el

sentido de la relación por su semántica debería ser así.

80

5.3.2.7.4.9 Stereotype

Además de los elementos de los que hemos hablado anteriormente, en XMI, se describe un

estereotipo para la representación de datos aún no contemplados. Estos estereotipos sirven

para añadir información a un elemento sobre el modelo, es decir, proporcionan información

complementaria pero no absoluta. Un ejemplo de estereotipo podría ser añadir a una relación

la información de que se realiza una suscripción (incorporado en UML como suscribe) o bien

definir un estereotipo propio que tenga sustancialmente información.

<UML:Stereotype xmi.id="X.18" name="useCaseModel" extendedElement="UMLModel.2"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al estereotipo.

extendedElement: es el nombre que se haya puesto al modelo de casos de uso.

81

5.3.2.7.5 Representación del modelo de clases

Dividiendo el modelo de clases en elementos/componentes podemos dividir éstos en 2

grandes grupos: clases y relaciones. XMI por su lado también hace esta diferenciación de tal

modo que directamente dentro del nodo padre del modelo se distinguen clases y todo tipo de

relaciones diferenciadas por su carácter en UML: association, generalization y dependency.

Explicaremos de qué manera se representan todos estos componentes internos.

Para visualizar de forma gráfica se presenta a continuación y pequeño esquema de la

organización del modelo de clases en XMI. Este esquema correspondería a la jerarquía interna

del XML, es decir, si navegáramos de izquierda a derecha, iríamos de la etiqueta padre (raíz) a

las etiquetas hijas (hojas). La simbología representada es la estándar en cuanto a

cardinalidades:

num: cardinalidad obligatoria.

num1..num2: cardinalidad variable (de num1 a num2)

*: cardinalidad variable (de 0 a infinito)

Figura 24: esquema modelo de clases

82

5.3.2.7.5.1 Class

Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia

de una clase). A través de ella podemos modelar el entorno en estudio.

<UML:Class xmi.id="UMLClass.4" name="clase1" visibility="public" isSpecification="false"

namespace="UMLModel.3" isRoot="false" isLeaf="false" isAbstract="false"

clientDependency="UMLDependency.46 UMLRealization.47"

supplierDependency="UMLDependency.31" generalization="UMLGeneralization.45"

specialization="UMLGeneralization.57" participant="UMLAssociationEnd.22" isActive="false">

id: identificador único en el modelo.

name: nombre que se le quiera dar a la clase.

visibility: tipo de visibilidad de la clase. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de clases.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

clientDependency: lista separada por espacios en blanco que representan las

relaciones “dependency”que tiene (como origen).

supplierDependency: lista separada por espacios en blanco que representan las

relaciones “dependency” que tiene (como destino).

generalization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como origen).

specialization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como destino).

participant: lista separada por espacios en blanco que representan las relaciones que

tiene (asociaciones).

isActive: booleano que determina si está activo. Por defecto es “false”.

Como hemos podido observar en el esquema gráfico, cada “Class” puede tener incluido

“Attribute” y “Operation”. Para delimitar su contenido, se utilizará la etiqueta

“<UML:Classifier.feature>”.

83

5.3.2.7.5.2 Attribute

Un atributo representa alguna propiedad de la clase que se encuentra en todas las instancias

de la clase:

<UML:Attribute xmi.id="UMLAttribute.4" name="Attribute1" visibility="private"

isSpecification="false" ownerScope="instance" changeability="changeable"

targetScope="instance" type="" owner="UMLClass.3"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al atributo.

visibility: tipo de visibilidad del atributo. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

ownerScope: es nos muestra el ámbito del nodo padre. Puede ser:

o instance: instancia.

o classifier: clase.

changeability: puede ser:

o changeable: que puede ser modificado.

o frozen: no editable.

o addonly: solo se puede añadir pero no borrar.

targetScope: nos muestra el ámbito del objetivo. Puede ser:

o instance : instancia.

o classifier: clase.

o

type: tipo del atributo.

owner: es el identificador de la clase a la que pertenece.

84

5.3.2.7.5.3 Operation

Un método u operación es la implementación de un servicio de la clase, que muestra un

comportamiento común a todos los objetos. En resumen es una función que le indica a las

instancias de la clase que hagan algo.

<UML:Operation xmi.id="UMLOperation.6" name="Operation1" visibility="public"

isSpecification="false" ownerScope="instance" isQuery="false" concurrency="sequential"

isRoot="false" isLeaf="false" isAbstract="false" specification="" owner="UMLClass.3"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la operación (método).

visibility: tipo de visibilidad de la operación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

ownerScope: es nos muestra el ámbito del nodo padre. Puede ser:

o instance: instancia.

o classifier: clase.

isQuery: es un booleano que determina si es una query sql.

concurrency: indica la concurrencia de la operación. Puede ser:

o sequential: secuencial.

o guarded: intermedio entre secuencial y concurrente (comedido).

o concurrent: concurrente.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

specification: especificación. Por defecto tiene el valor “” (vacío).

owner: es el identificador de la clase a la que pertenece.

85

5.3.2.7.5.4 Interface

Una Interfaz es una especificación para las operaciones externas visibles de una clase,

componente u otra entidad (incluyendo unidades globales como los paquetes), pero siempre

sin especificar la estructura interna.

<UML:Interface xmi.id="UMLInterface.16" name="inter1" visibility="public"

isSpecification="false" namespace="UMLModel.2" supplierDependency="UMLRealization.29"

isRoot="false" isLeaf="false" isAbstract="false" participant="UMLAssociationEnd.32">

id: identificador único en el modelo.

name: nombre que se le quiera dar al interfaz.

visibility: tipo de visibilidad del interfaz. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

clientDependency: lista separada por espacios en blanco que representan las

relaciones “dependency”que tiene (como origen).

supplierDependency: lista separada por espacios en blanco que representan las

relaciones “dependency” que tiene (como destino).

generalization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como origen).

specialization: lista separada por espacios en blanco que representan las relaciones

“generalization” que tiene (como destino).

participant: lista separada por espacios en blanco que representan las relaciones que

tiene (asociaciones).

isActive: booleano que determina si está activo. Por defecto es “false”.

Como hemos podido observar en el esquema gráfico, cada “Class” puede tener incluido

“Attribute” y “Operation”. Para delimitar su contenido, se utilizará la etiqueta

“<UML:Classifier.feature>”.

86

5.3.2.7.5.5 Association

Relación (asociación) entre dos clases con o sin direccionalidad.

Ejemplo:

<UML:Association xmi.id="UMLAssociation.6" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2">

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación. Normalmente suele ir vacio al no

llevar nombre la relacion

visibility: tipo de visibilidad de la Association. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de clases.

La relación en XMI tiene un nodo hijo <Association.connection> que a su vez tiene dos nodos

hijos <AssociationEnd>. El primero de ellos estará relacionado con el origen de la relación, y el

segundo con el destino. Cada “AssociationEnd” tiene todos los atributos necesarios para

expresar en una relación UML.

87

5.3.2.7.5.6 AssociationEnd

Indica el elemento destino de una relación. Cada “AssociationEnd” tiene todos los atributos

necesarios para expresar en una relación UML:

<UML:AssociationEnd xmi.id="UMLAssociationEnd.7" name="" visibility="public"

isSpecification="false" isNavigable="false" ordering="unordered" aggregation="none"

targetScope="instance" changeability="changeable" association="UMLAssociation.6"

type="UMLActor.3"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación. Normalmente suele ir vacio. No tiene

relevancia.

visibility: tipo de visibilidad de la AssociationEnd. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

isNavigable: es un booleano que determina si es el origen (false) o el destino (true). En

caso de que la relación no tenga sentido de navegación, los dos AssociationEnd

tendrán que ser true.

ordering: indica si es una relación que tiene orden (ordered) o no (unordered).

targetScope: nos muestra el ámbito del objetivo. Puede ser:

o instance : instancia.

o classifier: clase.

changeability: puede ser:

o changeable: que puede ser modificado.

o frozen: no editable.

o addonly: solo se puede añadir pero no borrar.

association: siempre será el identificador de la “Association” padre.

type: en cada caso, será el identificador del extremo al que está ligado, es decir, si este

“AssociationEnd” representa al origen, el id que deberá contener este campo será el id

del origen.

88

5.3.2.7.5.7 Dependency

Relación entre dos clases que refleja que el origen depende del destino.

<UML:Dependency xmi.id="UMLDependency.12" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2" client="UMLActor.3"

supplier="UMLUseCase.5"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación include.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

base: identificador de un caso de uso que representa el destino de la relación.

extension: identificador de un caso de uso que representa el origen de la relación.

Deberán aparecer tantos elementos UML:Dependency como relaciones dependency existan en

el modelo, detallando de esta forma la relación de forma distinguida. Nótese que en este caso,

el atributo “base” es el caso de uso destino y el atributo “extensión” el origen, puesto que, el

sentido de la relación por su semántica debería ser así.

89

5.3.2.7.5.8 Generalization

Relación que denota una especificación de una clase en otra.

<UML:Generalization xmi.id="UMLGeneralization.13" name="" visibility="public"

isSpecification="false" namespace="UMLModel.2" discriminator="" child="UMLUseCase.5"

parent="UMLUseCase.10"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la relación generalization.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de casos de uso.

discriminator: nombre que se le puede asignar a la relación para distinguirlo de otra.

child: identificador de un caso de uso que representa el origen de la relación.

parent: identificador de un caso de uso que representa el destino de la relación.

Deberán aparecer tantos elementos UML:Generalization como relaciones generalization

existan en el modelo, detallando de esta forma la relación de forma distinguida.

90

5.3.2.7.5.9 Stereotype

Como hemos comentado para los casos de uso estereotipos sirven para añadir información a

un elemento sobre el modelo.

<UML:Stereotype xmi.id="X.18" name="classModel" extendedElement="UMLModel.2"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al estereotipo.

extendedElement: es el nombre que se haya puesto al modelo de clases.

91

5.3.2.7.6 Representación del modelo de interacción

Define el principio mediante el cual se diseña la interacción en el interfaz.

Este modelo es un enfoque holístico de las acciones y funcionalidades de la herramienta, por

lo que indica de forma general como se diseñan los comportamientos del sistema frente a las

distintas acciones.

Para visualizar de forma gráfica se presenta a continuación y pequeño esquema de la

organización del modelo de interacción en XMI. Este esquema correspondería a la jerarquía

interna del XML, es decir, si navegáramos de izquierda a derecha, iríamos de la etiqueta padre

(raíz) a las etiquetas hijas (hojas). La simbología representada es la estándar en cuanto a

cardinalidades:

num: cardinalidad obligatoria.

num1..num2: cardinalidad variable (de num1 a num2)

*: cardinalidad variable (de 0 a infinito)

Figura 25: esquema modelo de interacción

92

5.3.2.7.6.1 Collaboration

Expresa que se va a declarar un modelo de colaboración.

<UML:Collaboration xmi.id="UMLCollaborationInstanceSet.3"

name="CollaborationInstanceSet1" visibility="public" isSpecification="false">

id: identificador único en el modelo.

name: nombre que se le quiera dar a la colaboración.

visibility: tipo de visibilidad de la colaboración. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

Para conocer el alcance de la colaboración, se indica a través de una etiqueta

<UML:Collaboration.interaction> con su correspondiente cierre de etiqueta al final de la

colaboración.

93

5.3.2.7.6.2 Interaction

Esta etiqueta engloba una interacción dentro de una colaboración específica.

<UML:Interaction xmi.id="UMLInteractionInstanceSet.4" name="InteractionInstanceSet1"

visibility="public" isSpecification="false" context="UMLCollaborationInstanceSet.3">

id: identificador único en el modelo.

name: nombre que se le quiera dar a la interaccion.

visibility: tipo de visibilidad de la interacción. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

context: es el nombre que se haya puesto a la colaboración a la que pertenece.

94

5.3.2.7.6.3 Message

Es el mensaje o estímulo provocado para la comunicación entre dos objetos.

<UML:Message xmi.id="UMLStimulus.5" name="llamada1" visibility="public"

isSpecification="false" sender="UMLObject.7" receiver="UMLObject.8"

interaction="UMLInteractionInstanceSet.4">

id: identificador único en el modelo.

name: nombre que se le quiera dar al mensaje, es decir, el nombre del método a

ejecutar con sus parámetros.

visibility: tipo de visibilidad del mensaje. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

sender: identificador del objeto emisor.

receiver: identificador del objeto receptor.

interaction: identificador de la interacción a la que pertenezca.

Además, para cada mensaje deberemos especificar la acción (el tipo de estímulo) con la

etiqueta <UML:Message.action> y su correspondiente etiqueta de cerrado al final de la acción

del mensaje.

95

5.3.2.7.6.4 Action

Las acciones son diferentes dependiendo del tipo de estímulo pudiendo ser:

Call: llamada (estímulo estándar)

Send: envío (se espera una respuesta)

Response: respuesta.

Create: estímulo de creación de un objeto nuevo.

Destroy: estímulo de destrucción de un objeto.

Estas posibilidades irán incluidas de forma implícita en la especificación escrita es decir, irá

dentro del tipo de etiqueta “UML:tipoAction”. El siguiente ejemplo nos muestra una llamada

estándar.

<UML:CallAction xmi.id="UMLCallAction.6" name="" visibility="public" isSpecification="false"

isAsynchronous="false" stimulus="UMLStimulus.5"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la acción, no tiene relevancia.

visibility: tipo de visibilidad de la relación. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

isAsynchronous: es un booleano que determina si es una llamada asíncrona o no.

stimulus: identificador del estímulo al que pertenece.

96

5.3.2.7.6.5 ClassifierRole

ClassifierRole representa a un objeto dentro de un modelo de colaboración Este objeto debe

pertenecer obligatoriamente a una clase determinada que también deberá ir en el contenido

de la etiqueta. Para delimitar el ámbito de las clases (ClassifierRole) se especifica una etiqueta

al comienzo del tipo <UML:Namespace.ownedElement> y otra correspondiente al cierre de

etiquetas en XML al final de su ámbito.

<UML:ClassifierRole xmi.id="UMLObject.7" name="Object1" visibility="public"

isSpecification="false" base="UMLClass.9" message2="UMLStimulus.5" isRoot="false"

isLeaf="false" isAbstract="false">

id: identificador único en el modelo.

name: nombre que se le quiera dar al objeto.

visibility: tipo de visibilidad del objeto. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

base: es el identificador de la clase a la que pertenece.

message2: lista de los identificadores de los estimulos que recibe separados por

espacios en blanco.

message: lista de los indentificadores de los esimulos que envía separados por

espacios en blanco.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

Ademas debemos especificar una serie de etiquetas (con sus correspondientes etiquetas de

cierre) que expresan la multiplicidad del objeto:

<UML:ClassifierRole.multiplicity>

<UML:Multiplicity xmi.id="X.12">

id: identificador único en el modelo.

<UML:Multiplicity.range>

<UML:MultiplicityRange xmi.id="X.13" lower="1" upper="1" multiplicity="X.12"/>

id: identificador único en el modelo.

lower: mínima cardinalidad.

upper: máxima cardinalidad.

multiplicity: identificador de la etiqueta multiplicity padre.

97

5.3.2.7.6.6 Class

Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia

de una clase). A través de ella podemos modelar el entorno en estudio.

<UML:Class xmi.id="UMLClass.9" name="clase1" visibility="public" isSpecification="false"

namespace="UMLModel.2" isRoot="false" isLeaf="false" isAbstract="false" isActive="false"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar a la clase.

visibility: tipo de visibilidad de la clase. Puede ser:

o public: público.

o private: privado.

o protected: protegido.

o package: paquete.

isSpecification: es un booleano que determina si es una especificación. Por defecto

debe ser “false”.

namespace: es el nombre que se haya puesto al modelo de interacción.

isRoot: booleano que determina si es nodo raíz. Por defecto es “false”.

isLeaf: booleano que determina si es nodo hoja. Por defecto es “false”.

isAbstract: booleano que determina si es abstracto. Por defecto es “false”.

isActive: booleano que determina si está activo. Por defecto es “false”.

98

5.3.2.7.6.7 Stereotype

Al igual que en los anteriores modelos, también podremos crear estereotipos.

<UML:Stereotype xmi.id="X.18" name="interactionModel" extendedElement="UMLModel.2"/>

id: identificador único en el modelo.

name: nombre que se le quiera dar al estereotipo.

extendedElement: es el nombre que se haya puesto al modelo de interación.

99

5.3.2.8 Representación en objetos

Una vez que tenemos definida la representación de los modelos UML en XMI, es muy sencillo

explicar la jerarquía de clases que debemos crear para poder definir todos los datos

anteriormente representados.

Para ello basta con crear una clase por cada elemento citado (modelos y sus elementos hijos)

teniendo en cuenta todos los atributos que también deberán formar parte de las clases como

atributos. En cuanto a la jerarquía, tan solo debemos seguir el esquema gráfico inicial de cada

modelo y tendremos la estructura completa.

Para su representación escrita, una buena metodología sería conseguir en un método una

llamada sucesiva a todos sus elementos, de forma que estos elementos hijos realicen a su vez

dicha llamada a sus elementos hijos y que cada elemento obtenga su representación escrita de

forma organizada.

En cuanto a la instanciación de objetos, deberemos tener un objeto padre que sea el modelo

(diseño), y que a través de él se realicen tanto las instanciaciones nuevas, como las

asociaciones o modificaciones de datos, de este modo, centralizaremos el comportamiento del

modelo a través de su objeto modelo a modo de fachada. Con este modelado interno

aportamos un nivel alto de abstracción en su uso posterior.

La persistencia del modelo construido solo tiene sentido en un formato de texto plano y por

tanto tan solo deberemos permitir la exportación a fichero. El fichero o ficheros finales

conformarán uno de los objetivos primarios del proyecto satisfecho a través de la exportación

a XMI de los diagramas UML ya personalizados.

100

5.3.3 Reflexiones de la segunda aproximación

A través de la exportación a XMI no solo conseguimos una estandarización de los documentos

generados sino que nos aporta la potencia de un estándar para el intercambio de

metamodelos, es decir, no son solo modelos completos de diseño, sino que queda a la elección

del diseñador software como usar sus elementos dentro de un proyecto.

La estandarización conseguida está demostrada en varias herramientas que aceptan XMI como

una de sus opciones de importación. Su destino es la portabilidad de metamodelos por lo que

el hecho de la creación de un nuevo proyecto de diseño que incluya estos metamodelos limita

el proyecto a la herramienta que se use para su creación, en otras palabras, podemos usar los

metamodelos en todas las herramientas que queramos pero teniendo en cuenta que los

proyectos UML de cada herramienta son únicos por cada una de ellas.

101

6 Desarrollo

Una vez que hemos tomado las decisiones hasta llegar a una solución final, hablaremos de la

implementación en sí de la aplicación. Como procedimiento a esta explicación, primero

realizaremos una visión de análisis de la aplicación, donde veremos los requisitos que vamos a

desarrollar. Más adelante, veremos algunos matices en la etapa de diseño. Por último,

mostraremos un prototipo de interfaz de usuario donde se explicará de forma detallada en

qué consiste la aplicación y de qué manera satisface los requisitos analizados. Es decir,

seguiremos los pasos definidos en el proceso unificado.

6.1 Especificación de Requisitos Software

Primero realizaremos un análisis de los requisitos que incluirá el sistema. Los objetivos

principales que esta aplicación debe satisfacer son todos aquellos que están relacionados

directamente con el rol de cliente. Es decir, la aplicación partiendo del sistema experto ya

constituido especificado en el estándar XML definido en el apartado x.x.x, el usuario aportará

sus decisiones en relación a las características de usabilidad a tratar para finalmente obtener

un diseño y responsabilidades específicas para cada patrón.

DUPP (Deployment Usability Patterns Project) tiene los siguientes requisitos:

Req (1): Ambigüedad en el sistema

Deberá ser un sistema completamente abierto de forma que por un lado obtenga la

base de conocimiento de varios ficheros organizados por patrón, y, por otro lado, debe

tener la posibilidad de integrar más patrones de una manera sencilla e independiente

de la compilación.

Req (2): Estandarización de documentos de entrada (guía de elicitación)

La guía de elicitación constará de un fichero por patrón con extensión y formato XML.

Este fichero deberá seguir el esquema explicado en el apartado x.x.x.

Req (3): Estandarización de documentos de entrada (guía de diseño)

La guía de diseño constará de un fichero por patrón con extensión y formato XML. Este

fichero deberá seguir el esquema explicado en el apartado x.x.x.

102

Req (4): Patrones de usabilidad necesarios

Al menos, el sistema experto deberá contener los siguientes patrones de usabilidad:

o Undo/Redo

o System Status Feedback

o System Progress Feedback

o Abort

o Warning

o Multilevel Help

o Commands Aggregation

o Step by Step

o Favorites

o Personal Object Space

o Preferences

Req (5): Modelos de diseño

Por cada patrón, se deberá facilitar al menos un diagrama de cada tipo, siendo los

tipos:

o Diagrama de Casos de Uso

o Diagrama de Secuencia

o Diagrama de Clases

Req (6): Resultados obtenidos

El fichero de salida deberá ser un fichero comprimido que contenga los patrones

personalizados de los cuales se haya contestado alguna pregunta. En cada carpeta de

cada patrón deberán aparecer 3 tipos de archivos:

o PDF: contendrá el resumen de las respuestas aportadas por el usuario.

o XLS: serán las tablas Excel con las responsabilidades a medida de cada patrón.

o XMI: serán los diagramas de casos de uso, clases e interacción específicos del

patrón escritos en este estándar.

Req (7): Idioma

La aplicación estará escrita de forma íntegra en inglés.

Req (8): Autenticación

El sistema no requiere ningún tipo de verificación de identidad ni de seguridad, por lo

que podrá ser usado por cualquier usuario. El usuario para el que está destinado esta

aplicación es un usuario especializado en ingeniería del software.

103

Req (9): Inclusión de nuevos patrones

El fichero que contiene los nombres de los patrones deberá incluir una descripción a

modo de ayuda que deberá ser mostrada cuando el ratón se posicione encima de cada

patrón. Este fichero seguirá el esquema siguiente:

<patterns>

<pattern>

<name>Nombre de patron</name>

<helpText>Texto de ayuda<helpText/>

</pattern>

*…+

<pattern>

<name>…</name>

<helpText>…<helpText/>

</pattern>

</patterns>

Cualquier etilo que se le quiera aplicar, deberá estar escrito en HTML no directo, es

decir, utilizar una representación HTML para mostrar en una página HTML. Por

ejemplo, la representación HTML del símbolo “<” es “&gt;”

Req (10): Usabilidad-Multilevel Help

El formulario que represente la guía de elicitación deberá presentar un esquema visual

que facilite la comprensión de las posibles bifurcaciones del patrón.

Req (11): Usabilidad-Status feedback

El formulario que represente la guía de elicitación deberá presentar un esquema visual

que facilite la comprensión de las posibles bifurcaciones del patrón.

Req (12): Usabilidad-Undo

La aplicación deberá admitir la posibilidad de poder volver a responder una pregunta

ya pasada a modo de “deshacer” o atrás.

Req (13): Entorno distribuido

Se realizará una aplicación web de modo que se centralice el conocimiento en una

única instancia.

104

6.2 Diseño

Al seguir el proceso unificado, se ha seguido un proceso iterativo e incremental por lo que se

ha dividido el diseño e implementación en 2 ciclos claramente diferenciados.

En el primero ciclo, se ha afrontado todo lo referente a funcionalidad y por tanto todo lo

relativo con el modelo o lógica de negocio y con la vista (Requisitos 1, 2, 3, 4, 5, 7, 8, 10, 11, 12

y 13).

El segundo ciclo está destinado a añadirle ciertas funcionalidades fuera de una planificación

inicial. Estas funcionalidades son:

1. La aplicación de ambigüedad a la hora de introducir cambios o nuevos patrones al

sistema (Req (9): Inclusión de nuevos patrones).

2. Establecer una estandarización abierta para el formato de entrega de los documentos

generados (Req (6): Resultados obtenidos, XMI).

1. Añadir mejoras visuales (look & feel).

Primero realizaremos un estudio de los casos de uso que se obtienen de a partir de los

requisitos del sistema.

6.2.1 Casos de uso

Aunque se disponga de varios requisitos, esta aplicación deberá contemplar dos casos de uso.

Ilustración 1: diagrama de casos de uso

El primer caso de uso es suficientemente importante como para albergar él solo una aplicación

puesto que conforma el grueso de la aplicación. Este caso de uso englobaría todos los

requisitos anteriormente especificados.

El segundo caso de uso aporta una funcionalidad que va implícita en una aplicación web, es

decir, realizar una exportación del trabajo realizado.

Explicaremos estos casos de uso en formato completo:

105

Caso de uso CU01: Personalizar patrón

Actores Cliente

Propósito

El cliente tiene la intención de obtener un diseño y unas responsabilidades específicas a través de la respuesta a las preguntas que vaya formulando el sistema.

Resumen

El sistema irá formulando preguntas y a partir de las respuestas del actor, deberá realizar internamente una personalización del patrón.

Tipo Primario y esencial

Referencias cruzadas

Curso Normal de los eventos

1.El cliente una vez ha accedido al sistema elige un patrón que quiera realizar la especificación.

3.El cliente contestará con texto en caso de ser una pregunta que necesite una respuesta textual o bien elegirá una de las opciones en caso de que sea una pregunta bifurcativa. (los pasos 2 y 3 se repetirán hasta que no existan más preguntas)

2.El sistema mostrará una pregunta. 4.El sistema regresará a la pantalla principal

Curso Alternativo

3a.El cliente quiere volver a la pregunta anterior.

3a.El sistema mostrará la pregunta anterior eliminando las respuestas de las preguntas actual y anterior.

106

Caso de uso CU02: Descargar los documentos específicos

Actores Cliente

Propósito

El cliente tiene la intención de descargar los patrones personalizados a los que ha contestado alguna pregunta.

Resumen

El sistema mostrará una ventana de descarga donde se proporciona un archivo con los documentos comprimidos en él.

Tipo Primario y esencial

Referencias cruzadas

Curso Normal de los eventos

1.El cliente decide descargar los patrones personalizados.

3.El cliente guardará el archivo

2.El sistema mostrará una ventana de descarga con el archivo comprimido.

Curso Alternativo

1a.El cliente cierra el explorador de internet

1a.El sistema al no tener una sesión activa ni identificativa desecha las respuestas del cliente.

107

6.2.2 Clases

Una vez vistos los casos de uso, mostraremos las partes más relevantes de los diagramas de

clases. Puesto que es una aplicación que contiene partes muy diferenciadas, dividiremos el

diagrama de clases final en varios diagramas dependiendo de su funcionalidad y además

eliminaremos los métodos get/set de estos diagramas para facilitar su lectura y comprensión.

Para la división de la aplicación en varios diagramas de clases, iremos recorriendo el flujo

básico del caso de uso “CU01: Personalizar patrón”.

El cliente al seleccionar un patrón lanzará una petición en el servidor que hará que se cargue la

guía de elicitación a través de un parser que se encargue de leer el fichero XML externo. Como

se ha explicado anteriormente, el fichero XML deberá seguir un esquema específicamente

creado para la elicitación, por lo que para realizar su lectura y procesado a nivel de objetos,

deberemos crear un parser a medida, aunque internamente este parser utilice algunas clases

ya definidas en el lenguaje de programación elegido.

A través de una clase llamada “FormController”, podemos leer el fichero e ir creando la guía de

elicitación en objetos. Será la encargada de controlar el acceso al fichero y por tanto de la

creación de todos los objetos relacionados con la lectura.

Una vez que tenemos ya introducidos la base de conocimiento en la aplicación, el usuario irá

respondiendo a las preguntas que el sistema va planteando. Estas respuestas tienen impacto

en los documentos que son generados a su vez, por lo que deberemos realizar acciones

internas transparentes al usuario.

La guía elicitación se conforma por una serie de preguntas donde cada una de ellas llevará

asociada una serie de acciones dependiendo de la respuesta del usuario. Estas acciones podrán

ser o acciones de diseño o acciones de escritura en fichero de respuestas o podrán ser

acciones sobre una tabla Excel.

El diagrama de clases que se especifica a continuación, explica a nivel de diagrama de clases de

qué manera se realiza esa lectura.

108

Diagrama de clases 1: parser XML

109

Además de importar la guía de elicitación del patrón en cuestión, se realiza una carga inicial de

la guía de diseño, es decir, los elementos invariantes de los modelos a construir a modo de

simplificar la elicitación. Esta importación también se realiza a través de un fichero XML pero

puesto que sigue un esquema diferente, el parser deberá ser diferente.

De forma análoga a la importación anterior, se muestra un diagrama de clases específico.

Diagrama de clases 2: guía de diseño

La diferencia con la elicitación es principalmente como transformamos la información del

fichero XML, es decir, pasar esta información a objetos.

A partir de aquí nos centramos precisamente en el data binding, es decir, realizar el mapeo de

XML a objetos. Al tener que representar en objetos 3 tipos de diagramas de diseño y a modo

de facilitar la comprensión de los modelos, se presentan los 3 tipos de diagramas en 3

diagramas de clases diferentes.

110

Diagrama de clases 3: casos de uso

111

Diagrama de clases 4: clases

112

Diagrama de clases 5: secuencia

113

6.3 Implementación

En la implementación el primer paso a dar es seleccionar el lenguaje de programación que se

va a utilizar en el desarrollo. En este caso, la elección ha sido Java.

A partir de esta decisión y siguiendo los requisitos, debemos realizar una aplicación en entorno

distribuido por lo que no solo utilizaremos el lenguaje Java, sino J2EE, es decir, todos los

lenguajes y metodologías relacionadas con una aplicación web para Java (JSP, Servlets,

Javascript, HTML etc.).

Como ayuda adicional se ha introducido un framework llamado “struts”. Este framework

facilita a través de unos ficheros en formato XML la configuración del entorno web. Por otro

lado y de forma automática, realiza la separación entre las capas de modelo, vista y

controlador, es decir, que implícitamente se usa el patrón software modelo-vista-controlador.

Además de este patrón mencionado, y gracias a la diversidad de estilos de HTML se han de

introducir algunos patrones de usabilidad estudiados a lo largo de la tesis. Esta usabilidad

comprende principalmente tres de estos patrones:

3. Necesitamos incluir una descripción a modo de resumen de cada patrón para que un

usuario no experto en el uso de la aplicación pueda entender perfectamente de que se

trata el patrón (Status feedback).

4. En caso de responder a una pregunta de forma errónea, el sistema deberá aportar una

forma de deshacer esta respuesta (Undo).

5. En todo momento dentro de un formulario debemos conocer que preguntas se nos

han hecho, cuales nos quedan por contestar y en qué situación nos encontramos

(status feedback).

Teniendo en cuenta estas premisas, procederemos a mostrar una versión terminada de esta

aplicación.

114

La pantalla de inicio muestra todos los patrones introducidos a través del fichero

“patterns.xml”.

Ilustración 2: pantalla inicial

Si somos un usuario que no conoce en profundidad los patrones mostrados, y quisiéramos

saber de qué se trata (resumen), bastará con poner el ratón (sin hacer click en él) sobre uno de

los botones que ilustran los patrones.

Ilustración 3: Multilevel Help

Una vez que hayamos seleccionado un patrón, se nos mostrará un formulario de este tipo:

115

Ilustración 4: formulario

En él, tendremos dos tipos diferentes de preguntas. Una es una pregunta donde se mostrará

un área de texto donde podremos escribir la respuesta en un formato de párrafo. El otro tipo

de pregunta se trata de la elección frente a una pregunta que debemos contestar si o no.

Ilustración 5: bifurcación

Como algo excepcional, algunos patrones incorporan algunas preguntas que se salen del

estándar de preguntas. Este es el caso de usar una lista anterior para separarla en dos listas

diferentes.

116

Ilustración 6: dos listas

Además de todo lo mostrado, en cualquier momento podemos movernos hacia delante o hacia

atrás para contestar de nuevo a la pregunta que queramos utilizando los botones “Anterior” y

“Siguiente”.

Ilustración 7: anterior y siguiente

Una vez finalizado el uso de esta herramienta, podremos descargarnos en un fichero

comprimido todos los patrones que hayamos respondido alguna pregunta separados en

carpetas nombradas por el nombre del patrón en cada caso.

117

Ilustración 8: descarga1

Ilustración 9: descarga2

118

6.4 Instalación

La instalación de esta aplicación requiere instalar otras aplicaciones para que ésta funcione.

Explicaremos los pasos y programas necesarios para que la aplicación funcione correctamente.

1. Instalación de servidor Apache Tomcat.

Para instalar el servidor Apache Tomcat, primero deberemos descargarlo de forma

totalmente gratuita de la página web oficial de Apache http://tomcat.apache.org/ para

el sistema operativo que queramos instalar. Después deberemos seguir los pasos para

su instalación a través de las guías de la página web.

2. Instalación de los documentos/ficheros que componen la base de conocimientos.

Los ficheros que componen la base de conocimientos deberán ir separados en 3

grupos.

Por un lado irán todos los ficheros que compongan la guía de elicitacion. Estos

documentos irán alojados en el directorio de instalación del servidor Tomcat

concretamente en la ruta: path_de_instalacion_Tomcat/webapps/elicitation.

De forma análoga, los documentos que conforman la guía de diseño deberán ir

instalados en la ruta: path_de_instalacion_Tomcat/webapps/design.

Las tablas de responsabilidades deberán tener también su localización específica.

Deberán estar en la ruta: path_de_instalacion_Tomcat/webapps/tables.

Los patrones de diseño que se vayan a introducir siguiendo el esquema definido en el

requisito “Req (9): Inclusión de nuevos patrones” deberán alojarse bajo la ruta:

path_de_instalacion_Tomcat/webapps/patterns.

3. Arranque del servidor.

Una vez instalada la base de conocimiento, deberemos arrancar el Tomcat. Para ello

deberemos tener configurado el Tomcat para arrancar en un puerto específico. Por

defecto, Apache Tomcat está configurado para arrancar en el puerto 8080. Por ello, si

deseamos que arranque en ese puerto tan solo deberemos ejecutar el archivo

“startup” (.bat si estamos en un sistema operativo Windows o .sh si estamos en un

Unix).

4. Uso de la aplicación.

Para acceder a la aplicación, abriremos un explorador de internet (la aplicación

funciona para los exploradores más comunes como son internet explorer, firefox,

safari, opera…) y en la barra de direcciones tendremos que introducir la dirección IP o

bien el nombre simbólico si tenemos configurado DNS y a continuación dos puntos y el

puerto donde se encuentre corriendo el Tomcat.

119

7 Resultados

El resultado que debemos destacar por encima de todo es una especialización en cuanto a

generación y obtención de documentos que sigan estándares fijados por organizaciones tan

importantes como la W3C.

Hoy en día, desde los datos que viajan en internet para ser mostrados en una página web,

hasta la codificación interna que manejan los programas orientados a su uso en oficina (office),

internamente tienen una codificación estándar, y ésta suele ser algún lenguaje derivado de

XML. Es por esto que conocer y comprender como generarlos podemos considerar un

resultado muy positivo.

A través de lo demostrado en la investigación podemos ver que la personalización de un

patrón a partir de unos documentos en papel puede resultar algo muy sencillo si miramos a

través de una aplicación de este estilo.

Aunque inicialmente el propósito era construir una aplicación a medida, el hecho de aportar

ambigüedad al sistema dejando abierta la base de conocimiento nos conduce a una aplicación

real de un ámbito no imaginable desde una visión poco madura.

El resultado obtenido además es portable a grandes herramientas que hoy en día resultan

imprescindibles en el mundo del diseño software. Esta portabilidad del resultado hace augurar

investigaciones futuras siguiendo por la línea de la exportación XMI.

120

8 Conclusiones y trabajos futuros

Como conclusión debemos mencionar que las investigaciones y los desarrollos se han basado

en un entorno muy concreto y pese a que se ha buscado aportarle la mayor ambigüedad

posible, probablemente se puedan mejorar ciertos aspectos, pero como hemos mencionado,

ligados al ámbito del entorno en el que se ha construido.

A grandes rasgos y partiendo de que la implementación de las aplicaciones demostradas se

han basado en un patrón modelo-vista-controlador, podríamos cambiar la vista por cualquier

otra, incluso llegando al extremo de la creación de una aplicación para teléfonos móviles.

Puesto que la construcción de una librería a partir de un modelo ya implementado es

extremadamente sencilla, los consiguientes trabajos futuros estarán ligados estrechamente

con su uso de esta herramienta en otras aplicaciones.

Una línea futura de este proyecto podría consistir en realizar una implementación interna en

una de las herramientas CASE, es decir, a partir del modelo construido, usarlo a modo de

librería para crear un plugin dentro de la herramienta. Este trabajo incorporaría en una

herramienta la posibilidad de partir de un diseño donde tendríamos precargados una serie de

elementos editables dependiendo de un patrón o patrones que deseemos incluir en nuestro

proyecto.

Otras líneas futuras podrían estar dirigidas a realizar una versión mejorada en cuanto al

desarrollo. Puesto que la investigación ha sido donde más esfuerzo se ha invertido, podríamos

conseguir un producto final con mejor resultado visual, o bien, con un entorno más intuitivo.

En el caso de quisiéramos dirigir el resultado final a otros ámbitos como pueden ser los

servicios distribuidos, dado que el desarrollo se ha realizado bajo un lenguaje de alto nivel que

se adapta a los cambios más actuales, tampoco resultaría ningún coste excesivo en cuanto a

esfuerzo se refiere.

Al igual que existen algunas librerías que realizan un dibujo de forma intuitiva sobre ciertos

diagramas, se podría desarrollar una herramienta que a través de los documentos en formato

XMI, pudieran realizar un esquema inicial de lo que se representa en XMI, es decir, una pre

visualización del código en formato de imagen.

Quizá en un futuro podría realizarse otro tipo de aplicación relacionada con los patrones de

usabilidad, pero esta vez partiendo de los diagrama en XMI, para que se pudiera generar un

único diagrama por cada tipo que incluyera todos los patrones que se desean incluir, de forma

que con cambiar el nombre a las clases, obtuviéramos el diseño personalizado y completo.

121

9 Bibliografía

UML For W3C XML Schema Design:

http://www.xml.com/pub/a/2002/08/07/wxs_uml.html

HiperModel 3.0:

http://xmlmodeling.com

Mapping UML Diagrams To XML:

http://uml2xml.tripod.com/sitebuildercontent/sitebuilderfiles/utx_doc.pdf

Design XML schemas using UML:

http://www.ibm.com/developerworks/library/x-umlschem/

Check out the site on XML modeling which discusses many applications of UML-to-XML

modeling.

Delve into Dave Carlson's excellent book Modeling XML Applications with UML:

Practical e-Business Applications.

Read Dave Carlson's three-part series of articles on "Modeling XML Vocabularies with

UML."

Explore Will Provost's article on XML.com, "UML for W3C Schema Design."

Download and review the XMI specification by the Object Management Group (OMG).

Learn how one organization uses UML and XMI to create software in "XMI and UML

combine to drive product development" by Cameron Laird (developerWorks, October

2001).

Check out Granville Miller's developerWorks column, "Java modeling,"as it covers a

range of issues related to UML beginning with an introduction to sequence

diagramming (May 2001).

Read about using an object-oriented framework to design XML schemas that are

extensible, flexible, and modular in the author's "Create flexible and extensible XML

schemas" (developerworks, October 2002).

Find more XML resources on the developerWorks XML zone.

IBM trial software for product evaluation: Build your next project with trial software

available for download directly from developerWorks, including application

development tools and middleware products from DB2®, Lotus®, Rational®, Tivoli®,

and WebSphere®.

Find out how you can become an IBM Certified Developer in XML and related

technologies.

Libro de O’reilly “XML Schema”

Una extensión de UML para representar XML Schemas:

http://www.dlsi.ua.es/webe02/articulos/3.pdf

122

Using XML and SVG to Generate Dynamic UML Diagrams

http://www.cwu.edu/~gellenbe/docs/xmltouml/xmltechnicalreport.html

XMI

http://es.wikipedia.org/wiki/XML_Metadata_Interchange

XMI of OMG

http://www.omg.org/spec/XMI/2.1.1/

StarUML

http://staruml.sourceforge.net/en/

StarUML repository

svn co https://staruml.svn.sourceforge.net/svnroot/staruml staruml

cvs -d:pserver:[email protected]:/cvsroot/staruml

123

Anexo 1. Patrones de usabilidad-Undo

USABILITY-ENABLING GUIDELINE

Identification

Name Undo Family Undo/Cancel

Aliases Multi-Level Undo [Tidwell, 2002]; Undo [Welie, 2003]; Global Undo / Object-Specific Undo [Laasko, 2003]; Allow Undo [Brighton, 1998]

Intent

Undo provides a way for the user to revert the effects of a previously executed action or series of actions within an application.

Problem

Users may need to undo certain actions they perform for a variety of reasons: They could have been exploring new functionality, have made a mistake or simply have changed their minds about what they have just done.

Context

Undo should be considered when developing highly interactive applications where users may perform sequences of steps, or execute actions that have tangible consequences.

124

TABLE 1. USABILITY ELICITATION GUIDELINE

HCI Recommendation Elaboration Discussions with Stakeholders

Usage Examples (optional)

Undo

Users typically explore functionality of an application but do not want to be “punished” when selecting unwanted functions [Welie, 03]. The ability to undo a long sequence of operations lets users feel that the interface is safe to explore. While they learn the interface, they can experiment with it, confident that they aren’t making irrevocable changes – even if they accidentally do something bad.

So, first decide which operations need to be undoable [Tidwell, 02]: Any action that might change a file (i.e. anything that could be permanent) should be undoable, while transient or view-related states often are not.

In any case, make sure the undoable operations make sense to the user. They can be specific functions or a meaningful group of actions (for example, changing the printer settings) [Welie, 03]. Be sure to define and name them in terms of how the user thinks about the operations, not how the computer thinks about them.

U_ELAB-1: Choosing undoable actions

All actions with important consequences should provide the undo feature, save for those for which there are greater impeding factors present.

For actions which are expensive to revert, The cost/benefit ratio of providing it with an undo feature should be evaluated.

The term ‘important consequences’ must be clearly defined before deciding which actions will be undoable.

U_Q-1 Which user actions are considered to have important consequences?

U_Q-2 Of these actions, which will support undo?

U_Q-3 How will the user be provided access to the undo functionality?

U_EX-1: Costly vs. undoable actions

Deleting a file from a system will most likely have important consequences and should be undoable

Sending an email has important consequences (the email reaches the other party), but it is not directly undoable. Only such a limitation should keep a system from providing the undo feature.

Deleting files from a hard drive, though undoable, tends to be an expensive operation to revert.

Warnings

If a command has side effects that cannot be undone, warn the user before executing the command and do not queue it [Welie, 03]

U_ELAB-2: Warnings: Authorization

Most likely a warning of the type Autorization will be required. See warning pattern for the warning process.

U_Q-4 Of the damaging actions that cannot be undone, which will require a warning to be displayed to the user?

U_EX-2: File deletion w/warning

If deleting a file from a hard drive is an undoable operation, the user will need to be warned (OK - Cancel style authorization) before the deletion is carried out.

Redo

Users tend to explore a navigable artefact in a tree-like fashion, going down paths that look interesting, then back up out of them, then down another path [Tidwell, 99]. So, an undo stack will need to be created. Each operation goes on the top of the stack as it is performed; each Undo reverses the operation at the top, then the next,... The undo concept must also include the concept of redo needed in case the user backs up too many steps [Laasko, 03]. Redo works its way back up the stack in a similar manner. The best undo should preserve the tree structure of the command execution sequence.

U_ELAB-3: Redo: Availability

Redo should only revert the effects of the latest applied Undo.

Some existing software currently use the Redo feature as a way to repeat the execution of any command.

In the way in which we refer to it here, we strictly mean Redo as a way to revert a previously executed Undo.

In this context, when no Undo command has been executed, Redo should not be available

U_Q-5 Will a redo functionality be provided?

U_Q-6 How will the user be provided access to the redo functionality?

U_EX-3: Redoing in MS Word

When undoing the changing of the font of a paragraph in MS Word, executing Redo will revert the text to its original font (before executing undo)

125

TABLE 1. USABILITY ELICITATION GUIDELINE

HCI Recommendation Elaboration Discussions with Stakeholders

Usage Examples (optional)

History

Often users want to reverse several actions instead of just the last action [Welie, 03]. So, the stack should be at least 10 to 12 items long to be useful, and longer if you can manage it. Long-term observation or usability testing may tell you what your usable limit is (Constantine and Lockwood assert that more than a dozen items is usually unnecessary, since “users are seldom able to make effective use of more levels”. Expert users of high-powered software might tell you differently. As always, know your users.

Most desktop applications put Undo/Redo items on the Edit menu. Show the history of commands so that users know what they have done [Wellie, 03]. Undo is usually hooked up to Ctrl-Z or its equivalent

U_ELAB-4: History: Stack size and type

Ideally undo/redo should use a tree structure instead of a stack structure to keep record of the actions, however the tree structure requires an important coding effort, so have this in mind when determining which kind of structure will be needed to keep record of the actions to be undone/redone. Notice that the system may have a global stack with a concrete size, or depending on the system, the size of the stack may be different for different functionalities.

U_Q-7 How many levels of undo and/or redo will be provided?

U_Q-8 Will the user have access to the undo stack (history)?

U_Q-9 If so, how will the user be presented with the undo stack?

U_EX-4: MS Word’s undo Stack

MS Word and others provide users with a visual list (stack) of the latest opperations executed within the application. Within this stack, users can not only view the operations in the order in which they would be undone, but they can select an operation deep within the stack and undo it, along with every operation that was executed after it.

Smart Menus

The most well-behaved applications use Smart Menu Items to tell the user exactly which operation is next up on the undo stack.

U_ELAB-5: Smart Menus and History

Smart menus are tightly related to the command history (stack). If one is kept, it’s relatively simple to offer smart menus different functionalities.

U_Q-10 Will the user have information about the expected outcome of performing undo at any given time (smart menu)?

U_Q-11 If so, how will this information be provided to the user?

U_EX-5: Smart Menus in drawing program

When the last performed operation in a drawing program was “paint red”, the undo menu, or equivalent, should display “undo paint red” as opposed to the more generic “undo”

Object Specific Undo

The software system must provide the possibility for the user to easily access (for example, through the right button) the specific commands that affect such an object. One should be the undo/redo function. In this case, the system should filter the global undo stack and show only the operations that affected the state of the selected object [Laasko, 03].

U_ELAB-6: Object Specific Undo & Global Undo

Redo will only be available at object level if it is available globally. Same with undo.

U_Q-12 Which system elements will require object-specific undo/redo?

U_Q-13 How will this feature be accessed by the user?

U_EX-6: UML Design Program

In a UML design program, selecting the graphic representation of a cCass within a diagram whould should provide the option to undo the operations performed on (and only on) this particular Class.

Table 1: Undo. Usability Elicitation Guideline

126

Figure 1: Undo. Use Case Model

127

Figure 2: Undo. System Responsibility Clusters

128

TABLE 2. USABILITY-ENABLING DESIGN GUIDELINE: GENERIC COMPONENT RESPONSIBILITIES

System Responsibility Generic Component Responsibilities

U_SR-1 Support

Undo

functionality

(storing,

undoing)

The component responsible for handling user events (UI) must listen for calls to actions and order their execution Execution of actions is always the responsibility of the pertinent Domain Component in the application The component in charge of delegating actions (if any) should determine whether the action is undoable or not, from a pre-established list. If the action to execute is undoable, it must first be encapsulated as an instance of a Command Component, together with any pertinent state information and the necessary actions needed to revert its effects. Such an instance is then stored in a History Component, responsible for keeping a single (ordered) collection of all executed undoable actions. After encapsulation, the Domain Component is then free to execute the invoked action

The UI Component must listen for calls to the Undo action (if available) and order its execution The History Component must then retrieve the last* Command, without discarding it, and order it to ‘undo’ itself. The Command, in turn, executes the necessary actions, using the stored state information, to return the system to the state preceding its execution

U_SR-2 Provide user

access to

Undo

The UI Component is responsible for providing the mean(s) through which a user can invoke the undo feature. The Undo action should only be available when at least one undoable action has been executed during application up-time

U_SR-3 Support

Redo

functionality

The UI Component must listen for calls to the Redo action (if available) and order its execution The History Component must then retrieve the current** Command, without discarding it, and order it to ‘redo itself. The Command, in turn, executes the necessary actions, using the stored state information, to return the system to the state that follows its execution

U_SR-4 Provide user

access to

Redo

The UI Component is responsible for providing the mean(s) through which a user can invoke the redo feature. The Redo action should only be available when the Undo action has been executed at least once before during application up-time.

U_SR-5 Support

Multi-Level

Undo and

History

When only one-level undo is supported, the History component holds only the last-executed action. However, when multi-level undo is supported, History supports an ordered collection of said actions in the form of Commands, as described in “U_SR-1” The History Component is also responsible for updating (or ordering the update of) the UI every time a new Command is added to the collection or whenever the next undoable/re-doable action changes, as described in “U_SR-6”

U_SR-6 Provide

expected

results of

Undo/Redo

Whenever the Undo and/or Redo actions are available, the UI Component is responsible for showing the actions’ expected results (smart menus) The UI gets this information from the History Component, which must notify it of the current undoable/re-doable action upon every change.

U_SR-7 Allow

Object-

Specific

Undo/Redo

The UI Component must listen for calls to the Undo/Redo action over a particular object (if available) and order its execution. The History Component must then retrieve the last*/current** Command executed over that object, without discarding it, and order it to Undo/Redo itself. The Command, in turn, executes the necessary actions, using the stored state information, to return the object to the state preceding/following its execution.

129

TABLE 3. USABILITY-ENABLING DESIGN GUIDELINE: CONCRETE OBJECT RESPONSIBILITIES (MVC)

System Responsibility

Objects Fig

View Controller ConcreteCommand HistoryList DomainClass

U_SR-1 Provi

de

Undo

funct

ionali

ty

(stori

ng/un

doing

)

1. The View must listen for invocation of actions. Upon reception, it must notify the Controller of said action

2. The Controller must determine if the invoked action is undoable. In such case it must call the execute() method of the corresponding ConcreteCommand object (otherwise invocation goes directly to the DomainClass).

3. The Controller must then clone() said ConcreteCommand and add() it to the HistoryList.

4a. Upon call to its execute() method, the ConcreteCommand first stores the necessary state information in its local variables. It then calls the appropriate method in the corresponding DomainClass (what was originally invoked)

4b. The HistoryList saves the cloned ConcreteCommand atop its collection (so it can later be available to undo)

5a. The DomainClass executes the appropriate method to carry out what was originally invoked by the user through the View.

3, 4

1. The View must listen for invocation of the Undo action. Upon reception, it must notify the Controller.

2. The Controller orders the HistoryList to undo the last action.

4. Upon call to its undo() method, the ConcreteCommand calls the necessary methods in DomainClass (with any needed state information, stored upon execution) to revert its effects.

3. The HistoryList determines the ConcreteCommand to undo and calls its undo() method.

5. The DomainClass executes the methods invoked by ConcreteCommand.

3, 5

U_SR-2 Provi

de

user

acces

s to

Undo

1. The View must present the user with the mean(s) to call the Undo action (i.e. within the Edit menu, through Ctrl-Z, etc.)

3, 5

U_SR-3 Supp

ort

Redo

funct

ionali

ty

1. The View must listen for invocation of the Redo action. Upon reception, it must notify the Controller.

2. The Controller orders the HistoryList to redo the current action.

4. Upon call to its redo() method, the ConcreteCommand calls the necessary methods in DomainClass (with any needed state information, stored upon execution) to reinstate its effects.

3. The HistoryList determines the ConcreteCommand to redo and calls its redo() method.

5. The DomainClass executes the methods invoked by ConcreteCommand.

3, 6

U_SR-4 Provi

de

user

acces

s to

Redo

1. The View must present the user with the mean(s) to call the Undo action (i.e. dit menu, Ctrl-Z, etc.)

3, 6

130

TABLE 3. USABILITY-ENABLING DESIGN GUIDELINE: CONCRETE OBJECT RESPONSIBILITIES (MVC)

System Responsibility

Objects Fig

View Controller ConcreteCommand HistoryList DomainClass

U_SR-5 Supp

ort

Multi

-

Level

Undo

and

Histo

ry

3. When the View is notified of changes in the HistoryList it updates its History Displays accordingly.

1. The HistoryList stores (clones of) ConcreteCommands in a FILO-ordered collection. It keeps a ‘pointer’ of the last action that was invoked, and moves it back every time an Undo is invoked until no more ConcreteCommands exist. Invoking Redo moves the ‘pointer’ forward in a similar fashion. ConcreteCommands are never removed from the HistoryList, except when its maximum allowed size is reached (in which case the older elements will be removed in order).

2. Every time a ConcreteCommand is added to the HistoryList or the ‘pointer’ changes position (i.e. the next undoable/re-doable action is updated), the HistoryList notifies the View

3, 4, 5, 6

U_SR-6 Provi

de

expec

ted

result

s of

Undo

/Red

o

2. When the View is notified of changes in the HistoryList it updates its next undoable/redoable

1. Every time a ConcreteCommand is added to the HistoryList or the ‘pointer’ changes position (i.e. the next undoable/redoable action is updated), the HistoryList notifies the View

3, 5, 6

U_SR-7 Allo

w

Obje

ct-

Speci

fic

Undo

/Red

o

1. The View must listen for invocation of the Undo/Redo action over a specific object. Upon reception, it must notify the Controller.

2. The Controller orders the HistoryList to undo/redo the last action invoked over said object.

4. Upon call to its undo()/redo() method, the ConcreteCommand calls the necessary methods in DomainClass (with any needed state information) to revert/reinstate its effects.

3. The HistoryList determines the ConcreteCommand to undo/redo by scanning the collection for the latest/current one invoked over the object and calls its undo() method.

5. The DomainClass executes the methods invoked by ConcreteCommand.

3, 5, 6

131

Figure 3: Undo. Usability-enabling design pattern. Class diagram

132

Figure 4: Undo. Usability-enabling design pattern. Sequence Diagram “Execute Action” (U_SR-1)

133

Figure 5: Undo. Usability-enabling design pattern. Sequence Diagram “Undo Action” (U_SR-1, U_SR-2, U_SR-4, U_SR-6 and U_SR-7)

134

Figure 6: Undo. Usability-enabling design pattern. Sequence Diagram “Redo Action” (U_SR-3, U_SR-4, U_SR-5, U_SR-6 and U_SR-7)