Share via


Introducción a los lenguajes específicos de dominio

En este tema se explican los conceptos básicos para definir y usar un lenguaje específico del dominio (DSL) creado con el SDK de modelado para Visual Studio.

Nota

El SDK de transformación plantilla de texto y el SDK de modelado de Visual Studio se instalan automáticamente al instalar características específicas de Visual Studio. Consulte esta entrada de blog para obtener más información.

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

¿Qué puede hacer con un lenguaje específico de dominio?

Un lenguaje específico del dominio es una notación, normalmente gráfica, que está diseñada para usarse con un propósito determinado. Por el contrario, los lenguajes como UML son de uso general. En un DSL, puede definir los tipos de elemento de modelo y sus relaciones, y cómo se presentan en la pantalla.

Cuando haya diseñado un DSL, puede distribuirlo como parte de un paquete de Extensión de integración de Visual Studio (VSIX). Los usuarios trabajan con el DSL en Visual Studio:

Family tree diagram, toolbox, and explorer

La notación es solo parte de un DSL. Junto con la notación, el paquete VSIX incluye herramientas que los usuarios pueden aplicar para ayudarles a editar y generar material a partir de sus modelos.

Una de las aplicaciones principales de DSL es generar código de programa, archivos de configuración y otros artefactos. Especialmente en proyectos de gran tamaño y líneas de productos, donde se crearán varias variantes de un producto, la generación de muchos de los aspectos variables a partir de DSL puede proporcionar un gran aumento en la confiabilidad y una respuesta muy rápida a los cambios en los requisitos.

El resto de esta información general es un tutorial que presenta las operaciones básicas de creación y uso de un lenguaje específico del dominio en Visual Studio.

Prerrequisitos

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

Componente Vínculo
Visual Studio http://go.microsoft.com/fwlink/?LinkId=185579
Visual Studio SDK https://go.microsoft.com/fwlink/?linkid=2166172
Modelado del SDK para 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.

Creación de una solución DSL

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.

  1. En el menú Archivo , seleccione Nuevoy haga clic en Proyecto.

  2. En Tipos de proyecto, expanda el nodo Otros tipos de proyecto y haga clic en Extensibilidad.

  3. Haga clic en Diseñador de lenguaje específico de dominio.

    Create DSL dialog

  4. En el cuadro Nombre, escriba FamilyTree. Haga clic en OK.

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

    Haga clic en cada plantilla para ver una descripción,

    Las plantillas son puntos de partida útiles. Cada uno de ellos proporciona un DSL de trabajo completo, que puede editar para satisfacer sus necesidades. Normalmente, elegiría la plantilla más cercana a lo que desea crear.

  5. Para este tutorial, elija la plantilla Idioma mínimo.

  6. 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 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.

  7. Inspeccione las demás páginas y, a continuación, haga clic en Finalizar.

    Se genera una solución que contiene dos proyectos. Se denominan Dsl y DslPackage. Se abre un archivo de diagrama denominado DslDefinition.dsl.

    Nota

    La mayoría del código que puede ver en las carpetas de los dos proyectos se genera a partir de DslDefinition.dsl. Por este motivo, la mayoría de las modificaciones en su DSL se realizan en este archivo.

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

dsl designer

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.

Las partes importantes de la solución DSL

Observe los siguientes aspectos de la nueva solución:

  • Dsl\DslDefinition.dsl Este es el archivo que ve al crear una solución DSL. Casi todo el código de la solución se genera a partir de este archivo y aquí se realizan la mayoría de los cambios que realice en una definición de DSL. Para obtener más información, consulte Trabajar con el diagrama de definición de DSL.

  • Proyecto Dsl Este proyecto contiene código que define el lenguaje específico del dominio.

  • Proyecto DslPackage Este proyecto contiene código que permite que las instancias del DSL se abran y editan en Visual Studio.

Ejecución del DSL

Puede ejecutar la solución DSL en cuanto la haya creado. Más adelante, puede modificar la definición de DSL gradualmente, ejecutando la solución de nuevo después de cada cambio.

