Ruby:不良部分[关闭]


20

我最近阅读了Crockford的书“ Javascript:好的部分”,其中一个基本前提是,编程语言可能具有程序员应避免的不良功能。

我是一名Rubyist,尽管我喜欢这种语言,但获取观点总是有价值的。那么,您认为Ruby最糟糕的功能(例如方法,类,实践)是什么?我的目的不是在就语言本身的优缺点或其速度等问题争论不休。相反,我希望根据过去的经验,讨论您认为哪些功能会带来危险/麻烦/痛苦的功能。


1
我从来都不喜欢必须使用单词“ end”,然后将其与“ {”和“}”混合使用会更加令人讨厌。它使我很欣赏Python风格的语法或直接使用{&}的语法。尽管对此可以来回争论,但最终它与个人喜好有很大关系。我听说有人说Ruby占用了Python和Perl的最丑陋的部分,并将它们放在一起。我很喜欢学习Ruby。

我实际上很喜欢这个问题,并期待得到答案,但仍然投票决定将其关闭。我认为这不太适合堆栈溢出(由于可能过于主观/议论,开放式等)。
stakx 2011年

我认为值得讨论,因为它可以阐明避免的危险做法。不过,我明白你的意思,并把问题缩小了。

9
我看不出这个问题有何与众不同的地方,例如,您希望在Ruby语言中进行哪些改进?应该警告新手哪些Ruby Gotchas?Ruby的实际问题是什么?或其他任何有关Ruby痛点的专长问题。另外,即使如果这个问题是发展到与其他的人区别开来,这将属于上Programmers.SE,不StackOverflow上。
约尔格W¯¯米塔格

2
我需要检查一下眼睛-我以为这个问题的标题是“ Ruby:The Brad Pitts”。
oosterwal

Answers:


8

您应该看加里·伯恩哈特(Gary Bernhardt)的《 Python与Ruby:死亡之战》。他报价:

我在Ruby中发现的丑陋之处是使RSpec之类的出色Ruby软件成为可能的原因,而Python从来没有(鉴于当前的实现)。

在他特别谈论Python时,他谈到了很多在Ruby中很奇怪的东西。猴子修补是最重要的主题之一。

Ruby对象(不同于某些其他面向对象语言的对象)可以单独进行修改。您始终可以基于每个对象添加方法。在Ruby中,对象的行为或功能可能会偏离其类提供的行为或功能。

尽管这提供了很大的灵活性并增强了Ruby最受欢迎和最复杂的一些宝石,但是如果您尝试调试问题却没有意识到某个地方的某些库已修改了核心方法,那么它可能会让您大吃一惊。


Javascript允许您也以这种方式对待对象。
0112年

8

某些人只在轨道上的红宝石方面想到了红宝石,这有点烦人,因为该语言本身表现得很好。


7

我认为最糟糕的功能是open classes允许您全局更改已更改类的所有当前和将来实例的行为。

此功能的问题部分是,这些(全局)更改会在运行时在Ruby解释器遇到定义时发生,而这可能已经实例化了几个对象,而这些对象现在突然改变了它们的行为,可能需要很长时间。

在大型代码库中,这可能会导致非常非常难以发现错误-尤其是由于Ruby的弱化(例如,与CLR或JVM相比)调试故事以及eval在这种情况下使用其他功能,使得错误更加复杂很难找到全球变化发生的位置。也就是说,如果您已经到达怀疑“正确”课程引起麻烦的地步!以我的经验,您通常是从追赶大雁开始的,因为问题是使用真正的罪魁祸首开始出现在物体上的。

