Pregunta

Escucho cada vez más sobre los lenguajes específicos de dominio que se utilizan y cómo cambian la forma en que se trata la lógica empresarial, y he visto Publicaciones del blog de Ayende y cosas así, pero nunca entendí exactamente por qué quitaría mi lógica de negocios de los métodos y situaciones que estoy usando en mi proveedor.

Si tiene experiencia en el uso de estas cosas, existe la posibilidad de que pueda expresarlo en términos reales y sencillos:

  • ¿Qué significa exactamente construir DSL?
  • ¿Qué idiomas estás usando?
  • ¿Dónde tiene sentido utilizar un DSL?
  • ¿Cuál es el beneficio de utilizar DSL?
¿Fue útil?

Solución

Los DSL son buenos en situaciones en las que necesitas ceder algún aspecto del control del sistema a otra persona.Los he usado en Rules Engines, donde se crea un lenguaje simple que es más fácil de usar para personas menos técnicas para expresarse, particularmente en flujos de trabajo.

En otras palabras, en lugar de hacerles aprender java:

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
    ReminderService.sendUnreadReminder(myDoc)
}

Puedo escribir un DSL que me permita decir:

for (document : documents) {
if (document is unread) {
 document.sendReminder
}

Hay otras situaciones, pero básicamente, en cualquier lugar donde desee utilizar un lenguaje de macros, crear un script para un flujo de trabajo o permitir una personalización posventa, todos estos son candidatos para DSL.

Otros consejos

ADSL representa Idioma específico del dominio es decir.Lenguaje diseñado específicamente para resolver problemas en un área determinada.
Por ejemplo, Markdown (lenguaje de marcado utilizado para editar publicaciones en SO) puede considerarse como un DSL.

Personalmente encuentro un lugar para DSL en casi todos los proyectos grandes en los que trabajo.La mayoría de las veces necesito algún tipo de lenguaje de consulta similar a SQL.Otro uso común son los sistemas basados ​​en reglas; necesita algún tipo de lenguaje para especificar reglas/condiciones.

DSL tiene sentido en un contexto donde es difícil describir/resolver problemas por medios tradicionales.

Si usa Microsoft Visual Studio, ya está usando múltiples DSL: la superficie de diseño para formularios web, winforms, etc.es un ADSL.El Diseñador de clases es otro ejemplo.

Un DSL es sólo un conjunto de herramientas que (al menos en teoría) hacen que el desarrollo en un "dominio" específico (es decir,diseño visual) más fácil, más intuitivo y más productivo.

En cuanto a la creación de un DSL, algunas de las cosas sobre las que personas como Ayende han escrito están relacionadas con el "análisis de texto" dsls, que permite a los desarrolladores (o usuarios finales) ingresar "texto natural" en una aplicación, que analiza el texto y genera algún tipo de código o salida basada en él.

Puede utilizar cualquier idioma para crear su propio DSL.Microsoft Visual Studio tiene muchos puntos de extensibilidad y los patrones y prácticas "Kit de herramientas de automatización de guiado" y SDK de Visual Studio puede ayudarle a agregar funcionalidad DSL a Visual Studio.

DSL son compiladores básicos para lenguajes personalizados.Una buena herramienta 'gratuita y abierta' para desarrollarlos está disponible en antlr.Recientemente, he estado mirando este DSL durante un lenguaje de máquina de estados utilizar en un nuevo proyecto.Estoy de acuerdo con Tim Howland anteriormente en que pueden ser una buena manera de permitir que otra persona personalice su aplicación.

Para su información, se está preparando un libro sobre DSL como parte de la serie exclusiva de Martin Fowler.

Si tiene el mismo nivel que los otros libros de la serie, debería ser una buena lectura.

Más información aquí

DSL es sólo un nombre elegante y puede significar cosas diferentes:

  • Rails (lo de Ruby) a veces se llama DSL porque agrega métodos especiales (y también sobrescribe algunos integrados) para hablar sobre aplicaciones web.

  • ANT, sintaxis Makefile, etc.También son DSL, pero tienen su propia sintaxis.Esto es lo que yo llamaría DSL.

Un aspecto importante de este revuelo:Tiene sentido pensar en su aplicación en términos de un idioma.¿De qué quieres hablar en tu aplicación?Estas deberían ser entonces tus clases y métodos:

  1. Defina un "lenguaje" (ya sea una sintaxis real propuesta por otros en esta página o una jerarquía de clases para su idioma favorito) que sea capaz de expresar su problema.
  2. Resuelve tu problema en términos de ese idioma.

DSL consiste básicamente en crear su propio sublenguaje pequeño para resolver un problema de dominio específico.Esto se resuelve mediante el encadenamiento de métodos.Los idiomas donde los puntos y los paréntesis son opcionales ayudan a que estas expresiones parezcan más naturales.También puede ser similar a un patrón constructor.DSL no son lenguajes en sí mismos, sino más bien un patrón que aplica a su API para que las llamadas se expliquen por sí mismas.

Un ejemplo es Guice, Guía del usuario de Guice http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 tiene una descripción más abajo de cómo las interfaces están vinculadas a las implementaciones y en qué contextos.

Otro ejemplo común es el de los lenguajes de consulta.Por ejemplo:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")

En la implementación, imagine que cada método devuelve un nuevo objeto Query o simplemente se actualiza internamente.En cualquier punto, puede terminar la cadena usando, por ejemplo, filas() para obtener todas las filas, o actualizarSomeField como lo hice arriba aquí.Ambos devolverán un objeto de resultado.

También recomendaría echar un vistazo al ejemplo de Guice anterior, ya que cada llamada devuelve un nuevo tipo con nuevas opciones.Un buen IDE te permitirá completar, dejando claro qué opciones tienes en cada punto.

Editar:Parece que muchos consideran los DSL como lenguajes nuevos, simples y de un solo propósito con sus propios analizadores.Siempre asocio DSL con el uso de encadenamiento de métodos como convención para expresar operaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top