Definición de un lenguaje específico de dominio

Para definir un lenguaje específico de dominio (DSL), se crea una solución de Visual Studio a partir de una plantilla. La parte clave de la solución es el diagrama DSL Definition (Definición de DSL), que se almacena en DslDefinition.dsl. DSL Definition (Definición de DSL) define las clases y las formas del DSL. Después de modificar y agregar estos elementos, puede agregar código de programa para personalizar el DSL con más detalle.

Si no tiene experiencia con los DSL, le recomendamos que realice el laboratorio de herramientas DSL, que encontrará en este sitio: SDK de visualización y modelado.

Seleccionar una plantilla de solución

Para definir un DSL, debe tener instalados los siguientes componentes:

  • Visual Studio
  • Carga de trabajo de desarrollo de extensiones de Visual Studio (incluye el SDK de Visual Studio)
  • SDK de modelado (instálelo como un componente individual en Visual Studio)

Nota

El componente Transformación de plantilla de texto se instala de forma automática como parte de la carga de trabajo Desarrollo de extensiones de Visual Studio. También lo puede instalar desde la pestaña Componentes individuales del Instalador de Visual Studio, en la categoría SDK, bibliotecas y marcos. Instale el componente SDK de modelado desde la pestaña Componentes individuales.

Para crear un lenguaje específico de dominio, cree una solución de Visual Studio con la plantilla de proyecto Lenguaje específico de dominio.

Para crear una solución de DSL

  1. Cree un proyecto de Lenguaje específico de dominio.

    Se abre el Asistente para lenguaje específico de dominio y aparece una lista de plantillas de solución de DSL.

  2. Haga clic en cada plantilla para ver una descripción. Elija la solución que más se parezca a lo que quiere crear.

    Cada plantilla DSL define un DSL de trabajo básico. Editará este DSL para que se ajuste a sus requisitos.

    Haga clic en cada muestra para obtener más información.

    • Seleccione Flujo de tareas para crear un DSL que tenga calles. Las calles son particiones verticales u horizontales del diagrama.

    • Seleccione Component Models (Modelos de componentes) para crear un DSL que tenga puertos. Los puertos son pequeñas formas en el borde de una forma mayor.

    • Seleccione Class Diagrams (Diagramas de clases) para definir un DSL que tenga formas de compartimiento. Las formas de compartimiento contienen listas de elementos.

    • Seleccione Minimal Language (Lenguaje mínimo) en otros casos o si no está seguro.

    • Seleccione Minimal WinForm Designer (Diseñador de WinForm mínimo) o Minimal WPF Designer (Diseñador de WPF mínimo) para crear un DSL que se muestre en una superficie de WPF o Windows Forms. Tendrá que escribir código para definir el editor. Para obtener más información, vea los temas siguientes:

      Crear lenguajes específicos de dominio basados en Windows Forms

      Crear lenguajes específicos de dominio basados en WPF

  3. Escriba una extensión de nombre de archivo para su DSL en la página del asistente correspondiente. Esta es la extensión que usarán los archivos que contienen instancias de su DSL.

    • Elija una extensión de nombre de archivo que no esté asociada con ninguna aplicación en su equipo o en algún equipo donde quiera instalar el DSL. Por ejemplo, docx y htm no serían extensiones de nombre de archivo aceptables.

    • El asistente le advertirá en caso de que la extensión que haya especificado se esté usando como un DSL. Piense en usar una extensión de nombre de archivo diferente. También puede restablecer la instancia de Visual Studio SDK Experimental para borrar antiguos diseñadores experimentales. En el menú Inicio de Windows, escriba Restablecer Visual Studio y ejecute el comando Restablecer la instancia experimental de Microsoft Visual Studio que coincida con su versión de Visual Studio.

  4. Puede ajustar la configuración en las demás páginas o dejar los valores predeterminados.

  5. Haga clic en Finalizar

    El asistente crea una solución que contiene dos o tres proyectos, y genera código a partir de la definición de DSL.

    Ahora, la interfaz de usuario es similar a la imagen siguiente.

    diseñador dsl

    Esta solución define un lenguaje específico de dominio. Para obtener más información, consulte Información general sobre la interfaz de usuario de las Herramientas del lenguaje específico de dominio.

Probar la solución

La solución de plantilla proporciona un DSL de trabajo, que puede modificar o usar tal cual.

Para probar la solución, presione F5 o CTRL+F5. Se abre una instancia nueva de Visual Studio en modo experimental.

En la nueva instancia de Visual Studio, en el Explorador de soluciones, abra el archivo Sample. Se abre como un diagrama, con un cuadro de herramientas.

Si ejecuta una solución que ha creado con la plantilla Minimal Language (Lenguaje mínimo), la instancia experimental de Visual Studio se parecerá a la del ejemplo siguiente:

Árbol de ejemplo de lenguaje específico de dominio en Visual Studio

Experimente con las herramientas. Cree elementos y conéctelos.

Cierre la instancia experimental de Visual Studio.

Nota

Cuando haya modificado el DSL, ya no podrá ver las formas en el archivo de prueba Sample. Sin embargo, podrá crear nuevos elementos.

Modificar la plantilla de DSL

Cambie el nombre y conserve algunas o todas las clases de dominio y clases de forma en la plantilla de definición de DSL. Los nuevos nombres de clase deben ser nombres CLR válidos, sin espacios ni puntuación.

