Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un lenguaje específico del dominio (DSL) se define mediante su archivo de definición de 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.
Definición de DSL
Al abrir Dsl\DslDefinition.dsl, la ventana de Visual Studio es similar a la siguiente imagen.
La información más importante de la definición de DSL se muestra en el diagrama de definición de DSL. La información adicional, que también forma parte de DslDefinition.dsl, se muestra en el Explorador dsl, que normalmente aparece en el lado del diagrama. Trabaja con el diagrama para las tareas más frecuentes y con el Explorador DSL para personalizaciones más avanzadas.
El diagrama de definición de DSL muestra las clases de dominio que definen los elementos del modelo y las relaciones que definen vínculos entre los elementos del modelo. También muestra las formas y conectores que se usan para mostrar los elementos del modelo al usuario.
Al seleccionar un elemento en la definición de DSL, ya sea en el diagrama o en el Explorador dsl, se muestra información sobre él en la ventana Propiedades. Es posible que se muestre información adicional en la ventana Detalles del DSL.
Los modelos son instancias de DSL
Un modelo es una instancia del DSL creado 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 forma, las clases de conector y una clase para el diagrama.
Una definición de DSL también se conoce como modelo 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 instanciación en tiempo de ejecución del lenguaje específico del dominio.
Las clases de dominio definen elementos de modelo
Las clases de dominio se usan para crear los distintos elementos del dominio y las relaciones de dominio son los vínculos entre los elementos. Son la representación durante el diseño de los elementos y vínculos que serán instanciados por 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 están representados por cajas con esquinas redondeadas y están conectados a los álbumes a los que han contribuido.
La definición de DSL separa dos aspectos. La apariencia de los elementos del modelo en el diagrama de modelos se define mediante clases de formas y clases de conector. La información que se lleva en el modelo se define mediante clases de dominio y relaciones de dominio.
En la ilustración siguiente se muestran las clases de dominio y las relaciones en la definición dsl de la biblioteca de música.
En la ilustración se muestran cuatro clases de dominio: Música, Álbum, Artista y Canción. Las clases de dominio definen propiedades de dominio como Nombre, Título, etc. En el modelo de 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:
Intercambiar vistas principales y de referencia mediante los comandos Bring Tree Here y Split Tree . Haga clic con el botón derecho en una sola clase de dominio para ver estos comandos.
Vuelva a ordenar las clases de dominio y las clases de forma presionando Ctrl+Arriba y Ctrl+Abajo.
Contraiga o expanda clases mediante el icono situado en la esquina superior derecha de cada forma.
Contraiga 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, haga clic en la clase derivada y, a continuación, haga clic 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.
La herencia también se puede utilizar entre Relaciones, Formas y Conectores. La herencia debe mantenerse dentro del mismo grupo. Una forma no puede heredar de una clase de dominio.
Relaciones de dominio
Los elementos del modelo se pueden vincular mediante relaciones. Los vínculos siempre son binarios; vinculan exactamente dos elementos. Sin embargo, cualquier elemento puede tener muchos vínculos a otros objetos y incluso puede haber más de un vínculo entre el mismo par de elementos.
Al igual 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 qué clases de elemento pueden conectarse sus instancias. Cada extremo de una relación se denomina 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 incrustación y relaciones de referencia. En el diagrama de definición de DSL, las relaciones de incorporación tienen líneas continuas en cada rol y las relaciones de referencia tienen líneas discontinuas.
Insertar relaciones
Cada elemento de un modelo, excepto su raíz, es el destino de un vínculo de inserción. Por lo tanto, todo el modelo forma un único árbol de vínculos de inserción. Una relación de inserción representa la contención o propiedad. Dos elementos de modelo relacionados de esta manera también se conocen como padre e hijo. Se dice que el elemento hijo está incrustado en el elemento padre.
Normalmente, los vínculos de inserción no se muestran explícitamente como conectores en un diagrama. En su lugar, normalmente se representan mediante encapsulamiento. La raíz del modelo se representa mediante el diagrama y los elementos incrustados en él se muestran como formas en el diagrama.
En el ejemplo, la clase raíz Music tiene una relación de inserción MusicHasAlbums en Album, que tiene una inserción de AlbumHasSongs en Song. Las canciones se muestran como elementos de una lista dentro de cada álbum. La música también tiene una inserción de MusicHasArtists en la clase Artist, cuyas instancias también aparecen como formas en el diagrama.
De forma predeterminada, los elementos incrustados se eliminan automáticamente cuando se eliminan sus elementos primarios.
Cuando un modelo se guarda en el archivo en formato XML, los elementos incrustados se anidan dentro de sus elementos primarios, a menos que haya personalizado la serialización.
Nota:
La inserción no es la misma que la herencia. Los hijos en una relación de inserción no heredan las propiedades del padre. 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 elementos del modelo.
Reglas de inserción
Cada elemento de un modelo de instancia debe ser el destino de exactamente un vínculo de inserción, excepto para la raíz del modelo.
Por lo tanto, cada clase de dominio no abstracta, excepto la clase raíz, debe ser el destino de al menos una relación de inserción o debe heredar 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 solo pueden tener un elemento primario a la vez. 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 modelos.
El explorador muestra todos los elementos del modelo, incluso aquellos para los que no haya definido ninguna forma. Muestra elementos y relaciones de incrustación, pero no las relaciones de referencia.
Para ver los valores de las propiedades de dominio de un elemento, el usuario selecciona un elemento, ya sea en el diagrama de modelos o en el explorador de modelos, y abre la ventana Propiedades. Muestra todas las propiedades de 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 solo se muestra el valor del título en el diagrama.
Relaciones de referencia
Una relación referencial representa cualquier tipo de relación que no sea de incrustación.
Las relaciones de referencia se muestran normalmente 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.
Funciones
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.
Los nombres asociados a una relación son especialmente importantes al escribir código de programa que atraviesa el modelo. Por ejemplo, al compilar la solución DSL, la clase generada Publisher tiene una propiedad Catalog que es una colección de álbumes. La clase Album tiene una propiedad Publisher que es una sola instancia de la clase Publisher.
Al crear una relación en una definición de DSL, los nombres de propiedad y relación reciben valores predeterminados. Sin embargo, puede cambiarlos.
Multiplicidades
Las multiplicidades especifican cuántos elementos pueden tener el mismo rol en una relación de dominio. En el ejemplo, la configuración de multiplicidad de cero a varios (0..*) en el rol Catálogo especifica que cualquier instancia de la clase de dominio publisher puede tener tantos vínculos de relación PublisherCatalog como desee proporcionar.
Configure la multiplicidad de un rol escribiendo en el diagrama o modificando la Multiplicity propiedad en la ventana Propiedades . En la tabla siguiente se describe la configuración de esta propiedad.
| Tipo de multiplicidad | Description |
|---|---|
| 0..* (De cero a varios) | 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 varios) | 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
Un vínculo se representa en store como una instancia de LinkElement, que es una clase derivada de ModelElement. Puede definir estas propiedades en el diagrama del modelo de dominio en las relaciones de dominio.
También puede hacer que una relación sea 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, a continuación, haga clic en Mostrar como clase. Aparecerá un cuadro de clase adicional. Después, puede establecer relaciones con ella.
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 o de las mismas que las clases vinculadas por la relación base. Cuando se crea un enlace de la relación derivada en un modelo, es una instancia tanto de la relación derivada como de la base. En el código de programa, puede navegar hasta el extremo opuesto del vínculo mediante las propiedades generadas por la base o por la clase derivada.