theory - redes - que significan las siglas dsl y como funciona
¿Qué es un DSL y dónde debería usarlo? (7)
Si utiliza Microsoft Visual Studio, ya está utilizando múltiples DSL: la superficie de diseño para formularios web, formularios de win, etc. es una DSL. El Diseñador de clases es otro ejemplo.
Un DSL es solo un conjunto de herramientas que (al menos en teoría) hacen que el desarrollo en un "dominio" específico (es decir, diseño visual) sea más fácil, más intuitivo y más productivo.
En cuanto a la construcción de una DSL, algunas de las cosas sobre las que ha escrito Ayende están relacionadas con "dsls de análisis de texto", permitiendo a los desarrolladores (o usuarios finales) ingresar "texto natural" en una aplicación que analiza el texto y genera algún tipo de de código o salida basada en él.
Puede usar cualquier idioma para construir su propia DSL. Microsoft Visual Studio tiene muchos puntos de extensibilidad, y los patrones y prácticas "Guidance Automation Toolkit" y Visual Studio SDK pueden ayudarlo a agregar funcionalidad DSL a Visual Studio.
Cada vez escucho más acerca de los lenguajes específicos de los dominios y cómo cambian la forma en que tratas la lógica de negocios, y he visto las publicaciones de Ayende en el blog y cosas, pero nunca he entendido exactamente por qué tomaría mi negocio lógica lejos de los métodos y situaciones que estoy usando en mi proveedor.
Si tienes algún trasfondo usando estas cosas, cualquier posibilidad de que puedas ponerlo en términos reales para los legos:
- ¿Qué significa exactamente construir DSLs?
- ¿Qué idiomas estás usando?
- Donde usar un DSL tiene sentido?
- ¿Cuál es el beneficio de usar DSL?
DSL básicamente está creando su propia sublengua pequeña para resolver un problema de dominio específico. Esto se resuelve usando el método de encadenamiento. 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 de generador. DSL no son idiomas en sí mismos, sino más bien un patrón que aplica a su API para que las llamadas sean más fáciles de entender.
Un ejemplo es Guice, Guice Users Guide http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 tiene una descripción más detallada de cómo las interfaces están vinculadas a las implementaciones y en qué contextos.
Otro ejemplo común es para los lenguajes de consulta. Por ejemplo:
NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")
En la implementación, imagine cada método devolviendo un nuevo objeto Query o simplemente esta actualización internamente. En cualquier punto, puede finalizar la cadena utilizando, por ejemplo, rows () para obtener todas las filas, o updateSomeField como he hecho anteriormente aquí. Ambos devolverán un objeto resultante.
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 le permitirá completar, dejando en claro qué opciones tiene en cada punto.
Editar: parece que muchos consideran DSL como nuevos lenguajes de propósito único con sus propios analizadores. Siempre asocie DSL como el método de encadenamiento como una convención para expresar operaciones.
DSL son compiladores básicos para idiomas personalizados. Una buena herramienta ''libre y abierta'' para desarrollarlos está disponible en ANTLR . Recientemente, he estado viendo esta DSL para un uso de lenguaje de máquina de estado en un nuevo proyecto. Estoy de acuerdo con Tim Howland de arriba, que pueden ser una buena manera de dejar que otra persona personalice su aplicación.
Los DSL son buenos en situaciones en las que necesitas darle algún aspecto del control del sistema a otra persona. Los he usado en Rules Engines, donde se crea un lenguaje sencillo que es más fácil de usar para la gente menos técnica, especialmente en flujos de trabajo.
En otras palabras, en lugar de hacer que aprendan 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 permite decir:
for (document : documents) {
if (document is unread) {
document.sendReminder
}
Hay otras situaciones, pero básicamente, en cualquier lugar en el que desee utilizar un lenguaje de macros, crear secuencias de comandos para un flujo de trabajo o permitir la personalización en el mercado secundario, todos estos son candidatos para DSL.
Para su información, se está preparando un libro sobre DSL como parte de la serie de firmas de Martin Fowler.
Si es del mismo estándar que los otros libros de la serie, debería ser una buena lectura.
Más información aquí
DSL es solo un nombre elegante y puede significar cosas diferentes:
Rails (lo de Ruby) a veces se llama DSL porque agrega métodos especiales (y sobrescribe algunos incorporados también) 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 hype: 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 tus clases y métodos:
- Defina un "idioma" (ya sea una sintaxis real como la propuesta por otros en esta página o una jerarquía de clases para su idioma favorito) que sea capaz de expresar su problema.
- Resuelve tu problema en términos de ese idioma.
DSL significa Idioma Específico del Dominio, es decir, un lenguaje diseñado específicamente para resolver problemas en un área determinada.
Por ejemplo, Markdown (lenguaje de marcado usado para editar publicaciones en SO) se puede considerar como DSL.
Personalmente, encuentro un lugar para DSL casi en cada gran proyecto en el que estoy trabajando. 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 el problema por medios tradicionales.