Conservar estas clases es especialmente útil:

  • La clase raíz aparece en la parte superior izquierda del diagrama de definición de DSL, en Clases y relaciones. Asígnele otro nombre según el DSL. Por ejemplo, un DSL denominado MusicLibrary podría tener una clase raíz llamada Music.

  • La clase de diagrama aparece en la parte inferior derecha del diagrama de definición de DSL, en la columna Elementos de diagrama. Quizás tenga que desplazarse a la derecha para verlo. Normalmente se llama Diagrama desuDsl.

  • Si usó la plantilla Flujo de tareas y quiere crear diagramas con calles, guarde la clase de dominio Actor y la forma ActorSwimlane, y cámbieles el nombre.

    Elimine o cambie el nombre de otras clases para que se ajusten a sus necesidades.

Patrones para definir un DSL

Le recomendamos que desarrolle un DSL agregando o ajustando una o dos características cada vez. Agregue una característica, ejecute el DSL y pruébelo y, después, agregue una o dos características más. Una característica típica de su DSL podría ser:

  • Una clase de dominio, la relación de incrustación que conecta el elemento con el modelo, la forma necesaria para mostrar elementos de esa clase en el diagrama y la herramienta de elemento que permite a los usuarios crear elementos.

  • Las propiedades de dominio de una clase de dominio y los elementos Decorator que los muestran en una forma.

  • Una relación de referencia y el conector que la muestra en el diagrama, y la herramienta de conector que permite a los usuarios crear vínculos.

  • Una personalización que requiere código de programa, como una restricción de validación o un comando de menú.

    En las secciones siguientes se describe cómo construir los tipos de características DSL más útiles. Hay muchos otros patrones con los que se puede construir un DSL, pero estos son los que se usan con más frecuencia.

Nota

Después de agregar una característica, no olvide hacer clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones antes de compilar y ejecutar su DSL.

La figura siguiente muestra las clases y relaciones que forman parte del DSL y que se usan como ejemplo en este tema.

Relaciones de incrustación y referencia

La siguiente figura es un modelo de ejemplo de este DSL:

Modelo de instancia de DSL generado

Nota

Con "modelo" nos referimos a una instancia de su DSL que los usuarios crean y que normalmente se muestra como un diagrama. En este tema se explican tanto el diagrama DSL Definition (Definición de DSL) como los diagramas de modelo que aparecen cuando se usa su DSL.

Definir clases de dominio

Las clases de dominio representan los conceptos de su DSL. Las instancias son elementos de modelo. Por ejemplo, en un DSL MusicLibrary, quizás tenga las clases de dominio Album y Song.

Para crear una clase de dominio, puede arrastrar desde la herramienta Clase de dominio con nombre al diagrama y, después, cambiar el nombre de la clase.

Para obtener más información, consulte Propiedades de las clases de dominio.

Crear una relación incrustada para cada clase de dominio

Todas las clases de dominio, excepto la clase raíz, deben ser el destino de al menos una relación de incrustación, o deben heredar de una clase que sea el destino de una relación de incrustación.

En un modelo, todos los elementos de modelo son nodos de un único árbol de relaciones incrustadas. El origen y el destino de una relación de incrustación suelen denominarse clases primaria y secundaria.

La selección de una clase primaria para una clase de dominio depende de cómo quiere que la duración de sus elementos dependa de otros elementos. Si se elimina un nodo de un árbol, normalmente también se elimina su subárbol. Por lo tanto, las clases de elemento que tienen una existencia independiente se incrustan directamente debajo de la clase raíz.

Normalmente, si muestra un elemento dentro de otro elemento, quiere indicar una relación de propiedad. En ese caso, la clase primaria más apropiada es la clase del contenedor. La excepción es cuando el elemento que ve dentro del contendor es tan solo un vínculo de referencia a un elemento independiente. En ese caso, al eliminar el contenedor se elimina la referencia pero no el destino.

En los patrones de una definición de DSL que se describen en este tema, damos por hecho que los elementos que se muestran dentro de un contenedor se eliminarán cuando el contenedor se elimine. Se pueden lograr esquemas más complejos mediante la definición de reglas.

Cómo se muestra el elemento Clase primaria (incrustación) Ejemplo en la plantilla de solución de DSL
Forma en el diagrama

Calle.
Clase raíz del DSL. Minimal Language.

Flujo de tareas: clase Actor.
Forma en una calle. Clase de dominio de los elementos que se muestran como calles. Flujo de tareas: clase Task.
Elemento en una lista en una forma; el elemento se elimina si el contenedor se elimina.

Puerto en el borde de una forma.
Clase de dominio que se asigna a la forma del contenedor. Diagrama de clases: clase Attribute.

Diagrama de componentes: clase Port.
Elemento en una lista; no se elimina si el contenedor se elimina. Clase raíz del DSL.

La lista muestra vínculos de referencia.
No se muestra directamente. Clase de la que forma parte.

En el ejemplo de la biblioteca de música, los álbumes se muestran como rectángulos en los que se enumeran los títulos de las canciones. Por lo tanto, la clase primaria de Album es la clase raíz Music, y la clase primaria de Song es Album.

Para crear una clase de dominio y su inclusión al mismo tiempo, haga clic en la herramienta Relación de inclusión, en la clase primaria y en una parte en blanco del diagrama.

Normalmente no es necesario ajustar el nombre de la relación de incrustación y de sus roles, porque rastrearán los nombres de las clases automáticamente.

Para obtener más información, consulte Propiedades de las relaciones de dominio y Propiedades de los roles de dominio.

Nota

Incrustación no es lo mismo que herencia. En una relación de incrustación, las clases secundarias no heredan las características de sus primarias.

Agregar propiedades de dominio a cada clase de dominio

Las propiedades de dominio almacenan valores. Algunos ejemplos son Nombre, Título y Fecha de publicación.

