已锁定 主题:我喜欢Ruby的原因
精华帖 (0) :: 良好帖 (12) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-23
mcpssx 写道 gigix 写道 rubynroll 写道 有些东西是无法通过封装几个方法或库来替换的,比如closure, Java是无论如何也封装不出来的。
当然可以封装出来咯,匿名内部类嘛,Ruby一句话的事情写10行嘛。 不是每天写代码的人,或者每天写代码却从不动脑子去想的人,说起这些事情来总是轻描淡写的 单看这一点是没多大意义的,按这样的说法, 那C++更强大啊,C语言都可以支持函数指针了,delphi还支持方法函数指针呢, 那真么java更流行了呢? 都是要综合比较的, 比如java的重构就比ruby强大多少倍吧? java的函数库比ruby多吧? java不是不能支持closure的,而是因为内部有争议所以迟迟没有上马!其实就是写一个内部类也就多一行类定义代码吧 你如果了解javascript的closure,就应该知道除了类似函数指针的功能,还有共享变量空间的优点。 java在一些应用领域比C语言更流行,不是(如果是,也绝不是主要原因)因为它抛弃了函数指针,"都是要综合比较的",所以,你的暗示太误导人了。 说到重构,不同语言写成的代码有不同的重构需求和重构模式,gigix翻译的那本关于重构的经典书,主要以java程序作为研究对象。像abstract interface这些东西,对于动态语言就是另外一种套路。而且,以我们对自己rails工程做过的几轮重构发现,ruby程序由于其简洁性,大大降低了将来需要重构的压力和规模,在重构过程中不依赖工具或依赖全工程查找等简单手段,其重构效率、准确性和最终效果都令人满意。 没有真正用ruby开发的人,会抱怨说ruby在一个问题上有多个答案。而真正用会发现,用ruby哲学去思考一个具体问题时,往往会清晰的直奔最佳方案。反倒是java,会有很多可选方案,不止复杂,而且在实现上互相迁移的成本不小。很多时候java重构,就是从一个方案切换到另个方案。重构,为的是在满足需求和保证必要的可扩展性的前提下,提高代码质量(消除坏味道代码)。在现实工程里,重复代码几乎就是坏味道代码的同义词。你想想java代码造成重复的可能性,比较比较ruby代码的可能性,就应该清楚谁对重构更有利了。 我看到你后面的贴子举了java7的例子,如果用java5定义内部类的方式实现同样功能,请你贴出代码,我们再看看是不是只多了一行类定义代码。 工作比较忙,后面的贴有空再回。 |
|
返回顶楼 | |
发表时间:2008-04-23
对于Java实现closure的问题,我实在是不专业,本人不是搞java的,因此见笑了...不过closure不仅仅是deligate的问题,closure还要携带binding环境的,例如:
a = 5 10.times { a += 1 } 在这里,closure里面可以访问a, 不知道匿名类可以么? 至于java 7,那是另外个问题,也正说明通过“封装”不好解决问题,所以引入新的语法嘛。 |
|
返回顶楼 | |
发表时间:2008-04-23
我很烦在讨论一个东西的时候,对方对此没有概念。
看来又陷到这种境地了。我不喜欢说服一个没有了解的人去喜欢什么,我喜欢自由。我觉得不像讨论。 mcpssx,关于closure,请你仔细看看rubynroll写的那段示例代码,这个binding,不是指self/this。你玩过javascript吗?那里面也有。 java用匿名类实现,直接修改binding里的对象不那么直接,有final问题。这个用过的人帮忙解释一下吧。 关于procedure的传递时同时携带self/this,有些语言没有做到。AS3相比AS2做到了这一点,它都自认为是它很重要的特点。 至于closure有多大意义,是不是重点,JGL,common collection,STL,评估一个语言的角度,等等,等我们今天code freeze后我再参与讨论,干活去了。 |
|
返回顶楼 | |
发表时间:2008-04-23
|
|
返回顶楼 | |
发表时间:2008-04-23
从评论ruby到具体的closure,是因为gigix举了一个例子。这只是一个点。
我想问mcpssx,你用没用过closure? 揣测和真正来用是两码事。 引用 1,我只是指出匿名类类似于闭包的效果,并没有说形式上一模一样。
类是携带了过程的数据,闭包就是携带了数据的过程,无非是重点有所区别而已。 我前面提过,《Advanced Rails》第二章也提到如何比较编程语言。大致是说不应该在他们的原始能力上进行比较,因为从理论上任一图灵完备的语言都能满足该要求。所以,你跟我讲类、过程、数据的关系,如同讲所有的代码最始都无非是转成了机器码来跑一样。 性能方面对于多数应用程序而言也不是关键。 而开发效率是至关重要的,即把程序员的想法准确转换成实现代码的速度。同时与之紧密相连的是维护效率。Perl常被人批评为“只写”的,通常有较高的开发效率,却以较低的维护效率作为代价。而Ruby在这两方面都不错。 程序代码首先是写给人看的,顺便让机器运行。所以在编程语言的发展方向和主要差异上,是如何让人表达他的意图,而不是如何表达计算机的实现方式。 另外,《Advanced Rails》第一章也指出,在Ruby视角中的设计模式,一部份因为极为简单透明化,不宜称为模式,而是一种惯用法,或称Ruby思考方式。因此Ruby设计模式跟C++设计模式有很大区别。 引用 2,闭包的意义多大看一点就清楚了,那就是php就没有闭包,
我看不出有证据显示出rails的开发速度快于php,也看出不出这对web开发有什么重要意义。 Web开发中,闭包的影响力可能没那么大。我不懂php,想问问没有闭包的php是怎么处理数据库连接的打开关闭的。 闭包的威力更多表现在逻辑处理和框架级上。我们的逻辑代码就大量(很自然的)用了它。没有它会是灾难。 引用 而且groovy也有闭包,也有open class啊
所以groovy在编程语言排名中也在缓慢的往上爬啊。groovy的问题,是它的核心开发团队的问题,不是语法方面的问题。 |
|
返回顶楼 | |
发表时间:2008-04-23
1. 就算匿名类可以实现类似闭包的效果,就像gigix说的,10行代码和1行代码的区别. 而且这一行是优雅自然的代码. 这就是一个巨大的进步.
2. 更没有证据显示php开发速度快是因为没有闭包, 所以你等于没说.... 我也不知道闭包对web开发有什么重要意义....不过我觉得闭包使得语言表达更自然, 类似: 10.times { puts "hello" } 这样简洁自然的表达方式就有闭包的功劳. "而且groovy也有闭包,也有open class啊" 嗯, 我不了解groovy, no comment。 这一帖真有趣, 支持ruby的人都是以实际代码,语言特性说明或亲历的项目经验作为证据来说明ruby的优点, 而对ruby持怀疑者, 多半以猜测, 臆断, 初尝即止的经验为基础, 或干脆顾左右而言它。 |
|
返回顶楼 | |
发表时间:2008-04-23
rubynroll 写道 1. 就算匿名类可以实现类似闭包的效果,就像gigix说的,10行代码和1行代码的区别. 而且这一行是优雅自然的代码. 这就是一个巨大的进步.
为了对前面的讨论有个交待,mcpssx须给出用java5怎么实现那个功能。是不是多一行类定义就能搞定,用JGL、common collection都行。 |
|
返回顶楼 | |
发表时间:2008-04-23
rubynroll 写道 这一帖真有趣, 支持ruby的人都是以实际代码,语言特性说明或亲历的项目经验作为证据来说明ruby的优点, 而对ruby持怀疑者, 多半以猜测, 臆断, 初尝即止的经验为基础, 或干脆顾左右而言它。 不止这样,还倾向于拿别人(java)不靠谱的未来跟ruby的现在甚至过去进行比较。 |
|
返回顶楼 | |
发表时间:2008-04-23
那个,就归入“顾左右而言它”了。
|
|
返回顶楼 | |
发表时间:2008-04-23
引用 2,我以为重构大多时候是依靠工具的,而不是人在那里到处重构。否则这和以前人改程序有什么效率提高?
依靠工具改代码,用个像声词就是“稀里哗啦”一大片。重构Ruby程序,你还能想像发出稀里哗啦的声音吗? 可以想像的是劈里啪啦的完成功能 为什么会发出这种声音呢? 现在时髦的话是:你猜 |
|
返回顶楼 | |