Compartir a través de


Introducción a los modelos, las clases y las relaciones

Un lenguaje específico del dominio (DSL) se define mediante su archivo de definición DSL, junto con cualquier código de programa personalizado que pueda escribir. La mayoría del código de programa de la solución DSL se genera a partir de este archivo.

En este tema se explican las características centrales de la definición de DSL.

La definición de DSL

Al abrir Dsl\DslDefinition.dsl, la ventana de Visual Studio es similar a la de la siguiente imagen.

dsl designer

La información más importante de la definición de DSL se muestra en el diagrama de definición de DSL. Otra información, que también forma parte de DslDefinition.dsl, se muestra en el Explorador de DSL, que normalmente aparece en un lateral del diagrama. Para las tareas más frecuentes se usa el diagrama, mientas que el Explorador de DSL se usa para personalizaciones más avanzadas.

En el diagrama de definición de DSL se muestran las clases de dominio que definen los elementos del modelo, así como las relaciones que definen los vínculos entre los elementos del modelo. También se muestran las formas y conectores que se usan para mostrar los elementos del modelo al usuario.

dsl designer with swimlane

Cuando se selecciona un elemento en la definición de DSL, bien en el diagrama o bien en el Explorador de DSL, en el ventana Propiedades se muestra información de dicho elemento. Puede aparecer más información en la ventana Detalles de DSL.

Los modelos son instancias de DSL

Un modelo es una instancia del DSL creada por un usuario. Un modelo contiene elementos de modelo, que son instancias de las clases de dominio que se definen, y vínculos entre los elementos, que son instancias de las relaciones de dominio que se definen. Un modelo también puede tener formas y conectores, que muestran los elementos y vínculos del modelo en un diagrama. La definición de DSL incluye las clases de las formas, las clases de los conector y una clase para el diagrama.

Las definiciones de DSL también se conocen como modelos de dominio. Un modelo de dominio o definición de DSL es la representación en tiempo de diseño del lenguaje específico del dominio, mientras que el modelo es la creación de instancias en tiempo de ejecución del lenguaje específico del dominio.

Las clases de dominio definen elementos del modelo

Las clases de dominio se usan para crear los distintos elementos del dominio y las relaciones de dominio son los vínculos entre dichos elementos. Son la representación en tiempo de diseño de los elementos y vínculos a los que instanciarán los usuarios del lenguaje específico del diseño cuando creen sus modelos.

En esta ilustración se muestra un modelo creado por el usuario de un DSL de biblioteca de música. Los álbumes de música se representan mediante cuadros que contienen listas de canciones. Los artistas se representan mediante cuadros de esquinas redondeadas y están conectados a los álbumes a los que han contribuido.

Instance model of generated DSL

La definición de DSL separa dos aspectos. La apariencia de los elementos del modelo en el diagrama del modelo se define mediante clases de formas y clases de conectores. La información que contiene el modelo se define mediante clases de dominio y relaciones de dominio.

En la ilustración siguiente se muestran las clases y relaciones de dominio en la definición de DSL de la biblioteca de música.

Embedding and Reference relationships

En la ilustración se muestran cuatro clases de dominio: Music, Album, Artist y Song. Las clases de dominio definen propiedades de dominio como Name, Title, etc. En el modelo de la instancia, los valores de algunas de estas propiedades se muestran en el diagrama.

Entre las clases hay relaciones de dominio: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs y ArtistAppearedOnAlbums. Las relaciones tienen multiplicidades, como 1..1, 0..*. Por ejemplo, cada canción debe estar relacionada exactamente con un álbum a través de la relación AlbumHasSongs. Cada álbum puede tener cualquier número de canciones.

Reorganización del diagrama de definición de DSL

Observe que una clase de dominio puede aparecer varias veces en el diagrama de definición de DSL, como hace Album en esta imagen. Siempre hay una vista principal y puede haber algunas vistas de referencia.

Para reorganizar el diagrama de definición de DSL, puede hacer lo siguiente:

  • Cambie las vistas principal y de referencia mediante los comandos Bring Tree Here y Split Tree. Haga clic con el botón derecho en una clase de dominio individual para ver estos comandos.

  • Vuelva a ordenar las clases de dominio y las clases de formas presionando Ctrl+Arriba y Ctrl+Abajo.

  • Utilice el icono situado en la esquina superior derecha de cada forma para contraer o expandir las clases.

  • Contraiga las partes del árbol haciendo clic en el signo menos (-) en la parte inferior de una clase de dominio.