Haga clic en Propiedades del dominio en la clase, presione la tecla ENTRAR y escriba el nombre de una propiedad. El tipo predeterminado de una propiedad de dominio es String. Si quiere cambiar el tipo, seleccione la propiedad del dominio y establezca el valor de Tipo en la ventana Propiedades. Si el tipo que quiere no está en la lista desplegable, consulte Adición de tipos de propiedad.

Establezca una propiedad Element Name (Nombre de elemento). Seleccione una propiedad de dominio que se pueda usar para identificar los elementos en el explorador del lenguaje. Por ejemplo, en la clase de dominio Song que pueda seleccionar la propiedad de dominio Title (Título). En la ventana Propiedades, establezca Is Element Name en true.

Crear clases de dominio derivadas

Si quiere que una clase de dominio tenga variantes que hereden sus propiedades y relaciones, cree clases que deriven de ella. Por ejemplo, Album podría tener las clases derivadas WMA y MP3.

Cree la clase derivada con la herramienta Clase de dominio.

Haga clic en la herramienta Herencia, en la clase derivada y en la clase base.

Considere la posibilidad de establecer el valor del Modificador de herencia de la clase base en abstracto. Si cree que puede necesitar instancias de la clase base, considere la posibilidad de crear en su lugar una clase derivada diferente para ellas.

Las clases derivadas heredan las propiedades y los roles de sus clases base.

Ordenar el diagrama DSL Definition (Definición de DSL)

Cuando se agregan relaciones, algunas de las clases aparecen en más de un lugar. Para reducir el número de apariciones y ampliar el diagrama, haga clic con el botón derecho en la clase de destino de una relación y, después, haga clic en Traer árbol aquí. Para lograr el efecto opuesto, haga clic con el botón derecho en la clase de destino de una relación y haga clic en Dividir árbol. Si no ve estos comandos del menú, asegúrese de que solo está seleccionada la clase de dominio.

Use CTRL+Flecha arriba y CTRL+Flecha abajo para mover las clases de dominio y las clases de forma.

Probar las clases de dominio

Para probar las nuevas clases de dominio
  1. Haga clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones para generar el código del diseñador de DSL. Este paso se puede automatizar. Para obtener más información, consulte Cómo transformar automáticamente todas las plantillas.

  2. Compile y ejecute el DSL. Presione F5 o CTRL+F5 para ejecutar una nueva instancia de Visual Studio en modo experimental. En la instancia experimental de Visual Studio, abra o cree un archivo que tenga la extensión de nombre de archivo de su DSL.

  3. Abra el explorador. Al lado del diagrama está la ventana del explorador del lenguaje, que normalmente se llama Explorador de suLenguaje. Si no ve esta ventana, podría estar en una pestaña debajo del Explorador de soluciones. Si no lo encuentra, en el menú Ver, elija Otras ventanas y, después, haga clic en el Explorador de suLenguaje.

    El explorador presenta una vista de árbol del modelo.

  4. Crear nuevos elementos. Haga clic con el botón derecho en el nodo raíz, en la parte superior, y haga clic en Agregar nuevosuClase.

    En el explorador del lenguaje aparece una nueva instancia de su clase.

  5. Cuando cree nuevas instancias, compruebe que cada instancia tenga un nombre diferente. Esto solo sucede si ha establecido la marca Is Element Name en una propiedad de dominio.

  6. Examine las propiedades de dominio. Con una instancia de la clase seleccionada, inspeccione la ventana Propiedades. Debe mostrar las propiedades de dominio que ha definido en esta clase de dominio.

  7. Guarde el archivo, ciérrelo y vuelva a abrirlo. Después de expandir los nodos en el explorador, todas las instancias creadas deben ser visibles.

Definir formas en el diagrama

Puede definir clases de elementos que aparecen en un diagrama, como rectángulos, elipses o iconos.

