Что отличает Ruby DSL от обычного API

Каковы некоторые определяющие характеристики Ruby DSL, которые отличают его от обычного API?

12.10.2009 23:45:49
Miles 19.10.2009 09:47:43
6 ОТВЕТОВ
РЕШЕНИЕ

Когда вы используете API, вы создаете экземпляры объектов и вызываете методы обязательным образом. С другой стороны, хороший DSL должен быть декларативным и представлять правила и отношения в вашей проблемной области, а не инструкции, которые нужно выполнить. Более того, в идеале DSL должен быть читаемым и изменяемым кем-то, кто не является программистом (что не относится к API).

Также имейте в виду различие между внутренними и внешними DSL.

  • Внутренний предметно-ориентированный язык встроен в язык программирования (например, Ruby). Это легко реализовать, но структура DSL зависит от родительского языка, в который он встроен.
  • Специфичный для внешнего домена язык - это отдельный язык, разработанный с учетом конкретного домена. Это дает вам большую гибкость, когда дело доходит до синтаксиса, но вы должны реализовать код для его интерпретации. Это также более безопасно, так как человек, редактирующий правила домена, не имеет доступа ко всем возможностям родительского языка.
11
19.10.2009 09:52:19
+1 за различие между внутренним и внешним DSL.
ctford 19.10.2009 11:52:20
Спасибо за награду, теперь я чувствую себя как Боба Фетт: P
Adam Byrtek 20.10.2009 21:21:15

DSL (предметно-ориентированный язык) - это чрезмерно раскрученный термин. Если вы просто используете подмножество языка (скажем, Ruby), чем он отличается от оригинала? Ответ таков.

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

4
13.10.2009 00:00:58
Так что, если я переопределю <<оператор, чтобы сделать что-то другое, чем то, что он обычно делает на обычном объекте в Ruby, это «новый синтаксис»? Или это только новый синтаксис, если он никогда раньше не встречался ни на одном языке?
Chuck 13.10.2009 01:56:47
Ну, я не думаю, что синтаксис должен быть совершенно новым, чтобы удовлетворить требования для нового DSL. Я должен признать, что нет единого мнения о том, достаточно ли просто перегрузки операторов для создания DSL, особенно когда вы застряли с существующими правилами приоритетов и другими проблемами (например, семантикой оценки короткого замыкания || и && в C ++).
cdiggins 13.10.2009 13:42:52
Полностью согласен с этим. Проблема в том, что вы найдете много людей, которые абсолютно уверены, что у них есть четкое определение того, что делает DSL, но никто из них не согласен! На практике вещи более или менее DSL-ы, с языками вроде Ruby и Lisp, поддерживающими стиль, а языки вроде Java делают его чертовски невозможным.
gtd 16.10.2009 18:28:24
Термин «DSL» широко используется в контексте Ruby. Синтаксис Ruby очень гибкий, поэтому он позволяет писать API, внешне смутно напоминающие английские предложения. Это обычно и неуместно называют «DSL», но это не DSL в строгом техническом смысле, это просто набор умно названных методов и переменных, написанных на обычном Ruby. Нового синтаксиса не существует, поэтому новый «язык» не разрабатывается. Настоящий DSL требует умения создавать синтаксические правила, например, с помощью генератора синтаксических анализаторов или макросов Lisp.
Paul Legato 30.05.2010 08:30:35

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

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

2
13.10.2009 00:01:04

Создание DSL:

  • Добавление новых методов в класс Object, чтобы вы могли просто вызывать их, как если бы они были встроенными языковыми конструкциями. (см. грабли)

  • Создание методов для пользовательского объекта или набора объектов, а затем наличие файлов сценариев запускают операторы в контексте объекта верхнего уровня. (см. Капистрано)

API дизайн:

  • Создание методов для пользовательского объекта или набора объектов, поэтому пользователь создает объект для использования методов.

  • Создание методов как методов класса, так что пользователь ставит префикс имени класса перед всеми методами.

  • Создание методов в виде смеси, которую пользователи включают или расширяют для использования методов в своих пользовательских объектах.

Так что да, грань между ними тонкая. Преобразовать пользовательский набор объектов в DSL тривиально, добавив один метод, который запускает файл сценария в нужном контексте.

2
13.10.2009 01:53:12

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

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

1
19.10.2009 11:48:27

На самом деле это одно и то же. DSL, как правило, реализуются с помощью обычных языковых механизмов в Ruby, поэтому технически они все API.

Однако, чтобы люди распознавали что-то как DSL, обычно добавляется то, что выглядит как декларативные операторы к существующим классам. Что-то вроде валидаторов и объявлений отношений в ActiveRecord.

class Foo << ActiveRecord::Base
  validates_uniqueness_of :name
  validates_numericality_of :number, :integer_only => true

end

выглядит как DSL, а следующее нет:

class Foo <<ActiveRecord::BAse
  def validate
    unless unique? name
      errors.add(:name, "must be unique")
    end

    unless number.to_s.match?(/^[-]?\d$/)
      errors.add(:number, "must be an integer")
    end
  end
end

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

1
19.10.2009 16:21:15