Para experimentar con el DSL

  1. Haga clic en Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones. Esto regenera la mayoría del código fuente de DslDefinition.dsl.

    Nota

    Siempre que cambie DslDefinition.dsl, debe hacer clic en Transformar todas las plantillas antes de volver a generar la solución. Este paso se puede automatizar. Para obtener más información, consulte Cómo transformar automáticamente todas las plantillas.

  2. Presione F5o bien, en el menú Depurar , haga clic en Iniciar depuración.

    El DSL se compila y se instala en la instancia experimental de Visual Studio.

    Se inicia una instancia experimental de Visual Studio. La instancia experimental toma su configuración de un subárbol independiente del Registro, donde las extensiones de Visual Studio se registran con fines de depuración. Las instancias normales de Visual Studio no tienen acceso a las extensiones registradas allí.

  3. En la instancia experimental de Visual Studio, abra el archivo de modelo denominado Test de Explorador de soluciones.

    O bien

    Haga clic con el botón derecho en el proyecto, seleccione Agregar y haga clic en Elemento. En el cuadro de diálogo Agregar elemento, seleccione el tipo de archivo de su DSL.

    El archivo de modelo se abre como un diagrama en blanco.

    El cuadro de herramientas se abre y muestra las herramientas adecuadas para el tipo de diagrama.

  4. Use las herramientas para crear formas y conectores en el diagrama.

    1. Para crear formas, arrastre desde la herramienta Forma de ejemplo al diagrama.

    2. Para conectar dos formas, haga clic en la herramienta Conector de ejemplo, haga clic en la primera forma y, a continuación, haga clic en la segunda forma.

  5. Haga clic en las etiquetas de las formas para cambiarlas.

El ejemplo experimental de Visual Studio será similar al siguiente:

Domain specific language sample tree in Visual Studio

El contenido de un modelo

El contenido de un archivo que es una instancia de un DSL se denomina modelo. El modelo contiene elementos de modelo y vínculos entre los elementos. La definición de DSL especifica qué tipos de elementos y vínculos de modelo pueden existir en el modelo. Por ejemplo, en un DSL creado a partir de la plantilla Lenguaje mínimo, hay un tipo de elemento de modelo y un tipo de vínculo.

La definición de DSL puede especificar cómo aparece el modelo en un diagrama. Puede elegir entre varios estilos de formas y conectores. Puede especificar que algunas formas aparecen dentro de otras formas.

Puede ver un modelo como un árbol en la vista Explorador mientras edita un modelo. A medida que agrega formas al diagrama, los elementos del modelo también aparecen en el explorador. El explorador se puede usar incluso si no hay ningún diagrama.

Si no puede ver el Explorador en la instancia de depuración de Visual Studio, en el menú Ver, seleccione Otras ventanas y, a continuación, haga clic en <Su lenguaje >Explorer.

La API de su DSL

El DSL genera una API que le permite leer y actualizar modelos que son instancias del DSL. Una aplicación de la API es generar archivos de texto a partir de un modelo. Para obtener más información, vea Generación de código en tiempo de diseño mediante plantillas de texto T4.

En la solución Depuración, abra los archivos de plantilla con la extensión ".tt". Estos ejemplos muestran cómo puede generar texto a partir de modelos y le permiten probar la API de su DSL. Uno de los ejemplos se escribe en Visual Basic, el otro en Visual C#.

En cada archivo de plantilla es el archivo que genera. Expanda el archivo de plantilla en Explorador de soluciones y abra el archivo generado.

El archivo de plantilla contiene un segmento corto de código que enumera todos los elementos del modelo.

El archivo generado contiene el resultado.

Al cambiar un archivo de modelo, verá los cambios correspondientes en los archivos generados después de regenerar los archivos.

Para volver a generar archivos de texto después de cambiar el archivo de modelo

  1. En la instancia experimental de Visual Studio, guarde el archivo de modelo.

  2. Asegúrese de que el parámetro de nombre de archivo en cada archivo .tt hace referencia al archivo de modelo que está usando para experimentos. Guarde el archivo .tt.

  3. Haga clic en Transforme todas las plantillas en la barra de herramientas del Explorador de soluciones.

    O bien

    Haga clic con el botón derecho en las plantillas que desea regenerar y, a continuación, haga clic en Ejecutar herramienta personalizada.

Puede agregar cualquier número de archivos de plantilla de texto a un proyecto. Cada plantilla genera un archivo de resultados.

Nota

Al cambiar la definición de DSL, el código de plantilla de texto de ejemplo no funcionará, a menos que lo actualice.

Para obtener más información, vea Generar código a partir de un lenguaje específico de dominio y Escribir código para personalizar un lenguaje específico de dominio.