Para definir una clase de elementos que aparecen como formas en un diagrama

  1. Defina y pruebe una clase de dominio, tal y como se describe enDefinición de clases de dominio.

    • La clase primaria debería ser la clase raíz. Es decir, debería haber una relación de incrustación entre la clase raíz y la nueva clase de dominio.

    • Si el diagrama tiene calles, la clase primaria puede ser la clase de dominio que está asignada a una calle. Antes de continuar con este procedimiento, consulte Definición de un DSL que tiene calles.

  2. Agregue una clase de forma para representar los elementos en el diagrama del modelo. Arrastre desde una de las siguientes herramientas al diagrama DSL Definition (Definición de DSL):

    • Forma geométrica proporciona un rectángulo o una elipse.

    • Forma de imagen muestra una imagen que proporcione.

    • Forma de compartimiento es un rectángulo que contiene una o varias listas de elementos.

      Cambie el nombre de la clase de forma, que aparecerá en el lado derecho del diagrama DSL Definition (Definición de DSL), en Shapes and Connectors (Formas y conectores).

  3. Defina una imagen, si ha creado una forma de imagen.

    1. Cree un archivo de imagen de cualquier tamaño. Se admiten los formatos BMP, JPEG, GIF y EMF.

    2. En el Explorador de soluciones, agregue el archivo a la solución, en Dsl\Resources.

    3. Vuelva al diagrama DSL Definition (Definición de DSL) y seleccione la nueva clase de forma de imagen.

    4. En la ventana Propiedades, haga clic en la propiedad Imagen.

    5. En el cuadro de diálogo Seleccionar imagen, haga clic en el menú desplegable Nombre de archivo y seleccione la imagen.

  4. Agregar elementos Decorator de texto a la forma para mostrar las propiedades de dominio.

    Para mostrar el nombre o el título del elemento de modelo, probablemente necesitará al menos un elemento Decorator de texto.

    Haga clic con el botón derecho en el encabezado de la clase de forma, elija Agregar y haga clic en Text Decorator. Establezca el nombre del elemento Decorator y, en la ventana Propiedades, establezca su Posición.

  5. Use una asignación de elemento de diagrama para conectar cada forma con la clase de dominio que debe mostrar.

    Haga clic en la herramienta Asignación de elemento de diagrama, en la clase de dominio y en la clase de forma.

  6. Asigne las propiedades a los elementos Decorator de texto.

    1. Seleccione la línea gris entre la clase de dominio y la clase de forma que representa la asignación de elemento de diagrama.

    2. En la ventana Detalles de DSL, haga clic en la pestaña Asignaciones de Decorator. Si no ve la ventana Detalles de DSL, en el menú Ver, elija Otras ventanas y haga clic en Detalles de DSL. Normalmente es necesario levantar la parte superior de esta ventana para ver todo su contenido.

    3. Seleccione el nombre de un elemento Decorator. En Mostrar propiedad, seleccione el nombre de una propiedad de la clase de dominio. Repita este paso para cada elemento Decorator.

      Si quiere mostrar una propiedad de un elemento relacionado, haga clic en el navegador de árbol desplegable en Ruta para mostrar la propiedad.

    4. Asegúrese de que hay una marca de verificación junto al nombre de cada elemento Decorator.

      Ventana de asignaciones de formas y detalles de DSL

  7. Cree un elemento de cuadro de herramientas para crear los elementos de la clase de dominio.

    1. En el Explorador de DSL, expanda el nodo Editor y todos sus subnodos.

    2. Haga clic con el botón derecho en el nodo debajo de Pestañas del cuadro de herramientas que tenga el mismo nombre que su DSL, por ejemplo, MusicLibrary. Haga clic en Add Element Tool (Agregar herramienta de elemento).

      Nota

      Si hace clic con el botón derecho en el nodo Herramientas, no verá Add Element Tool (Agregar herramienta de elemento). En su lugar, haga clic en el nodo situado encima de él.

    3. En la ventana Propiedades, con la nueva herramienta de elemento seleccionada, establezca Clase en la clase de dominio que ha agregado recientemente.

    4. Establezca el valor de Título y de Información sobre herramientas.

    5. Establezca el valor de Toolbox Icon en el icono que aparecerá en el cuadro de herramientas. Puede establecerlo en un icono nuevo o en un icono que ya se haya usado para otra herramienta.

      Para crear un icono, abra Dsl\Resources en el Explorador de soluciones. Copie y pegue uno de los archivos BMP existentes de las herramientas de elemento. Cambie el nombre a la copia pegada y, después, haga doble clic en él para editarlo.

      Vuelva al diagrama de definición de DSL, seleccione la herramienta y, en la ventana Propiedades, haga clic en […] en Toolbox Icon. En el cuadro de diálogo Seleccionar mapa de bits, seleccione el archivo .BMP en el menú desplegable.

    Para obtener más información, consulte Propiedades de las formas geométricas y Propiedades de las formas de imagen.

Para probar las formas

  1. Haga clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones para generar el código del diseñador de DSL.

  2. Compile y ejecute el DSL. Presione F5 o CTRL+F5 para ejecutar una nueva instancia de Visual Studio en modo experimental. En la instancia experimental de Visual Studio, abra o cree un archivo que tenga la extensión de nombre de archivo de su DSL.

  3. Compruebe que las herramientas de elemento aparecen en el cuadro de herramientas.

  4. Cree formas arrastrando desde una herramienta al diagrama del modelo.

  5. Compruebe que aparecen todos los elementos Decorator de texto y que:

    1. Puede editarlos, a menos que haya establecido la marca Is UI Read Only en la propiedad de dominio.

    2. Cuando se edita la propiedad en la ventana Properties (Propiedades) o en el elemento Decorator, la otra vista se actualiza.

    Después de probar una forma por primera vez, quizás quiera ajustar algunas de sus propiedades y agregar algunas características más avanzadas. Para obtener más información, consulte Personalización y ampliación de un lenguaje específico de dominio.

Definir relaciones de referencia

Puede definir una relación de referencia entre cualquier clase de dominio de origen y cualquier clase de dominio de destino. Las relaciones de referencia suelen mostrarse en un diagrama como conectores, que son líneas entre formas.

Por ejemplo, si los álbumes y los artistas se muestran como formas en el diagrama, podría definir una relación llamada ArtistsAppearedOnAlbums que vincula los artistas con los álbumes en los que han trabajado. Vea el ejemplo en la figura.

Modelo de instancia de DSL generado

Las relaciones de referencia también pueden vincular elementos del mismo tipo. Por ejemplo, en un DSL que representa un árbol genealógico, la relación entre los padres y los hijos es una relación de referencia de persona a persona.

Definir una relación de referencia

Haga clic en la herramienta Reference Relationship (Relación de referencia), haga clic en la clase de dominio de origen de la relación y, después, haga clic en la clase de dominio de destino. La clase de destino puede ser la misma que la clase de origen.

Cada relación tiene dos roles, representados por la línea a cada lado del cuadro de relación. Puede seleccionar cada rol y establecer sus propiedades en la ventana Properties (Propiedades).

Considere la posibilidad de cambiar el nombre de los roles. Por ejemplo, en una relación entre personas, quizás quiera cambiar los nombres predeterminados por Padres e Hijos, Director y Subordinados, Profesor y Estudiante, etc.

Ajuste las multiplicidades de cada rol, si es necesario. Si quiere que cada persona tenga al menos un director, establezca la multiplicidad que aparece debajo de la etiqueta Director en el diagrama a 0..1.

