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

StackOverflow https://stackoverflow.com/questions/41724

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Решение

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.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top