因此最好的办法是,要么停止使用开放类(#extend并且将更改放入ModuleIMHO中更加安全,易于理解和更好地进行测试),要么无法避免:

  • 仅使用新行为扩展类(即不覆盖现有行为)
  • 在源代码树中有一个定义的位置,所有使用开放类的扩展都必须放置在其中
  • 不要使用#eval和朋友创建公开课
  • 将开放类的所有用法放在一个大的可见图表上,所有开发人员都可以在上面看到它们-并明确指出,对它们的任何更改都是影响整个代码库的“体系结构决策”(他们所做的),而不是快速进行黑客攻击的地方针对您当前的任务

5

我不使用Ruby的最大原因:在冰河时期,它比一月份在北极的糖蜜要慢。基准测试语言是一门不精确的科学,但是Ruby似乎比JavaScript和Python都要慢得多。


那也是我的经验。
Chuck Stephanski

2
您为红宝石开发速度太慢的应用程序是什么?我的意思是,当您说这很慢时,我相信您,但是它是如何阻止您实现目标的呢?
大卫

1
我想当您想要制作原型之类的东西并希望快速完成时,Ruby很棒,这不是一个很大的东西,也不会做大量的数字运算。如果您希望不断消耗大量CPU周期,那么任何优秀的程序员都知道会使用C或C ++之类的东西。
杰夫·韦林

1
@David:我会考虑使用Ruby来进行简单的DNA序列处理代码,但是我没有这样做,因为Python填补了类似的空白,具有类似的功能并且速度更快。如果我愿意降低水平,D会更快,而且仍然很方便。
dsimcha'3

1
@Jeff:同意,但是C和C ++很难编写。像Ruby这样的高级语言的重点是尽可能避免这种麻烦。它们越慢,实现此目标的能力就越差。即使是高级动态语言,Ruby也很慢。那和NumPy / SciPy就是为什么当我需要高级动态语言时改用Python。
2011年

4

如果可以扩展到Ruby on Rails,则:

  1. 数据库逻辑为每个表提供auto_increment主键这一事实,包括不需要它们并且不应该包含它们的表。

  2. 完全不支持复合键的事实。

对于普通的Ruby,我的抓地力将与任何将安全性换成表达性的语言相同。只需编写少量代码就可以轻松地完成很多工作,但是使用任何数量的代码都可能造成巨大的混乱。


由于我缩小了问题范围,请查看我的编辑内容。如果批准了有关编辑的问题,我将为Rails开设另一个并行版本。

1
抱歉,但是您误会了,并不是Rails应用程序中的每个表都必须具有auto_incrementID,尤其是has_and_belongs_to_many关系的连接表建议显式不具有id列。
Brett Bender

@Brett-这些是相对较新的补充吗?当我在2008年初使用它时,它肯定没有这些功能。无论如何,现在可以使用它们真是太好了。

1
@aroth:我不确定其他人是否会认为“相对较新”的意思是“过去三年内” :-)

Rails的ActiveRecord有一个替代方法叫做DataMapper,它没有ActiveRecord那样自以为是。
2011年

3

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 ...雄辩的红宝石不赞成循环。


-1

这更多的是关于程序员而不是语言,但是为什么Ruby程序员如此讨厌循环呢?

我意识到Ruby具有:

someCollection.each do |item|
   ...
end

但是我从未见过在for循环不会做完全相同的事情的情况下使用它。

我问过几次,但从来没有得到一个好的答案。

如果这只是一件时尚的事,我很乐意接受,但是我已经看到Ruby程序员对此确实感到很努力,而且我很好奇。


1
一旦我得到答案“按键次数更少”,这显然是错误的……:-)
James

2
两种理论:1)使用for循环是n00bs所做的事情。用Ruby编写C语言的人。2)块在Ruby中使用很多,因此使用不像块的东西只是额外的精力。
安德鲁·格林

3
当我刚开始学习Ruby时,当我尝试使用Python时,块是我真正喜欢和错过的东西。for循环会做同样的事情吗?当然,对我而言,这种风格比for循环更适合我的喜好。
2011年

2
@andrew老实说,您的第一个答案就是我之前问过的那种垃圾。没有真正的原因,上面有一个细微的侮辱。@ Wayne,@ Jetti和@andrews第二答案:谢谢。那么公平。
詹姆斯

1
如果您是说“增强”了循环(也就是<expression>中的<value>做...),除了#each的使用和外观更接近其常用表亲#inject,#collect,#如果您正在谈论'C'风格的索引循环(又名int i = 0; i <任意; ++ i),则不同之处在于,a)“偏离一个”的错误是不可能的,并且b)清楚表明了循环的意图-#each的意思是“每个元素都会产生副作用”。for循环要求您阅读整个循环,以获取其目的的“要点”。
亚历山大·巴蒂斯蒂

-1

我通常会避免添加仅与其他语言向后兼容的内容。例如,Perlisms和for x in y


我刚刚发布了有关Ruby程序员和for循环的答案,如果您能解释一下,我将不胜感激:-)
James
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.