Agregue propiedades de dominio a la relación. En la figura, la relación Artist-Album tiene una propiedad de rol.

Establezca la propiedad Allows Duplicates de la relación, si puede haber más de un vínculo de la misma clase entre el mismo par de elementos de modelo. Por ejemplo, podría permitir que un Profesor enseñe más de una Asignatura al mismo Estudiante.

Asignaciones de formas para conectores

Para obtener más información, consulte Propiedades de las relaciones de dominio y Propiedades de los roles de dominio.

Definir un conector para mostrar la relación

Un conector muestra una línea entre dos formas en el diagrama del modelo.

Arrastre la herramienta Conector al diagrama de definición de DSL.

Agregue elementos Decorator de texto si quiere mostrar etiquetas en el conector. Establezca sus posiciones. Para que el usuario pueda mover un elemento Decorator de texto, establezca su propiedad Is Moveable.

Use la herramienta Asignación de elemento de diagrama para vincular el conector con la relación de referencia.

Con la asignación de elemento de diagrama seleccionada, abra la ventana Detalles de DSL y abra la pestaña Asignaciones de Decorator.

Seleccione cada elemento Decorator y establezca el valor de Mostrar propiedad en la propiedad de dominio correcta.

Asegúrese de que haya una marca de verificación junto a cada elemento de la lista Elementos Decorator.

Definir una herramienta Connection Builder (Generador de conexiones)

En la ventana del Explorador de DSL, expanda el nodo Editor y todos sus subnodos.

Haga clic con el botón derecho en el nodo que tenga el mismo nombre que su DSL y haga clic en Add New Connection Tool (Agregar nueva herramienta de conexión).

Con la nueva herramienta seleccionada, en la ventana Properties (Propiedades):

  • Establezca el valor de Título y de Información sobre herramientas.

  • Haga clic en Generador de conexiones y seleccione el generador apropiado para la nueva relación.

  • Establezca el valor de Toolbox Icon en el icono que quiere que aparezca en el cuadro de herramientas. Puede establecerlo en un icono nuevo o en un icono que ya se haya usado para otra herramienta.

    Para crear un icono, abra Dsl\Resources en el Explorador de soluciones. Copie y pegue uno de los archivos BMP existentes de las herramientas de elemento. Cambie el nombre a la copia pegada y, después, haga doble clic en él para editarlo.

    Vuelva al diagrama de definición de DSL, seleccione la herramienta y, en la ventana Propiedades, haga clic en […] en Toolbox Icon. En el cuadro de diálogo Seleccionar mapa de bits, seleccione el archivo .BMP en el menú desplegable.

Para probar una relación de referencia y un conector
  1. Haga clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones para generar el código del diseñador de DSL.

  2. Compile y ejecute el DSL. Presione F5 o CTRL+F5 para ejecutar una nueva instancia de Visual Studio en modo experimental. En la instancia experimental de Visual Studio, abra o cree un archivo que tenga la extensión de nombre de archivo de su DSL.

  3. Compruebe que la herramienta de conexión aparece en el cuadro de herramientas.

  4. Cree formas arrastrando desde una herramienta al diagrama del modelo.

  5. Cree conexiones entre las formas. Haga clic en la herramienta de conector, en una forma y, después, en otra forma.

  6. Compruebe que no puede crear conexiones entre clases inapropiadas. Por ejemplo, si su relación es entre Albums y Artists, compruebe que no puede vincular Artists con Artists.

  7. Compruebe que las multiplicidades son correctas. Por ejemplo, compruebe que no puede conectar una persona a más de un director.

  8. Compruebe que aparecen todos los elementos Decorator de texto y que:

    1. Puede editarlos, a menos que haya establecido la marca Is UI Read Only en la propiedad de dominio.

    2. Cuando se edita la propiedad en la ventana Properties (Propiedades) o en el elemento Decorator, la otra vista se actualiza.

    Después de probar un conector por primera vez, quizás quiera ajustar algunas de sus propiedades y agregar algunas características más avanzadas. Para obtener más información, consulte Personalización y ampliación de un lenguaje específico de dominio.

Definición de formas que contienen listas: formas de compartimiento

Una forma de compartimiento contiene una o varias listas de elementos. Por ejemplo, en un DSL de biblioteca de música, podría usar formas de compartimiento para representar álbumes de música. En cada álbum, hay una lista de canciones.

Forma de compartimiento

En el método más sencillo de lograr este efecto en una definición de DSL, se define una clase de dominio para el contenedor y una clase de dominio para cada lista. La clase de contenedor se asigna a la forma de compartimiento.

Asignación de formas

Para obtener más información, consulte Propiedades de las formas de compartimiento.

