Что такое DSL и где его использовать?
Я слышу все больше о том, какие языки, связанные с доменом, возникают и как они меняют способ обработки бизнес-логики, и я видел Ayende сообщения в блоге и все, но я никогда не получал точно, почему я отвлек бы свою бизнес-логику от методов и ситуаций, которые я использую в своем провайдере.
Если у вас есть какой-то фон, использующий эти вещи, любой шанс, который вы могли бы поставить в реальных условиях:
- Что именно означает создание DSL?
- Какие языки вы используете?
- Где использование DSL имеет смысл?
- В чем преимущество использования DSL?
Ответы
Ответ 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 как использование цепочки методов как соглашение для выражения операций.