我最近阅读了Crockford的书“ Javascript:好的部分”,其中一个基本前提是,编程语言可能具有程序员应避免的不良功能。
我是一名Rubyist,尽管我喜欢这种语言,但获取观点总是有价值的。那么,您认为Ruby最糟糕的功能(例如方法,类,实践)是什么?我的目的不是在就语言本身的优缺点或其速度等问题争论不休。相反,我希望根据过去的经验,讨论您认为哪些功能会带来危险/麻烦/痛苦的功能。
我最近阅读了Crockford的书“ Javascript:好的部分”,其中一个基本前提是,编程语言可能具有程序员应避免的不良功能。
我是一名Rubyist,尽管我喜欢这种语言,但获取观点总是有价值的。那么,您认为Ruby最糟糕的功能(例如方法,类,实践)是什么?我的目的不是在就语言本身的优缺点或其速度等问题争论不休。相反,我希望根据过去的经验,讨论您认为哪些功能会带来危险/麻烦/痛苦的功能。
Answers:
您应该看加里·伯恩哈特(Gary Bernhardt)的《 Python与Ruby:死亡之战》。他报价:
我在Ruby中发现的丑陋之处是使RSpec之类的出色Ruby软件成为可能的原因,而Python从来没有(鉴于当前的实现)。
在他特别谈论Python时,他谈到了很多在Ruby中很奇怪的东西。猴子修补是最重要的主题之一。
Ruby对象(不同于某些其他面向对象语言的对象)可以单独进行修改。您始终可以基于每个对象添加方法。在Ruby中,对象的行为或功能可能会偏离其类提供的行为或功能。
尽管这提供了很大的灵活性并增强了Ruby最受欢迎和最复杂的一些宝石,但是如果您尝试调试问题却没有意识到某个地方的某些库已修改了核心方法,那么它可能会让您大吃一惊。
我认为最糟糕的功能是open classes
允许您全局更改已更改类的所有当前和将来实例的行为。
此功能的问题部分是,这些(全局)更改会在运行时在Ruby解释器遇到定义时发生,而这可能已经实例化了几个对象,而这些对象现在突然改变了它们的行为,可能需要很长时间。
在大型代码库中,这可能会导致非常非常难以发现错误-尤其是由于Ruby的弱化(例如,与CLR或JVM相比)调试故事以及eval
在这种情况下使用其他功能,使得错误更加复杂很难找到全球变化发生的位置。也就是说,如果您已经到达怀疑“正确”课程引起麻烦的地步!以我的经验,您通常是从追赶大雁开始的,因为问题是使用真正的罪魁祸首开始出现在物体上的。
因此最好的办法是,要么停止使用开放类(#extend
并且将更改放入Module
IMHO中更加安全,易于理解和更好地进行测试),要么无法避免:
#eval
和朋友创建公开课我不使用Ruby的最大原因:在冰河时期,它比一月份在北极的糖蜜要慢。基准测试语言是一门不精确的科学,但是Ruby似乎比JavaScript和Python都要慢得多。
如果可以扩展到Ruby on Rails,则:
数据库逻辑为每个表提供auto_increment
主键这一事实,包括不需要它们并且不应该包含它们的表。
完全不支持复合键的事实。
对于普通的Ruby,我的抓地力将与任何将安全性换成表达性的语言相同。只需编写少量代码就可以轻松地完成很多工作,但是使用任何数量的代码都可能造成巨大的混乱。
auto_increment
ID,尤其是has_and_belongs_to_many关系的连接表建议显式不具有id列。
Ruby包含元编程(反射,自省),多范式编程和非凡的动态性。强大而灵活的脚步很容易拍。
麻烦了吗 Ruby具有极强的可读性或坚不可摧的能力。我看过看起来像它属于Bash脚本的代码。
不良做法?某些Ruby主义者认为智慧比智慧更重要。他们编写并分享一些技巧来展示自己的聪明才智,但这会产生难以理解的代码。
顺便说一句:从设计上来说,JavaScript是一场灾难,而“ The Good Parts”一书试图提取出它的隐藏之美。Perl是一种普及了“有多种方法可以做到”(即灵活性)的语言,在“ Perl,最佳实践”中有类似的书。Perl的历史是试验和来之不易的经验之一,“最佳实践”代表了它的知识。我认为可以说,Perl 6将基于该知识以及更多内容重新启动该语言。Ruby可能会遇到类似的问题。
@James和for循环...当您在ruby中进行for循环时,然后调用“ .each”。因此,“ for”是使C风格循环更自在的人们的语法糖。但是作为一名Rubyist,您将一直使用.map,.inject,.each_with_object之类的迭代器。您永远不必在ruby中使用诸如“ i = 0; i> 6; i ++”之类的东西编写for循环,因此您最终会放弃习惯。@andrew ...雄辩的红宝石不赞成循环。
这更多的是关于程序员而不是语言,但是为什么Ruby程序员如此讨厌循环呢?
我意识到Ruby具有:
someCollection.each do |item|
...
end
但是我从未见过在for循环不会做完全相同的事情的情况下使用它。
我问过几次,但从来没有得到一个好的答案。
如果这只是一件时尚的事,我很乐意接受,但是我已经看到Ruby程序员对此确实感到很努力,而且我很好奇。
for
循环是n00bs所做的事情。用Ruby编写C语言的人。2)块在Ruby中使用很多,因此使用不像块的东西只是额外的精力。