Para definir una forma de compartimiento

  1. Cree la clase de dominio de contenedor. Haga clic en la herramienta Relación de inclusión, en la clase raíz del modelo y en una parte en blanco del diagrama de definición de DSL. Esto crea la clase de dominio llamada Album en la figura de ejemplo.

    En lugar de incrustarlo en la clase raíz, también puede incrustar el contenedor en una clase de dominio que esté asignada a una calle.

    Agregue a la clase una propiedad de dominio, como Name, y establezca su marca Is Element Name en la ventana Propiedades.

  2. Cree la clase de dominio de elemento de lista. Haga clic en la herramienta Relación de inclusión, en la clase de contenedor (Album) y en una parte en blanco del diagrama. Esto crea la clase de dominio llamada Song en la figura de ejemplo.

    Agregue a la clase una propiedad de dominio, como Title, y establezca su marca Is Element Name.

    Agregue otras propiedades de dominio.

    Agregue otra clase de dominio de elemento de lista para cada lista que quiera mostrar.

  3. Para mezclar varios tipos de elementos de la lista, cree clases que hereden de la clase de lista. Establezca el valor de Modificador de herencia para que la clase de lista sea abstracta.

    Por ejemplo, si quiere que la música clásica se ordene por compositor en lugar de por artista, podría crear dos subclases de Song, ClassicalSong y NonClassicalSong.

  4. Cree la forma de compartimiento. Arrastre desde la herramienta Forma de compartimiento al diagrama de definición de DSL.

    Agregue un elemento Decorator de texto y establezca su nombre.

    Agregue un compartimiento y establezca su nombre.

  5. Para que el usuario pueda ocultar los compartimientos de lista, haga clic con el botón derecho en la clase de forma de compartimiento, elija Agregar y haga clic en Expand Collapse Decorator. En la ventana Properties (Propiedades), establezca la posición del elemento Decorator.

  6. Haga clic en la herramienta Asignación de elemento de diagrama, en la clase de dominio de contenedor y en la forma de compartimiento.

  7. Seleccione el vínculo de la asignación de elemento de diagrama entre la clase de dominio y la forma. En la ventana Detalles de DSL:

    1. Haga clic en la pestaña Elementos Decorator. Haga clic en el nombre del elemento Decorator y seleccione el elemento correspondiente en Mostrar propiedad. Asegúrese de que haya una marca de verificación junto al nombre del elemento Decorator.

    2. Haga clic en la pestaña Asignaciones de compartimientos.

      Haga clic en el nombre del compartimiento.

      En Ruta de colección de elementos mostrada, vaya a la clase de elemento de lista (Song). Haga clic en la flecha hacia abajo para usar la herramienta de navegador.

      En Mostrar propiedad, seleccione la propiedad que se debe mostrar en la lista. En el ejemplo, es Title.

Nota

Use los campos Path (Ruta de acceso) del Decorator Map (Asignación de elemento Decorator) y los campos de Compartment Maps (Asignaciones de compartimientos) para crear relaciones más complejas entre las clases de dominio y la forma de compartimiento.

Para definir una herramienta para crear la forma

  1. Cree un elemento de cuadro de herramientas para crear los elementos de la clase de dominio.

  2. En el Explorador de DSL, expanda el nodo Editor y todos sus subnodos.

  3. Haga clic con el botón derecho en el nodo debajo de Pestañas del cuadro de herramientas que tenga el mismo nombre que su DSL, por ejemplo, MusicLibrary. Haga clic en Add Element Tool (Agregar herramienta de elemento).

    Nota

    Si hace clic con el botón derecho en el nodo Herramientas, no verá Add Element Tool (Agregar herramienta de elemento). En su lugar, haga clic en el nodo situado encima de él.

  4. En la ventana Propiedades, con la nueva herramienta de elemento seleccionada, establezca Clase en la clase de dominio que ha agregado recientemente.

  5. Establezca el valor de Título y de Información sobre herramientas.

  6. Establezca el valor de Toolbox Icon en el icono que aparecerá en el cuadro de herramientas. Puede establecerlo en un icono nuevo o en un icono que ya se haya usado para otra herramienta.

    Para crear un icono, abra Dsl\Resources en el Explorador de soluciones. Copie y pegue uno de los archivos .BMP existentes de las herramientas de elemento. Cambie el nombre a la copia pegada y, después, haga doble clic en él para editarlo.

    Vuelva al diagrama de definición de DSL, seleccione la herramienta y, en la ventana Propiedades, haga clic en […] en Toolbox Icon. En el cuadro de diálogo Seleccionar mapa de bits, seleccione el archivo BMP en el menú desplegable.

Para probar una forma de compartimiento

  1. Haga clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones para generar el código del diseñador de DSL.

  2. Compile y ejecute el DSL. Presione F5 o CTRL+F5 para ejecutar una nueva instancia de Visual Studio en modo experimental. En la instancia experimental de Visual Studio, abra o cree un archivo que tenga la extensión de nombre de archivo de su DSL.

  3. Compruebe que la herramienta aparece en el cuadro de herramientas.

  4. Arrastre la herramienta al diagrama del modelo. Se crea una forma.

    Compruebe que el nombre del elemento aparece y se establece automáticamente en un valor predeterminado.

  5. Haga clic con el botón derecho en el encabezado de la nueva forma y en Agregar su elemento de lista. En el ejemplo, el comando es Agregar canción.

    Compruebe que aparece un elemento en la lista y que tiene un nombre nuevo.

  6. Haga clic en uno de los elementos de lista y, después, examine la ventana Properties (Propiedades). Verá las propiedades de los elementos de lista.

  7. Abra el explorador del lenguaje. Compruebe que puede ver los nodos de contenedor con los nodos de elemento de lista dentro.

    Explorador generado de DSL

    Después de probar una forma de compartimiento por primera vez, quizás quiera ajustar algunas de sus propiedades y agregar algunas características más avanzadas. Para obtener más información, consulte Personalización y ampliación de un lenguaje específico de dominio.

Normalmente, un elemento que se muestra en un compartimiento es un elemento secundario del elemento que está representado por la forma de compartimiento. Pero a veces querrá mostrar un elemento que está vinculado a él con una relación de referencia.

Por ejemplo, podríamos agregar un segundo compartimiento a AlbumShape que muestra una lista de los artistas que están vinculados al álbum.

En este caso, el compartimiento debe mostrar el vínculo en lugar del elemento referenciado. El motivo es que quieres que, cuando el usuario seleccione el elemento en el compartimiento y presione DELETE, se elimine el vínculo, no el elemento referenciado.