Herencia

Las clases de dominio se pueden definir mediante la herencia. Para crear una derivación de herencia, haga clic en la herramienta Herencia, luego en la clase derivada y, después, en la clase base. Un elemento de modelo tiene todas las propiedades definidas en su propia clase de dominio, junto con todas las propiedades heredadas de la clase base. También hereda sus roles en las relaciones.

Herencia también se puede usar entre relaciones, formas y conectores. La herencia debe mantenerse dentro del mismo grupo. No se pueden heredar las forma de las clases de dominio.

Relaciones de dominio

Los elementos del modelo se pueden vincular mediante relaciones. Los vínculos son siempre binarios; vinculan exactamente dos elementos. Sin embargo, cualquier elemento puede tener muchos vínculos a otros objetos, e incluso puede haber más de un vínculo entre el mismo par de elementos.

De la misma forma que puede definir diferentes clases de elementos, puede definir diferentes clases de vínculos. La clase de un vínculo se denomina relación de dominio. Una relación de dominio especifica a qué clases de elemento pueden conectarse sus instancias. Cada extremo de una relación se denomina un rol y la relación de dominio define nombres para los dos roles, así como para la propia relación.

Hay dos tipos de relaciones de dominio: relaciones de inclusión y relaciones de referencia. En el diagrama de definición de DSL, las relaciones de inclusión tienen líneas continuas en cada rol, mientras que las relaciones de referencia tienen líneas discontinuas.

Relaciones de inclusión

Cada elemento de un modelo, excepto su raíz, es el destino de un vínculo de inserción. Por consiguiente, todo el modelo forma un único árbol de vínculos de inserción. Una relación de inserción representa la independencia o la propiedad. Cualesquiera dos elementos de modelo relacionados de esta manera también se conocen como primario y secundario. Se dice que el elemento secundario está insertado en el elemento primario.

Normalmente, los vínculos de inserción no se muestran explícitamente como conectores en un diagrama. En su lugar, normalmente se representan mediante la independencia. La raíz del modelo se representa mediante el diagrama y los elementos insertados en ella se muestran como formas en el diagrama.

En el ejemplo, la clase raíz Music tiene una relación de inclusión MusicHasAlbums con Album, que tiene una inserción de AlbumHasSongs con Song. Las canciones se muestran como elementos de una lista dentro de cada álbum. Música también tiene una inserción de MusicHasArtists a la clase Artist, cuyas instancias también aparecen como formas en el diagrama.

De forma predeterminada, los elementos insertados se eliminan automáticamente cuando se eliminan sus elementos primarios.

Cuando un modelo se guarda en un archivo en formato XML, los elementos insertados se anidan dentro de sus elementos primarios, a menos que se haya personalizado la serialización.

Nota

Incrustación no es lo mismo que herencia. Los elementos secundarios de una relación de inclusión no heredan las propiedades del elemento primario. Una inserción es un tipo de vínculo entre los elementos del modelo. La herencia es una relación entre clases y no crea vínculos entre los elementos del modelo.

Reglas de inserción

Todos los elementos de un modelo de instancia deben ser el destino de exactamente un vínculo de inserción, excepto la raíz del modelo.

Por consiguiente, todas las clases de dominio no abstractos, excepto la clase raíz, deben ser el destino de al menos una relación de inclusión, o bien deben una inserción de una clase base. Una clase puede ser el destino de dos o más inserciones, pero sus elementos del modelo de instancia no pueden tener dos elementos primarios simultáneamente. La multiplicidad del destino al origen debe ser 0..1 o 1..1.

El explorador muestra el árbol de inserción

La definición de DSL también crea un explorador, que los usuarios ven junto con su diagrama de modelo.

Generated explorer of DSL

El explorador muestra todos los elementos del modelo, incluso aquellos para los que no se haya definido ninguna forma. Muestra los elementos y las relaciones de inclusión, pero no las relaciones de referencia.

