Подтвердить что ты не робот

Что такое DSL и где его использовать?

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

Если у вас есть какой-то фон, использующий эти вещи, любой шанс, который вы могли бы поставить в реальных условиях:

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

Ответ 1

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
}

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Дополнительная информация здесь

Ответ 6

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

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

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

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

  • Определите "язык" (либо настоящий синтаксис, предложенный другими на этой странице, либо иерархию классов для вашего любимого языка), способный выразить вашу проблему.
  • Решите свою проблему с точки зрения этого языка.

Ответ 7

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

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

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

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

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

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

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