Personalizar el DSL

Cuando desee modificar la definición de DSL, cierre la instancia experimental y actualice la definición en la instancia principal de Visual Studio.

Nota

Después de modificar la definición de DSL, es posible que pierda información en los modelos de prueba que ha creado con versiones anteriores. Por ejemplo, la solución de depuración contiene un archivo denominado Sample, que contiene algunas formas y conectores. Después de empezar a desarrollar la definición de DSL, no estarán visibles y se perderán al guardar el archivo.

Puede hacer una amplia variedad de extensiones para su DSL. Los ejemplos siguientes le darán una impresión de las posibilidades.

Después de cada cambio, guarde la definición de DSL, haga clic en Transformar todas las plantillas en Explorador de soluciones y presione F5 para experimentar con el DSL cambiado.

Cambiar el nombre de los tipos y las herramientas

Cambie el nombre de las clases de dominio y las relaciones existentes. Por ejemplo, a partir de una definición de Dsl creada a partir de la plantilla Lenguaje mínimo, puede realizar las siguientes operaciones de cambio de nombre para que el DSL represente árboles de familia.

Para cambiar el nombre de las clases de dominio, las relaciones y las herramientas

  1. En el diagrama DslDefinition, cambie el nombre de ExampleModel a FamilyTreeModel, ExampleElement a Persona, Destinos a Elementos principales y Orígenes a Elementos secundarios. Puede hacer clic en cada etiqueta para cambiarla.

    DSL Definition diagram - family tree model

  2. Cambie el nombre del elemento y las herramientas del conector.

    1. Abra la ventana Explorador de DSL haciendo clic en la pestaña debajo de Explorador de soluciones. Si no puede verlo, en el menú Ver, elija Otras ventanas y haga clic en Explorador de DSL. El Explorador de DSL solo es visible cuando el diagrama de definición de DSL es la ventana activa.

    2. Abra el ventana Propiedades y sitúelo para que pueda ver el Explorador de DSL y Propiedades al mismo tiempo.

    3. En el Explorador de DSL, expanda Editor, Pestañas del cuadro de herramientas, <su DSL> y, a continuación, Herramientas.

    4. Haga clic en ExampleElement. Este es el elemento del cuadro de herramientas que se usa para crear elementos.

    5. En la ventana Propiedades, cambie la propiedad Name a SearchButton.

      Observe que la propiedad Caption también cambia.

    6. De la misma manera, cambie el nombre de la herramienta ExampleConnector a ParentLink. Modifique la propiedad Caption para que no sea una copia de la propiedad Name. Por ejemplo, escriba Parent Link (Vínculo primario).

  3. Recompile el DSL.

    1. Guarde el archivo de definición de DSL.

    2. Haga clic en Transforme todas las plantillas en la barra de herramientas del Explorador de soluciones

    3. Presione F5. Espere hasta que aparezca la instancia de Visual Studio.

  4. En la solución Depuración de la instancia experimental de Visual Studio, abra un archivo de modelo de prueba. Arrastre los elementos hasta él desde el cuadro de herramientas. Observe que los subtítulos de la herramienta y los nombres de tipo en el Explorador de DSL han cambiado.

  5. Guarde el archivo de modelo.

  6. Abra un archivo .tt y reemplace las repeticiones del tipo antiguo y los nombres de propiedad por los nuevos nombres.

  7. Asegúrese de que el nombre de archivo especificado en el archivo .tt especifica el modelo de prueba.

  8. Guarde el archivo .tt. Abra el archivo generado para ver el resultado de ejecutar el código en el archivo .tt. Compruebe que es correcto.

Agregar propiedades de dominio a clases

Agregue propiedades a una clase de dominio, por ejemplo para representar los años de nacimiento y muerte de una persona.

Para que las nuevas propiedades sean visibles en el diagrama, debe agregar decoradores a la forma que muestra el elemento de modelo. También debe asignar las propiedades a los decoradores.