En cualquier caso, puede hacer que se muestre el nombre del elemento referenciado en el compartimiento.

En el procedimiento siguiente se da por hecho que ya ha creado la clase de dominio, la relación de referencia, la forma de compartimiento y la asignación de elemento de diagrama, tal y como se describió anteriormente en esta sección.

  1. Agregue un compartimiento a la forma de compartimiento. En el diagrama de definición de DSL, haga clic con el botón derecho en la clase de forma de compartimiento, elija Agregar y haga clic en Compartimiento.

  2. Establezca Ruta de colección de elementos mostrada de modo que vaya al vínculo, en lugar de al elemento de destino. Haga clic en el menú desplegable y use la vista de árbol para seleccionar la relación de referencia en lugar de su destino. En este ejemplo, la relación es ArtistAppearedOnAlbums.

  3. Establezca Ruta para mostrar la propiedad de modo que vaya del vínculo al elemento de destino. En el ejemplo, es Artist.

  4. Establezca Mostrar propiedad en la propiedad correspondiente del elemento de destino, por ejemplo, Nombre.

  5. Transforme todas las plantillas, compile el DSL, ejecútelo y abra un modelo de prueba.

  6. En el diagrama del modelo, cree las clases de forma apropiadas, establezca sus nombres y cree un vínculo entre ellas. En la forma de compartimiento, deben aparecer los nombres de los elementos vinculados.

  7. Seleccione el vínculo o el elemento en la forma de compartimiento. Deben desaparecer tanto el vínculo como el elemento.

Definir puertos en los límites de otra forma

Un puerto es una forma que está situada en los límites de otra forma.

Los puertos se pueden usar para proporcionar un punto de conexión fijo en otra forma al cual el usuario puede dibujar conectores. En este caso, puede hacer que la forma de puerto sea transparente.

Para ver un ejemplo donde se usan puertos, seleccione la plantilla Diagrama de componentes cuando cree una solución de DSL. En este ejemplo se muestran los principales aspectos para tener en cuenta al definir puertos:

  • Hay una clase de dominio que representa el contenedor de los puertos, Component.

  • Hay una clase de dominio que representa los puertos. en el ejemplo es ComponentPort.

  • Hay una relación de incrustación desde la clase de dominio de contendor a la clase de dominio de puerto. Para obtener más información, consulte Definición de clases de dominio.

  • Si quiere mezclar diferentes tipos de puerto en el mismo contenedor, puede crear subclases de la clase de dominio de puerto. En el ejemplo, InPort y OutPort heredan de ComponentPort.

  • La clase de dominio de contenedor se puede asignar a cualquier tipo de forma. En el ejemplo, es ComponentShape. Para obtener más información, consulte Definición de formas.

  • Las clases de dominio de puerto se asignan a formas de puerto. Puede asignar las clases derivadas a clases de forma de puerto diferentes, o asignar la clase base a una clase de forma de puerto.

    En otros aspectos, las formas de puerto se comportan tal y como se describe en Definición de formas.

    Para obtener más información, consulte Propiedades de las formas de puerto.

Definir un DSL que tiene calles

Las calles son una partición horizontal o vertical de un diagrama. Cada calle corresponde a un elemento de modelo. Su definición de DSL requiere una clase de dominio para los elementos de calle.

La mejor manera de crear un DSL con calles es crear una nueva solución de DSL y elegir la plantilla de solución Task Flow (Flujo de tareas). En la definición de DSL, la clase Actor es la clase de dominio asignada a la calle. Cambie el nombre de esta y otras clases para adaptarlas a su proyecto.

Para agregar una clase que se mostrará como una forma dentro de una calle, cree una relación de incrustación entre la clase de calle y la nueva clase. Los usuarios podrán arrastrar elementos desde una calle a otra, pero cada elemento siempre estará dentro de una calle determinada. En la plantilla de solución Task Flow (Flujo de tareas), FlowElement es una clase secundaria de la clase de calle.

Para agregar una clase que se mostrará como una forma independiente de las calles, cree una relación de incrustación entre la clase raíz y la nueva clase. Los usuarios podrán colocar estas formas en cualquier lugar del diagrama, incluso traspasando los límites de las calles y fuera de ellas. En la plantilla de solución Task Flow (Flujo de tareas), Comment es una clase secundaria de la clase raíz.

Para obtener más información, consulte Propiedades de las calles.

Agregar tipos de propiedad

Literales y enumeradores de dominio

Una enumeración de dominio es un tipo con varios valores literales.

Para agregar una enumeración de dominios, haga clic con el botón derecho en la raíz del modelo en el Explorador de DSL y haga clic en Add New Domain Enumeration (Agregar nueva enumeración de dominio). El elemento aparecerá en el Explorador de DSL en el nodo Tipos de dominio. Este elemento no aparece en el diagrama.

Para agregar literales de enumeración a la enumeración de dominio, haga clic con el botón derecho en la enumeración de dominios en el Explorador de DSL y, después, haga clic en Add New Enumeration Literal (Agregar nuevo literal de enumeración).

De forma predeterminada, una propiedad que tiene un tipo de enumeración solo se puede establecer en un valor de la enumeración al mismo tiempo. Si quiere que los usuarios y programadores puedan establecer cualquier combinación de valores (un "campo de bits"), establezca la propiedad IsFlags de la enumeración.

Tipos externos

Cuando se establece el tipo de una propiedad de dominio, si no encuentra el tipo que quiere en la lista desplegable Tipo, puede agregar un tipo externo. Por ejemplo, podría agregar el tipo System.Drawing.Color a la lista.

