Подходящий синтаксис DSL - PullRequest
5 голосов
/ 19 августа 2010

Я пытаюсь написать собственный DSL для манипулирования файлами, просто ради обучения.

Моя цель - сделать его понятным и легким для кодирования.

Вот 3 варианта добавления строки в database.yml:

1. append("windows").to("database.yml")

2. append(string: "windows").to(file: "database.yml")

3. append_string("windows").to_file("database.yml")

4. append_string "windows", to_file: "database.yml"

5. append string: "windows", to_file: "database.yml"

Я немного растерялся во всех этих альтернативах.

Может ли кто-нибудь с опытом работы в DSL дать мне несколько советов и объяснить, какие плюсы и минусы есть у каждого?

Все читают одно и то же, но я хочу знать, какой из них следует передовой практике для СУХОГО и хорошего стандарта кодирования.

РЕДАКТИРОВАТЬ: Я думаю, что было бы хорошо, если бы я мог указать некоторые дополнительные параметры, например.

append(string: "windows").to(file: "database.yml", :force => true)

Итак, учитывая это, я думаю, что я должен использовать вызовы методов. Потому что, если я использую альтернативы 4-5, тогда, когда я укажу: force => true, я не могу знать, для строки это или для файла.

Ответы [ 5 ]

4 голосов
/ 19 августа 2010

Для меня любой вариант кажется подходящим.

Если вы (или пользователь) всегда пишете в «database.yml», но добавляемое содержимое отличается, следующее может лучше.

on "database.yml" {
    append "windows"
    append "ubuntsu"
    append "Leopard" 

    remove_if "bsd"  do |..|
         ....#if condition satisfied, "bsd" will be removed
    end
    ..
}

Если вы (или пользователь) хотите добавить «windowsmsgstr "всегда для разных файлов базы данных.(Может быть, редкий случай ,,)

append "windows".to {
    to "database.yml"
    to "database2.yml"
    to "database3.xml", :force=>true
}

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

3 голосов
/ 19 августа 2010

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

on 'database.yaml' do
  append 'windows'

  line 16 do
    indent 2.spaces
  end

  lines 3,6,7 do
    delete
  end
end

Это означает, что сначала вы определяете область действия (файл, строку, набор строк, блок и т. Д.), А затем набор операций для выполнения над ним. Но опять же, мы программисты, возможно, «средний пользователь» хотел бы использовать что-то более похожее на естественный язык, как вы начали.

3 голосов
/ 19 августа 2010

Лучший DSL, о котором я знаю, обычно заботится о типе для вас. Поэтому я бы не стал указывать тип добавляемого значения. Это исключило бы все альтернативы, которые включают слово «строка», и, возможно, также все альтернативы, которые включают слово «файл».

Лично мне нравятся эти:

append("windows").to("database.yml")
append("windows").to("database.yml", :force => true)

append "windows", :to => "database.yml"
append "windows", :to => "database.yml", :force => true

append "windows", :to_file => "database.yml" # if you really want "to_file"
append "windows", :to_file => "database.yml", :force => true # if you really want "to_file"

если я использую альтернативы 4-5, то когда я указать: сила => правда, я не могу знать если это для строки или файла.

Я не вижу в этом проблемы, необязательные параметры обычно нацелены на действие. Они не являются специфичными для строки или файла. Когда вы устанавливаете: force => true, вы форсируете добавление.

2 голосов
/ 19 августа 2010

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

Отличный код с простыми DSL благодаря Ruby

1 голос
/ 19 августа 2010

некоторые идеи:

with file('database.yaml') do |f|
  f.append file('additions.yaml')
  f.append 'somekey: true'
  f.move_to dir('/some/where')
  cpy = f.copy_to dir('some/where/else')
  f.delete
end
...