为什么Ruby on Rails称为特定于域的语言?

时间:2010-05-12 19:14:25

标签: ruby-on-rails dsl

最近,当我试图解释为什么Ruby on Rails是我组织实习生的特定领域语言(DSL)时,我无法清楚地表达我想要的效果。也许我不太了解这个空间来教导细微差别。将他重定向到Martin Fowler'article或谷歌排名第一的InfoQ或其他材料也没有多大帮助。

有人可以解释为什么Rails是一个具有示例/并行情况的DSL,对于那些对代码世界来说相当新的人来说,这不是巫毒的东西吗?理解意识形态也可能有助于详细阐述铁路生态系统的复杂性?

5 个答案:

答案 0 :(得分:13)

从技术上讲,ruby不是DSL,它只是非常干净地编写内部DSL。 This link对马丁的福勒博客维基应该有助于澄清事情。

Rails被描述为DSL虽然我更准确地认为它是一个很好地利用一些DSL的框架。

编辑:intro to the public version of Martin Fowler's DSL book有一个激励性的例子,虽然它仍然针对程序员更多。

再次编辑:如果你指出ruby允许ruby代码看起来像

,那么“voodoo”示例会非常有用
port 2001

respond :resource=>"/hello" do  |request, response|
  response.body = "<message>hello</message>"
end

比直接调用方法更干净。实现DSL可能需要像代码一样的“voodoo”(创建DSL比使用DSL更难很多),而且一般来说,编码相对较新的人应首先担心DSL的功能而不是太多如何实施。

什么让ruby擅长内部DSL包括(1)使用块(任何具有干净闭包的语言都有这个优势),(2)不需要括号的方法类,以及(3)修改类的能力飞(这是validates所做的)。可能还有更多我没有想过的。

答案 1 :(得分:5)

Ruby是一种可用于创建DSL的语言。 Ruby on Rails可以被认为是用于创建Web应用程序的DSL(域特定语言)。

答案 2 :(得分:4)

Ruby肯定不是DSL。它是一种通用语言,与DSL相反。然而,它是一种非常适合作为内部式DSL主机的语言。那是;您可以使用Ruby来创建带有。

的DSL

答案 3 :(得分:0)

使用Capybara testing "DSL"时,我问过自己同样的问题。 在我看来,当将诸如Rails之类的Ruby框架称为DSL时,该术语就被误认为了。因此,您的问题的答案将是:由于Ruby程序员的行话,它被称为DSL。

为公平起见,按照Martin Fowler的建议(请参阅here),我们可以将这些框架称为内部DLS (用于特定目的的通用语言的子集)。但我认为框架的概念在概念上并没有很多区别。

Ruby独特的语法灵活性似乎使以某种样式编写的框架看起来像是一种全新的语言(尽管非常简单)。就个人而言,我不会称呼任何没有特定语法或只是通用语言的子集的领域特定语言(您可以在this answer on SO中看到对此的一些支持)。

答案 4 :(得分:-1)

我不太明白这个问题。 Ruby不是领域特定语言,它是一种通用语言。将它称为DSL是没有意义的,因为它不是一个。因此,问题的整个前提是没有意义的。