`
taowen
  • 浏览: 193927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RoR 与 Ruby DSL

阅读更多
最近几天来一直都在思考Ruby的成功,以及其对J2EE的借鉴意义。今天终于想明白一些事情了,所以到这里说两句。首先我看到的现象是RoR和Ruby DSL都利用一切可能手段(method missing,closure……)来提升语法的表达力,让它看起来更像声明性的语句,而不是深入细节的如何去做的具体描述。而且我看到为了达到这个目的,背后的实现是会很复杂的。而且某些技巧是等价于或者就是元编程的。对于元编程,我是一直比较反对的。因为总觉得这样的东西超出了人类大脑的掌控能力,至少超出了我的掌控能力。但是在看过一些RoR的代码之后,我改变了这个想法。复杂的实现带来的简单语法是有价值的。它可以让你更轻松地完成每天的工作,让框架用户的代码变得更干净整洁。这些都非常有价值。而且。。。也是非常经济的。RoR的一个团队,完成了所有的脏活累活,他们为了把一个语法变得很好看,可能要花费比简单实现多上十倍的时间,但是只要节约了每个用户哪怕1%的时间,按照1:100的比例来算,那也是值得的了。RoR用户越多,带来的经济价值就越大。但是。。。这是因为RoR是框架。框架意味着大部分使用者是不用关心其事先的,不用维护其实现的,而且只要按照文档教程上说的那样写,就错不了。因为用户和框架作者是通过“契约”来沟通的。这种契约是API,是“语法”。只要有人来保证这些契约,我作为一个用户来说,压根不用去管背后的琐事。而且有一个社区帮助我来学习这个契约的具体含义,帮助我确认哪些是我用错了,哪些是框架本身的bug,并且有人升级修复框架本身。这样的话,我当然希望这个契约越简单越好,越有表达力越好。我不管你是用OO实现的,还是用代码生成实现的,咋弄都行。
但是要是把RoR的相同做法(各种各样的语言技巧)搬到你的项目中来,那就是另外一回事了。你写的代码不再是在开源的框架代码了。当你不是开源的代码时,你的团队和继任者必须负责在项目整个生命周期中维护它。当你不是框架代码时,你的用户就只是你自己,没有1:100这样的加成经济效益。这个时候,再去用复杂的实现来换取字面上的表达力是否值得就是一个问题了。我认为,大部分情况下是不值得的。原因很简单,不够经济。投入和产出效益不成正比。Ruby DSL如果应用在企业内部项目上,就是这么一个样子。你得在背后把简单的事情做复杂,才能把语法整得很好看。但是最终并没有带来什么价值。你可能会说,做业务的人更好理解代码了。问题是,做业务的会来读代码甚至写代码。当然还有很多其他的论点可以支持有价值的理论。但是,我至少个人对把Ruby在RoR的表达力复制倒企业内部的终端应用程序上来持怀疑态度。但是,对应用RoR,利用RoR的良好表达力是举双手赞成的。
那么关于Ruby这种动态语言来说。我是不是能说它是框架作者的最爱。因为它给了DHH闹腾的余地。不然让DHH到Java中来,只怕不会比Rod Johnson高明多少。但是,在终端应用中使用Ruby,必须制定一些纪律来保证团队成员没有把简单事情搞复杂了。不然必然会导致投入多,产出少,难维护的局面。
结论是,写框架和写应用思路是不同的,对于价值的衡量也不同。框架作者想的是怎么让用户尽可能简单。应用的开发人员想的不仅是怎么让自己的日常工作尽可能的简单,还要考虑项目整个生命周期的维护成本。所以,RoR作为一个框架来说,非常优秀。相同技巧用来开发程序自己使用的DSL来说,未必经济。除非你能证明,复杂性带来的表达力正是你和你的Stake Holder所需要的。
分享到:
评论
14 楼 taowen 2006-12-08  
whisper 写道
泛函那可是优雅的难以置信
ruby中似乎也没对算子这样的东西有什么像样的支持
可是容易终归不是什么坏事
尤其是他确实能完成你的工作时
有时觉得一千行代码比完成同样功能的一百行代码更省事
那是因为我们的头脑还不够优雅

那得建立在为了这100行优雅的代码,你没有引入1000行dirty的代码来让那100行优雅的代码成为可能的前提下。有人帮你写那1000行dirty的代码,何乐而不为呢。要是都得自己维护,我宁愿使用ruby最基本的语言设施,而不去搞tricky的东西。
13 楼 whisper 2006-12-08  
泛函那可是优雅的难以置信
ruby中似乎也没对算子这样的东西有什么像样的支持
可是容易终归不是什么坏事
尤其是他确实能完成你的工作时
有时觉得一千行代码比完成同样功能的一百行代码更省事
那是因为我们的头脑还不够优雅
12 楼 dongbin 2006-12-08  
全是高科技啊,看来我要回家好好学习了!
11 楼 charon 2006-12-07  
taowen 写道

组合数学貌似比近世代数简单。教俺近世代数的老师酷得不行,可惜俺就是没学会。。。

hehe. 俺也没学会。但俺的一个师兄近世代数和泛函都非常好。
学组合数学只要会数数有耐心就可以了,问题都相对具体一点,容易触类旁通。而近世代数需要非常好的抽象能力,一般人受不了,我也就是前半个学期还跟得上,后面的都跑飞了.
10 楼 taowen 2006-12-07  
charon 写道
taowen 写道

Higher Order Function就是复合函数啊,元编程是一个函数接收另外一个函数做参数,根据这个参数产生另外一个函数。这不是泛函中的算子么?泛函理论对比函数的理论,要复杂得多。


应该说也只有在概念上,元编程才和泛函有点关系,计算机系出身的去学泛函本身就不多,基本上也没什么好果子吃,电子工程和自控的多一些吧。相比之下,近世代数(抽象代数)更贴近一些(群环域之类的玩起来还好理解一些,至少还是组合数学的基础)。
不过,这两门课对开启思路还是很有好处的,特别是泛函分析,对学过谓词演算的还是很有启发。

组合数学貌似比近世代数简单。教俺近世代数的老师酷得不行,可惜俺就是没学会。。。
但是至少可以用泛函的复杂来说明操作函数的函数一般比操作值的函数要复杂。所以我推论出了元编程一般比常规编程复杂。
9 楼 charon 2006-12-07  
taowen 写道

Higher Order Function就是复合函数啊,元编程是一个函数接收另外一个函数做参数,根据这个参数产生另外一个函数。这不是泛函中的算子么?泛函理论对比函数的理论,要复杂得多。


应该说也只有在概念上,元编程才和泛函有点关系,计算机系出身的去学泛函本身就不多,基本上也没什么好果子吃,电子工程和自控的多一些吧。相比之下,近世代数(抽象代数)更贴近一些(群环域之类的玩起来还好理解一些,至少还是组合数学的基础)。
不过,这两门课对开启思路还是很有好处的,特别是泛函分析,对学过谓词演算的还是很有启发。
8 楼 taowen 2006-12-07  
pilipala 写道
呵呵 教训不敢啊

我也是最近开始学的,只是看到帖子随便说了几句,是不是用词太激烈了,那就不好意思喽

个人觉得元编程的难度要比范函小多了吧,
也不知道: “泛函分析是元编程的数学基础,”
倒是愿闻其详

我倒觉得,如果是学习一门语言,编译原理的基础似乎是更有帮助些。

Higher Order Function就是复合函数啊,元编程是一个函数接收另外一个函数做参数,根据这个参数产生另外一个函数。这不是泛函中的算子么?泛函理论对比函数的理论,要复杂得多。
编译器做的就是元编程。因为它要把高级语言表达的函数转化为机器码表达的函数。毫无疑问,投入工业使用的编译器的实现都是很复杂的。但是我们会关心编译器是不是把我们的语言编译对了么?会去了解其中怎么做的么?不会吧。正是因为编译器做的是元编程,所以它能够支持其上的语言。在Ruby内部要嵌入DSL,必然需要对应的东西在背后做元编程。Ruby提供了强大的动态元编程的能力,为其嵌入DSL奠定了基础。所以可以把RoR理解为Ruby内部的编译器,编译的是其支持的DSL,给WEB开发人员用的DSL。只要信任RoR的质量,把RoR当作一种DSL的编译器来看,我们就不用去关心其内部实现。但是如果这DSL是你自己发明,要你自己维护的话,那么复杂性的代价就要自己承受了。另外把RoR当作编译器来看,它也要遵守编译器的一些行为准则,包括对于调试的支持,良好的出错信息,统一的语言习惯。正是这些准则没有做到,使得C++的模板元编程只是天才的游乐场。
7 楼 pilipala 2006-12-07  
呵呵 教训不敢啊

我也是最近开始学的,只是看到帖子随便说了几句,是不是用词太激烈了,那就不好意思喽

个人觉得元编程的难度要比范函小多了吧,
也不知道: “泛函分析是元编程的数学基础,”
倒是愿闻其详

我倒觉得,如果是学习一门语言,编译原理的基础似乎是更有帮助些。
6 楼 inosin 2006-12-07  
5 楼 taowen 2006-12-07  
pilipala教训的是。小弟工作半年刚满,对于很多问题还一知半解呢。元编程不曾练习不多,在MASM上做过一个OOP的汇编实现,基础是把MASM的宏抽象成一个汇编期的图灵完全语言,另外也曾目睹了模板元编程那一夏的狂热。元编程的数学基础,泛函分析倒是曾经把我折磨得够呛。
我的观点就是Ruby的“抽象整理”,体现在RoR优美的语法上的那部分,已经超出了OO的范围。对于其使用的这些元编程技巧的具体实现。我仍然觉得是难度颇高的。无论是从设计的角度还是阅读维护的角度来说。我要强调的只有一个问题,那就是成本问题。我考虑问题的角度就是一个,经济的角度。我认为RoR是“好”的,是因为它能够从用户的使用中收回开发人员的投入。我认为在封闭的,内部的,面向具体问题的企业内部应用当中,应用类似RoR的元编程技巧是“不好”的,是因为没有明显的证据表明其经济价值。所以我不是对Ruby DSL开炮,我是对在“特定应用领域”内的Ruby DSL开炮。RoR就是一种值得大力提倡的Ruby DSL。
4 楼 pilipala 2006-12-07  
1
引用
元编程超出了人类大脑的掌控能力

  我想你太低估大脑的潜力了,多练习练习吧,元编程并不复杂

2
引用
他们为了把一个语法变得很好看,可能要花费比简单事先多上十倍的时间

  如果你再多了解ruby一些,你就会明白,他们为了这个根本不需要花费多上十倍的时间。

3
引用
写框架和写应用思路是不同的,对于价值的衡量也不同。框架作者想的是怎么让用户尽可能简单。应用的开发人员想的是怎么让自己的日常工作尽可能的简单。所以,RoR作为一个框架来说,非常优秀。相同技巧用来开发程序自己使用的DSL来说,未必经济。

  写框架和写应用其实没有什么不同, rails也是从DHH写的应用中形成的一套框架。如果你认为自己只是写应用的,那么应该思考为什么自己不能写框架。也许,应用设计者和框架设计者的不同在于,是否可以从自己的工作中,抽象整理出,经常重复,可复用的部分。 而我觉得这个只和个人的能力有关。而ruby做得只是让这种抽象整理工作更简单易行。

结论是:楼主需要考虑的是 如何好好提高一下个人的能力了。
3 楼 lixigua 2006-12-07  
好像上面两位说的跟搂住想表达的不搭界。
2 楼 mafa 2006-12-06  
喜欢——就去用!
1 楼 canonical 2006-12-06  
这种说法是不正确的. 良好的设计是同时降低了构造的成本和使用的成本。一个复杂的系统本身不是一蹴而就的,它也有一个逐步构造的过程。如果只是提供使用上的方便,那只是一种无聊的技巧而已。

相关推荐

    excel lib ror ruby

    RoR是一个流行的开源Web开发框架,而Ruby语言本身支持与Microsoft Excel文件交互,这在数据导入导出、报表生成等场景中非常有用。 描述虽然简洁,但我们可以推断出它可能是指如何在Ruby中利用库来读取、写入或操作...

    ROR介绍演讲课件 ruby on rails

    Ruby on Rails,简称RoR,是由David Heinemeier Hansson基于Ruby语言开发的一款开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性,使得开发者能够更快速地构建功能丰富的web...

    RoR性能优化经验谈

    在Web服务器选择上,Lighttpd被推荐为RoR应用的理想选择,因为它与应用服务器的通信进行了优化。Lighttpd在完全接收POST数据后才一次性转发,同时在接收应用服务器响应时也不限制Buffer大小,从而减少了应用服务器的...

    ROR绿色最新环境(2013/3/10)

    ROR环境 Ruby version 1.9.3 (java) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.12 JavaScript Runtime therubyrhino (Rhino) Active Record version 3.2.12 Action Pack version 3.2.12 ...

    ror中文资料

    2. **ActiveRecord**:RoR的数据访问层,它将数据库操作与对象模型绑定,提供了ORM(Object-Relational Mapping)功能。 3. **路由**:Rails的路由系统将HTTP请求映射到特定的Controller和Action,定义了应用的URL...

    初探ROR

    Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat Yourself”(DRY,...

    sample_app_RoR:Ruby on Rail教程后的学习项目

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...Ruby on Rails教程样本应用程序参考实施这是(第6版)中的示例应用程序的...

    freemis 基于ror框架的mis

    同时,熟悉数据库设计和管理也是必不可少的,因为RoR的ActiveRecord与数据库紧密关联。 总结,FreeMIS是一个运用了Ruby on Rails强大特性的管理信息系统实例,它体现了敏捷开发的理念,为开发者提供了快速构建企业...

    projects-RoR:Ruby on Rails上的项目

    项目收益率在此存储库中,您可以找到基于RoR的项目。 作者的GitHub 推特领英玛丽亚·费尔南达·克雷斯波 执照Ruby on Rails是开源的,因此可以在未经许可的情况下免费下载和使用。2021.哥伦比亚卡利

    在RHEL上安裝設置ROR(nginx+passenger+ruby+rails+oracle+netzke)

    6. **Oracle数据库**: 配置RoR应用连接Oracle数据库需要安装`ruby-oci8` gem,它提供了Ruby与Oracle数据库的接口。由于Oracle驱动可能不包含在默认的`gem`源中,可能需要添加Oracle的gem源或者手动编译安装。 7. **...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    使用Ruby on Rails开发LBS网站初探示例代码

    这几天一直在学习使用RoR(Ruby on Rails),想建立一个功能全面一点的LBS(Location Based Service)网站。但是对于我这个RoR的初学者(仅有几天时间)来说,毕竟太复杂了。因此本文试图简化原来的设计思路,抛弃一切...

    Java与Ruby在Web开发上谁更高效

    【Java与Ruby在Web开发上的效率对比】 Java和Ruby都是流行的Web开发语言,它们各自有其独特的优点和适用场景。本文主要探讨了Java相对于Ruby在Web开发中的效率和生产力。 首先,Ruby on Rails(RoR)以其简洁、...

    ROR 文件的上传与下载

    在Ruby on Rails(简称ROR)框架下,处理文件的上传与下载是一项常见的需求,尤其是在构建包含媒体内容的应用程序时。本文将基于给定的文件信息,详细阐述如何在Rails应用中实现文件的上传与下载功能,包括数据库...

    RoR选题方向—源代码

    Ruby on Rails(RoR)是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程。在这个选题方向中,我们主要探讨的是与RoR相关的源代码分析和学习。源代码是...

    ror实例

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在提高开发效率并提供简洁、优雅的代码结构。"ror实例"可能指的是在学习或实践中,通过创建...

    webbit_app_on_ror:Ruby on Rails框架Ruby on Rails上的第一个项目

    自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。... Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...

    Ruby-ROREcommerceRubyonRails电子商务平台

    Ruby on Rails(简称RoR)是一个基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率和代码的可读性。RoR以其“约定优于配置”(Convention over Configuration)的...

    ruby:Ruby演示文稿

    Ruby Ruby 语言技术参考,基于约翰沃洛斯基 (johnvoloski) 准备的材料。 介绍: 约翰·沃洛斯基: @约翰沃洛斯基 ... RoR 巴西- Ruby on Rails 巴西 RoR - Ruby on Rails RubyGems - 可用于 Ruby

    ruby on rails 101

    《Ruby on Rails 101》是一本介绍Ruby on Rails(简称RoR或ROR)的基础书籍,旨在为初学者提供一个全面而深入的学习框架。本书由Peter Marklund编写,包含了五天课程的演示文稿和相关资料,覆盖了从安装到实际应用...

Global site tag (gtag.js) - Google Analytics