Para ver los valores de las propiedades del dominio de un elemento, el usuario selecciona un elemento, ya sea en el diagrama de modelos o en el explorador de modelos, y abre el ventana Propiedades. Muestra todas las propiedades del dominio, incluidas las que no se muestran en el diagrama. En el ejemplo, cada canción tiene un título y un género, pero en el diagrama solo se muestra el valor del título.

Relaciones de referencia

Una relación de referencia representa cualquier tipo de relación que no sea de inserción.

Las relaciones de referencia suelen mostrarse en un diagrama como conectores entre formas.

En la representación XML del modelo, se representa un vínculo de referencia entre dos elementos mediante monikers. Es decir, los monikers son nombres que identifican de forma única cada elemento del modelo. El nodo XML de cada elemento de modelo contiene un nodo que especifica el nombre de la relación y el moniker del otro elemento.

Roles

Cada relación de dominio tiene dos roles, un rol de origen y un rol de destino.

En la siguiente imagen, la línea entre la clase de dominio Publisher y la relación de dominio PublisherCatalog es el rol de origen. La línea entre la relación de dominio y la clase de dominio Album es el rol de destino.

Roles and properties.

Los nombres asociados a una relación son especialmente importantes cuando se escribe código de programa que atraviesa el modelo. Por ejemplo, al compilar la solución DSL, la clases generada Publisher tiene una propiedad Catalog que es una colección de álbumes. La clase Album tiene una propiedad Publisher que es una instancia individual de la clase Publisher.

Cuando se crea una relación en una definición de DSL, los nombres de propiedad y relación tienen valores predeterminados. Sin embargo, se pueden cambiar.

Multiplicidades

Las multiplicidades especifican el número de elementos que pueden tener el mismo rol en una relación de dominio. En el ejemplo, el valor de multiplicidad cero a muchos (0..*) del rol Catálogo especifica que cualquier instancia de la clase de dominio Publisher puede tener tantos vínculos de relación PublisherCatalog como desee asignarle.

Configure la multiplicidad de un rol escribiendo en el diagrama o modificando la propiedad Multiplicity en la ventana Propiedades. En la tabla siguiente se describen la configuración de esta propiedad.

Tipo de multiplicidad Descripción
0..* (cero a muchos) Cada instancia de la clase de dominio puede tener varias instancias de la relación o ninguna instancia de la relación.
0..1 (cero a uno) Cada instancia de la clase de dominio no puede tener más de una instancia de la relación o ninguna instancia de la relación.
1..1 (uno) Cada instancia de la clase de dominio puede tener una instancia de la relación. No se puede crear más de una instancia de esta relación a partir de ninguna instancia de la clase de rol. Si la validación está habilitada, aparecerá un error de validación cuando cualquier instancia de la clase de rol no tenga ninguna instancia de la relación.
1..* (uno a muchos) Cada instancia de la clase en el rol que tiene esta multiplicidad puede tener varias instancias de la relación y cada instancia debe tener al menos una instancia de la relación. Si la validación está habilitada, aparecerá un error de validación cuando cualquier instancia de la clase de rol no tenga ninguna instancia de la relación.

Relaciones de dominio como clases

Los vínculos se representan en Store como instancias de LinkElement, que es una clase derivada de ModelElement. Estas propiedades se pueden definir en el diagrama del modelo de dominio en las relaciones de dominio.

También puede crear una relación con el origen o el destino de otras relaciones. En el diagrama del modelo de dominio, haga clic con el botón derecho en la relación de dominio y, después, haga clic en Mostrar como clase. Aparecerá un cuadro de clase adicional. A partir de ese momento puede conectar relaciones a él.

Puede definir una relación parcialmente por herencia, igual que con las clases de dominio. Seleccione la relación derivada y establezca Relación base en la ventana Propiedades.

Una relación derivada especializa su relación base. Las clases de dominio a las que vincula deben derivarse de las clases vinculadas por la relación base o son las mismas que ellas. Cuando se crea un vínculo de la relación derivada en un modelo, es una instancia de las relaciones derivadas y base. En el código de programa, puede desplazarse hasta el extremo opuesto del vínculo mediante las propiedades generadas por la base o por la clase derivada.