Para agregar propiedades y mostrarlas
  1. Agregue las propiedades.

    1. En el diagrama de definición de DSL, haga clic con el botón derecho en la clase de dominio Person, seleccione Agregar y, a continuación, haga clic en Propiedad de dominio.

    2. Escriba una lista de nombres de propiedades nuevos, como Birth y Death. Presione Introdespués de cada uno de ellos.

  2. Agregue decoradores que mostrarán las propiedades en la forma.

    1. Siga la línea gris que se extiende desde la clase de dominio Person al otro lado del diagrama. Se trata de un mapa de elementos de diagrama. Vincula la clase de dominio a una clase shape.

    2. Haga clic con el botón derecho en la clase shape, elija Agregar y haga clic en Text Decorator.

    3. Agregue dos decoradores con nombres como BirthDecorator y DeathDecorator.

    4. Seleccione cada nuevo decorador y, en el ventana Propiedades, establezca el campo Posición. Esto determina dónde se mostrará el valor de la propiedad de dominio en la forma. Por ejemplo, establezca InnerBottomLeft y InnerBottomRight.

      Compartment shape definition

  3. Asigne los decoradores a las propiedades.

    1. Abra la ventana DSL Details (Detalles de DSL). Normalmente se encuentra en una pestaña junto a la ventana Salida. Si no aparece, en el menú Ver, elija Otras ventanas y haga clic en Detalles de DSL.

    2. En el diagrama de definición de DSL, haga clic en la línea que conecta la clase de dominio Person a la clase shape.

    3. En Detalles de DSL, en la pestaña Asignaciones de Decorator, haga clic en la casilla de verificación de un decorador no asignado. En Display Property (Propiedad de visualización), seleccione la propiedad de dominio a la que desea asignarla. Por ejemplo, asigne BirthDecorator a Birth.

  4. Guarde el DSL, haga clic en Transformar todas las plantillas y presione F5.

  5. En un diagrama de modelo de ejemplo, compruebe que ahora puede hacer clic en las posiciones que eligió y escribir valores en ellos. Además, al seleccionar una forma Person, el ventana Propiedades muestra las nuevas propiedades Nacimiento y Muerte.

  6. En un archivo .tt, puede agregar código que obtenga las propiedades de cada persona.

    Family tree diagram, toolbox, and explorer

Definir nuevas clases

Puede agregar clases de dominio y relaciones a un modelo. Por ejemplo, podría crear una nueva clase para representar ciudades y una nueva relación para representar que una persona vivía en una ciudad.

Para que los diferentes tipos sean distintos en un diagrama de modelos, puede asignar las clases de dominio a diferentes tipos de formas o a formas con diferentes geometrías y colores.

