2010-08-19 59 views
5

我试图编写我自己的DSL文件操作,只是为了学习。适当的DSL语法

我的目标是让它易于理解和易于编码。

这里是追加字符串到database.yml的3个备选方案:

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经验的人给我一些指导并解释每个人的优缺点?

每个人都阅读相同,但我想知道哪一个遵循DRY和良好编码标准的最佳实践。

编辑:我认为这将是很好,如果我可以指定一些可选参数,例如。

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

所以考虑到这一点,我想我必须使用方法调用。因为如果我使用替代方案4-5,那么当我指定:force => true时,我无法知道它是否适用于字符串或文件。

+0

@musicfreak。他们所有人的阅读都一样。我想下一个问题是哪一个遵循DRY的“最佳实践”。 – 2010-08-19 06:13:36

+1

也许你应该指定域:谁是目标用户,你想要什么样的文件操作,你的'DSL'的范围是什么? – David 2010-08-19 09:29:14

回答

4

对我来说,任何选项似乎都很好。

如果您(或用户)总是写入“database.yml”但附加内容不同, 以下可能会更好。

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

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

如果您(或用户)要追加的“窗口”始终是不同的数据库文件, 以下可能会被罚款。(也许极少数情况下,,)

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

无论如何,我认为更好的选择是自己使用它,或者问你的用户,然后细化。

3

我知道的最好的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时,你迫使追加。

+0

变体3-6看起来好像文件名是可选的,这似乎不是一个好主意。 – 2010-08-19 08:25:04

+0

实际上,这个页面上提出的替代方案都没有强制用户设置目标文件。我认为这是DSL的问题之一:你不能确保用户正确地说出语言,因为你无法确定Stack Overflow用户会正确地说英语...... – David 2010-08-19 08:33:23

+1

如果你看看Cucumber的DSL,对象。 property.should ==“something”,“=='something'”可以看起来单独。但是,如果在应对之后没有任何东西,这句话似乎就不正确。与尝试将某些文本附加到任何内容时的句子看起来不正确一样。 – David 2010-08-19 08:35:55

3

我认为这一切都取决于你想如何使用你的DSL。这似乎是合理的人会愿意在一个运行一个单一的文件进行多种选择,因此,或许你可以考虑像

on 'database.yaml' do 
    append 'windows' 

    line 16 do 
    indent 2.spaces 
    end 

    lines 3,6,7 do 
    delete 
    end 
end 

含义,首先你定义范围(文件,行,一组行,块等),然后执行一组操作。但是,再次,我们是程序员,或许“普通用户”想要使用更像自然语言的东西,就像您已经开始的那样。

2

我写DSL昨日一篇博客文章,它不会回答你的文件系统特定的DSL的问题,但它应该为你提供足够的信息来

Slick code with simple DSLs thanks to Ruby

+0

伟大的职位!虐待书签!阻止[email]与yield(email)相同吗? – 2010-08-19 14:59:27

+0

+1非常棒的链接 – 2012-03-06 21:12:48

1

一些想法的决定:

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