Para agregar un tipo, haga clic con el botón derecho en la raíz del modelo en el Explorador de DSL y haga clic en Add New External Type (Agregar nuevo tipo externo). En el ventana Propiedades, establezca el nombre en Color y el espacio de nombres en System.Drawing. Este tipo ahora aparece en el Explorador de DSL en Tipos de dominio. Puede elegirlo siempre que establezca el tipo de una propiedad de dominio.

Personalizar el DSL

Con las técnicas descritas en este tema, puede crear rápidamente un DSL con una notación en forma de diagrama, un formato XML legible, y las herramientas básicas que se necesitan para generar código y otros artefactos.

Hay dos métodos para extender la definición de DSL:

  1. Ajuste el DSL usando más características de la definición de DSL. Por ejemplo, puede crear una sola herramienta de conector que pueda crear varios tipos de conector, y puede controlar las reglas por las que al eliminar un elemento también se eliminan los elementos relacionados. Estas técnicas se logran principalmente estableciendo valores en la definición de DSL, y algunas requieren unas cuantas líneas de código de programa.

    Para obtener más información, consulte Personalización y ampliación de un lenguaje específico de dominio.

  2. Amplíe sus herramientas de modelado usando código de programa para lograr efectos más avanzados. Por ejemplo, puede crear comandos de menú que pueden cambiar el modelo, y puede crear herramientas que integren dos o más DSL. VMSDK está diseñado específicamente para facilitar la integración de las extensiones con el código que se genera a partir de la definición de DSL. Para obtener más información, consulte Escritura de código para personalizar un lenguaje específico de dominio.

Cambiar la definición de DSL

Cuando se crea un elemento en una definición de DSL, muchos valores predeterminados se establecen automáticamente. Una vez establecidos, puede cambiarlos. Esto simplifica el desarrollo de un DSL, al tiempo que permite realizar personalizaciones eficaces.

Por ejemplo, cuando se asigna una forma a un elemento, la ruta del elemento primario de la asignación se establece automáticamente de acuerdo con la relación de incrustación de la clase de dominio. Sin embargo, si más adelante cambia la relación de incrustación, la ruta del elemento primario no cambia automáticamente.

Por lo tanto, debe tener en cuenta que, cuando se cambian algunas relaciones en una definición de DSL, no es extraño que aparezcan errores al guardar la definición o al transformar todas las plantillas. La mayoría de estos errores son fáciles de corregir. Haga doble clic en el informe de error para ver la ubicación del error.

Consulte también Cómo cambiar el espacio de nombres de un lenguaje específico de dominio.

Solución de problemas

En la tabla siguiente se enumeran algunos de los problemas más comunes que se encuentran al diseñar un DSL, además de sugerencias para solucionarlos. Hay más consejos disponibles en el foro de extensibilidad de herramientas de visualización.

Problema Sugerencia
Los cambios que he hecho en el archivo de definición de DSL no surten efecto. Haga clic en Transformar todas las plantillas en la barra de herramientas situada encima del Explorador de soluciones y recompile la solución.
Las formas muestran el nombre de un elemento Decorator en lugar del valor de la propiedad. Configure la asignación del elemento Decorator. En el diagrama DSL Definition (Definición de DSL), haga clic en la asignación de elemento de diagrama, que es la línea gris entre la clase de dominio y la clase de forma.

Abra la ventana Detalles de DSL. Si no aparece, en el menú Ver, elija Otras ventanas y haga clic en Detalles de DSL.

Haga clic en la pestaña Asignaciones de Decorator. Seleccione el nombre del elemento Decorator. Asegúrese de que la casilla situada junto a él está activada. En Mostrar propiedad, seleccione el nombre de una propiedad de dominio.

Para obtener más información, consulte Formas del diagrama.
En DSL Explorer (Explorador de DSL), no puedo agregar nada a una colección. Por ejemplo, al hacer clic con el botón secundario en Tools (Herramientas), no hay ningún comando "Add Tool" (Agregar herramienta) en el menú.

En el explorador de mi DSL, no puedo agregar un elemento a una lista.
Haga clic en el elemento situado encima del nodo que está intentando. Cuando quiera agregar algo a una lista, el comando Add (Agregar) no está en el nodo de lista, sino en su propietario.
Creé una clase de dominio pero no puedo crear instancias en el explorador del lenguaje. Todas las clases de dominio, excepto la raíz, deben ser el destino de una relación de incrustación.
En el explorador de mi DSL, los elementos se muestran solo con sus nombres de tipo. En la definición de DSL, seleccione una propiedad de dominio de la clase y, en la ventana Propiedades, establezca Is Element Name en true.
Mi DSL siempre se abre en el editor XML. El motivo puede ser que se produjo un error mientras se leía el archivo. Sin embargo, después de corregir ese error, debe restablecer explícitamente el editor para que sea su diseñador de DSL.

Haga clic con el botón derecho en el elemento de proyecto, haga clic en Abrir con y seleccione Diseñador de suLenguaje (predeterminado).
El cuadro de herramientas de mi DSL no aparece después de cambiar los nombres de ensamblado. Inspeccione y actualice DslPackage\GeneratedCode\Package.tt. Para obtener más información, consulte Cómo cambiar el espacio de nombres de un lenguaje específico de dominio.
El cuadro de herramientas de mi DSL no aparece, pero no he cambiado el nombre del ensamblado.

O bien, se muestra un cuadro de mensaje que indica un error al cargar una extensión.
Restablezca la instancia experimental y vuelva a compilar la solución.

1. En el menú Inicio de Windows, en Todos los programas, expanda el SDK de Visual Studio y Herramientas y, después, haga clic en Restablecer la instancia experimental de Microsoft Visual Studio.
2. En el menú Compilar, haga clic en Recompilar solución.