Para agregar y mostrar una nueva clase de dominio
  1. Agregue una clase de dominio y haga que sea un elemento secundario de la raíz del modelo.

    1. En el diagrama de definición de DSL, haga clic en la herramienta Insertar relación, haga clic en la clase raíz FamilyTreeModel y, a continuación, haga clic en una parte vacía del diagrama.

      Aparece una nueva clase de dominio que está conectada a FamilyTreeModel con una relación de inserción.

      Establezca su nombre, por ejemplo, Town.

      Nota:

      Todas las clases de dominio, excepto la raíz del modelo, 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 incrustación. Por este motivo, con frecuencia es conveniente crear una clase de dominio mediante la herramienta Insertar relación.

    2. Agregue una propiedad de dominio a la nueva clase, por ejemplo Name.

  2. Agregue una relación de referencia entre Person y Town.

    1. Haga clic en la herramienta Relación de referencia, haga clic en Persona y, a continuación, en Ciudad.

      DSL definition fragment: family tree root

      Nota:

      Las relaciones de referencia representan referencias cruzadas de una parte del árbol de modelos a otra.

  3. Agregue una forma para representar ciudades en los diagramas del modelo.

    1. Arrastre una Geometry Shape del cuadro de herramientas al diagrama y cámbiele el nombre, por ejemplo TownShape.

    2. En el ventana Propiedades, establezca los campos Apariencia de la nueva forma, como Color de relleno y Geometría.

    3. Agregue un Decorador para mostrar el nombre de la ciudad y cámbielo NameDecorator. Establezca su propiedad Position.

  4. Asigne la clase de dominio Town a TownShape.

    1. Haga clic en la herramienta Asignación de elemento de diagrama, luego haga clic en la clase de dominio Town y en la clase de forma TownShape.

    2. En la pestaña Asignaciones de Decorator de la ventana Detalles de DSL con el conector de mapa seleccionado, active NameDecorator y establezca Display Property en Name (Nombre).

  5. Cree un conector para mostrar la relación entre Person y Towns.

    1. Arrastre un conector desde el cuadro de herramientas al diagrama. Cambie su nombre y establezca sus propiedades de apariencia.

    2. Use la herramienta Diagrama mapa de elementos para vincular el nuevo conector a la relación entre Person y Town.

      Family Tree definition with added shape map

  6. Cree una herramienta de elemento para crear una nueva ciudad.

    1. En el Explorador DSL, expanda Editor y, a continuación, Pestañas del cuadro de herramientas.

    2. Haga clic con el botón derecho en <su DSL> y, a continuación, haga clic en Agregar nueva herramienta de elementos.

    3. Establezca la propiedad Name de la nueva herramienta y establezca su propiedad Class en Town.

    4. Establezca la propiedad Icono del cuadro de herramientas. Haga clic en [...] y, en el campo Nombre de archivo, seleccione un archivo de icono.

  7. Cree una herramienta de conector para establecer un vínculo entre ciudades y personas.

    1. Haga clic con el botón derecho en <su DSL> y, a continuación, haga clic en Agregar nueva herramienta de conector.

    2. Establezca la propiedad Name de la nueva herramienta.

    3. En la propiedad ConnectionBuilder, seleccione el generador que contiene el nombre de la relación de Person-Town.

    4. Establezca el icono del cuadro de herramientas.

  8. Guarde la definición de DSL, haga clic en Transformar todas las plantillas y presione F5.

  9. En la instancia experimental de Visual Studio, abra un archivo de modelo de prueba. Utilice las nuevas herramientas para crear ciudades y vínculos entre ciudades y personas. Observe que solo puede crear vínculos entre los tipos correctos de elemento.

  10. Cree código que muestre la ciudad en la que vive cada persona. Las plantillas de texto son uno de los lugares donde puede ejecutar este código. Por ejemplo, podría modificar el archivo Sample.tt existente en la solución Depuración para que contenga el código siguiente:

    <#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #>
    <#@ output extension=".txt" #>
    <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #>
    
    <#
      foreach (Person person in this.FamilyTreeModel.People)
      {
    #>
        <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#>
    
    <#
          foreach (Person child in person.Children)
      {
    #>
                <#= child.Name #>
    <#
      }
      }
    #>
    
    

    Al guardar el archivo *.tt, creará un archivo subsidiario que contiene la lista de personas y sus residencias. Para más información, consulte Generar código a partir de lenguajes específicos de dominio.

Validación y comandos

Puede desarrollar este DSL aún más agregando restricciones de validación. Estas restricciones son métodos que puede definir, que se aseguran de que el modelo está en un estado correcto. Por ejemplo, podría definir una restricción para asegurarse de que la fecha de nacimiento de un niño sea posterior a la de sus padres. La característica de validación muestra una advertencia si el usuario DSL intenta guardar un modelo que interrumpe cualquiera de las restricciones. Para más información, consulte Validación en los lenguajes específicos de dominio.

También puede definir comandos de menú que el usuario puede invocar. Los comandos pueden modificar el modelo. También pueden interactuar con otros modelos en Visual Studio y con recursos externos. Para obtener más información, vea Procedimientos para modificar un comando de menú estándar.

Implementación del DSL

Para permitir que otros usuarios usen el lenguaje específico del dominio, distribuya un archivo de Visual Studio Extension (VSIX). Esto se crea al compilar la solución DSL.

Busque el archivo .vsix en la carpeta bin de la solución. Cópielo en el equipo en el que desea instalarlo. En ese equipo, haga doble clic en el archivo VSIX. El DSL se puede usar en todas las instancias de Visual Studio en ese equipo.

Puede usar el mismo procedimiento para instalar el DSL en su propio equipo para que no tenga que usar la instancia experimental de Visual Studio.

Para obtener más información, vea Implementación de soluciones de lenguaje específico de dominio.

Eliminación de los DSL experimentales antiguos

Si ha creado DSL experimentales que ya no desea, puede quitarlos del equipo restableciendo la instancia experimental de Visual Studio.

Esto quitará del equipo todas las DSL experimentales y otras extensiones experimentales de Visual Studio. Estas son extensiones que se han ejecutado en modo de depuración.

Este procedimiento no quita las DSL u otras extensiones de Visual Studio que se han instalado completamente ejecutando el archivo VSIX.

Restablecer la instancia Visual Studio Experimental

  1. 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.

  2. Vuelva a generar las DSL experimentales u otras extensiones experimentales de Visual Studio que quiera usar.