Что такое DSL и где я должен его использовать? - PullRequest
20 голосов
/ 03 сентября 2008

Я все больше и больше слышу о предметно-ориентированных языках и о том, как они меняют подход к бизнес-логике, и я видел сообщения в блоге Айенде и все такое, но я никогда действительно понял, почему я отказался от своей бизнес-логики от методов и ситуаций, которые я использую в своем провайдере.

Если у вас есть какой-то опыт использования этих вещей, есть шанс, что вы можете выразить это в терминах реальных дилетантов:

  • Что конкретно означает создание DSL?
  • Какие языки вы используете?
  • Где использовать DSL имеет смысл?
  • В чем преимущество использования DSL?

Ответы [ 7 ]

18 голосов
/ 03 сентября 2008

DSL хороши в ситуациях, когда вам нужно передать какой-то аспект контроля системы кому-либо еще. Я использовал их в правилах, где вы создаете простой язык, который менее понятным людям проще использовать для самовыражения, особенно в рабочих процессах.

Другими словами, вместо того, чтобы заставить их изучать Java:

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

Я могу написать DSL, который позволяет мне сказать:

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

Существуют и другие ситуации, но, по сути, везде, где вы можете использовать макроязык, сценарий рабочего процесса или разрешить настройку послепродажного обслуживания - все это кандидаты на DSL.

7 голосов
/ 03 сентября 2008

DSL означает Специфичный для домена язык , т.е. язык, разработанный специально для решения проблем в данной области. Например, Markdown (язык разметки, используемый для редактирования сообщений в SO) можно рассматривать как DSL.

Лично я нахожу место для DSL почти в каждом крупном проекте, над которым я работаю. Чаще всего мне нужен какой-то SQL-подобный язык запросов. Другое распространенное использование - системы на основе правил, вам нужен какой-то язык для определения правил \ условий.

DSL имеет смысл в контексте, где трудно описать \ решить проблему традиционными средствами.

4 голосов
/ 03 сентября 2008

Если вы используете Microsoft Visual Studio, вы уже используете несколько DSL - область разработки для веб-форм, winforms и т. Д. Является DSL. Class Designer - еще один пример.

DSL - это просто набор инструментов, которые (по крайней мере, теоретически) делают разработку в определенной «области» (то есть визуальный макет) более простой, интуитивно понятной и более продуктивной.

Что касается создания DSL, то некоторые вещи, о которых писали такие люди, как Айенде, связаны с «анализом текста» dsls, позволяющим разработчикам (или конечным пользователям) вводить «естественный текст» в приложение, которое анализирует текст и генерирует какой-то код или вывод на его основе.

Вы можете использовать любой язык для создания своего собственного DSL. Microsoft Visual Studio имеет множество точек расширяемости, а шаблоны и методы «Guidance Automation Toolkit» и Visual Studio SDK могут помочь вам добавить функциональные возможности DSL в Visual Studio.

2 голосов
/ 03 сентября 2008

К вашему сведению, книга по DSL находится в стадии разработки как часть серии подписей Мартина Фаулера.

Если он того же стандарта, что и другие книги серии, он должен быть хорошо прочитан.

Больше информации здесь

2 голосов
/ 03 сентября 2008

DSL - это базовые компиляторы для пользовательских языков. Хороший «бесплатный и открытый» инструмент для их разработки доступен по адресу ANTLR . Недавно я искал этот DSL для использования языка конечного автомата в новом проекте. Я согласен с Тимом Хоулендом (Tim Howland) выше, что они могут быть хорошим способом настройки вашего приложения кем-то другим.

1 голос
/ 03 сентября 2008

DSL - это просто причудливое имя и может означать разные вещи:

  • Rails (Ruby) иногда называют DSL, потому что он добавляет специальные методы (и переписывает некоторые встроенные тоже) для разговоров о веб-приложениях

  • ANT, синтаксис Makefile и т. Д. Также являются DSL, но имеют собственный синтаксис. Это то, что я бы назвал DSL.

Один важный аспект этой рекламы: имеет смысл думать о вашем приложении с точки зрения языка. О чем вы хотите поговорить в своем приложении? Это должны быть ваши классы и методы:

  1. Определите «язык» (либо реальный синтаксис, предложенный другими на этой странице, либо иерархию классов для вашего любимого языка), который способен выразить вашу проблему.
  2. Решите вашу проблему с помощью этого языка.
0 голосов
/ 03 сентября 2008

DSL в основном создает свой собственный маленький подъязык для решения конкретной проблемы домена. Это решается с помощью метода цепочки. Языки, где точки и круглые скобки являются необязательными, помогают сделать это выражение более естественным. Это также может быть похоже на шаблон строителя. DSL сами по себе не языки, а скорее шаблон, который вы применяете к своему API, чтобы сделать вызовы более понятными.

Одним из примеров является Guice, Руководство пользователя Guice http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 содержит дальнейшее описание того, как интерфейсы связаны с реализациями и в каких контекстах.

Другой распространенный пример - языки запросов. Например:

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

В реализации представьте, что каждый метод возвращает либо новый объект Query, либо только само его обновление. В любой момент вы можете завершить цепочку, используя, например, row (), чтобы получить все строки, или updateSomeField, как я делал выше. Оба вернут объект результата.

Я бы порекомендовал также взглянуть на приведенный выше пример Guice, поскольку каждый вызов там возвращает новый тип с новыми опциями. Хорошая IDE позволит вам завершить работу, давая понять, какие варианты у вас есть в каждой точке.

Редактировать: кажется, многие считают DSL новыми, простыми, специализированными языками со своими собственными анализаторами. Я всегда ассоциирую DSL как использование цепочки методов в качестве соглашения для выражения операций.

...