Rails是一个黑盒子吗?

19

最近我在做一些简单的Rails应用程序。我很了解Ruby,但是当我开始按照“Rails方式”去做事情时,我注意到有些东西是“仅仅因为这样而这样”,对于(rails)新手来说很难知道代码做了什么。

Rails是否错失了重点,变成了某种第四代语言?我的意思是,你必须做一些(你不需要理解的)事情,才能开发Rails网站,否则就要探索源代码以弄清每个部分的作用。

我也看到人们乐意支付现金给能制作出好的Rails教程的任何人……我们所谈论的是一个将简洁性放在首位的框架,有必要为好的教程付费吗?

别误会我,我相信Rails已经为主流带来了非常好的想法(比如约定优于配置),但是这种过度简化(“只需放入这行代码,它就能工作!”)是否降低了框架试图实现的简易性?


它非常适合那些“与众不同”的人。 - Camilo Martin
9个回答

23

我认为这是一种观念问题。从广义上讲,Rails社区认为这个框架非常容易使用。但实际情况并非如此。事实上,我越用Rails,我就越不喜欢它。我不认为这是Rails的错,但很多人已经认为编写Rails应用程序就像挥舞魔杖一样(我自己也曾这么想过)。

尽管如此,Rails确实实现了许多承诺,因为它提供了许多只需要很少或根本不需要配置的功能。例如ORM、模型关系和验证都很容易设置,这为微调应用逻辑和专注于设计等方面留下了更多时间。Rails代码也非常容易重构。Rails绝对可以用很少的代码完成许多工作。

但当我想要走出常规时,我会感到沮丧。我可能想要实现“非常特定的功能X”,但找不到从哪里开始。我发现,我深入框架的程度越深,信息就越稀少。API的某些部分文档缺失严重。这迫使我依赖第三方插件,其中一些没有文档,并且维护得不好。我基本上只能依靠博客文章告诉我将这段代码或那段代码复制到我的应用程序中,然后一切都会正常(谢天谢地,它们通常确实可以)。

我的一些麻烦可能与我的总体经验不足有关(我仍在从设计师向程序员过渡),但我经常感到,尽管Rails为构建网站提供了优秀的工具,但至少表面上并没有为构建其他工具提供出色的工具。它具有潜力,但你必须深入挖掘。


2
只是想更新一下我的回答,现在已经过去两年了。社区和Rails 3已经做出了巨大的努力来解决Rails的一些痛点。他们成功地在“易于完成任务”和“严肃框架”之间取得了平衡。基本上,Rails正在良好地成熟,虽然我上面提到的观点仍然有一定的价值,但我不再认为它像以前那样“黑匣子”。 - Bryan M.

11

约定优于配置的问题在于你需要知道这个约定。至少配置文件在刚开始时可以让你有东西可读...一旦你知道了这个约定,就会更快,但与此同时你必须克服学习曲线。


4
这不有点像说汽车的问题在于你必须得知道如何开车吗?Rails 的约定并不复杂 —— 只有少数几个。 - John Topley
好的,我同意"悬崖"这个词可能有点夸张。但是,在我开始理解框架的约定后,我才发现自己取得了进展。原问题对我来说似乎正是如此 - 不知道路规律就难以开车,而好的驾校教练需要花费一定的资金。 - Tim Howland

9
Rails是一个黑盒子吗?Rails确实有一些“神奇的代码”,你只需按照教程所说的编写,东西就会不可思议地工作,但它并不是黑盒子。首先,“黑盒子”指的是无法查看内部的东西。因此,你不能把开源项目称为“黑盒子”。这里是Rails 2.1稳定版源代码的链接,你可以看一下。如果阅读源代码不是你的强项,大多数这些“魔法功能”都在许多网站和博客上有很好的文档和解释(如果没有,你总是可以在这里提问,我100%确定你会得到良好的回答)。记住,如果你还处于教程阶段,任何教程都会有很多“只需输入这一行代码”的内容,因为他们试图传达概念,而不是深入了解一切的内部运作。每个星球上的其他框架,而不仅仅是Rails,在他们的教程中都有“神奇”的东西。

我并不是在做任何教程,事实上我正在阅读《简单的Rails 2》和《RESTful Web Services》,其中有一个完整的章节介绍了如何开发Rails应用程序。我提到教程是因为有些人实际上会为写得好的教程付费。 - Pablo Fernandez

4

我发现Rails非常易于使用。你可能想学习《使用Rails进行敏捷Web开发》。这对我学习“Rails方式”有很大帮助。我更多地将其用作参考而不是教程,但它可以指导你创建一个应用程序并解释其中的内容。FWIW,我比学ASP.NET(我仍在学习)更快地掌握了Rails,并且学会了Rails后在学习ASP.NET MVC方面有了很大的帮助。


++ 关于敏捷Web开发。它既是教程又是参考书,包含了许多有用的信息。我已经使用Rails编程7个月以上,仍经常参考这本书。PDF版本非常实用。 - Tilendor

4

就像任何事情一样,我认为魔鬼就在细节中。是的,很容易启动一个网站并将各个部分拼凑在一起,以使其正常运行,但要设计出一个良好设计和健壮的系统需要更深入的设计和思考。很容易开始做出糟糕的面向对象决策,比如违反Demeter法则,因为东西很快就可以组装起来。Rails确实如此简单。伟大的Rails却不是。


3
我认为“了解约定”不是问题。我知道如果我执行X,那么Y就会起作用。但是X到底是什么?Rails对我来说就像一个黑匣子,具有讽刺意味的是,当它谈论“约定优于配置”时,构建Rails应用程序的整个过程更像是配置而不是编程。
我曾经遇到过这种奇怪的异常,当时我在按照Jruby on Rails(Ola Bini)的示例操作时......

CreateProductCategories未找到常量ProductType!

这是因为Rails版本不同,但重点是......一切都很好,直到你走上黄金路径之外,黑匣子就再也不能帮助你了,然后你意识到整个时间你都不知道自己在做什么,开始在论坛/邮件列表中寻求帮助(然后你发现大多数人不知道他们在做什么或为什么,只知道它起作用)。
无论如何,了解到我不是疯了,有些人也面临着这种问题是很好的事情。谢谢大家。
PS:英语不是我的母语,如果您发现语法错误,请编辑它们。

2
我对Rails内部工作原理有一些了解,我真的希望Katz为Rails 3.0所做的工作能够使Rails内部更易于理解,尤其是更加详细地记录。据我所知,他已经在“模块/层”之间创建了一些定义良好的接口,例如所有ORM共享一个公共接口,因此您不仅可以替换ORM,还可以轻松地了解Rails与ORM之间的接口。
与主流观点相反,我认为Rails是一个非常困难的框架,比纯PHP更难。依赖于您不理解的框架会产生一些后果,即使对于经验丰富的Ruby程序员来说,学习Rails内部也并不容易。
另一方面,Rails生态系统发展非常迅速,这增加了另一层难度,在过去一个月中,我至少添加了3或4个宝石,并在上个月将Cucumber完全添加到我的工作流程中。但是,我想这就是我为身处IT行业而付出的代价。

1

我同意Bryan M.的观点。

有太多黑魔法和神秘的事情发生了,成千上万行的代码,到处都是元编程。

但公平地说,Rails教会了我很多东西,比如规范驱动开发、REST和良好的Ruby理解。

现在我已经到了这样一个阶段:20%的时间很顺利,而另外80%的时间则在与Rails的约定斗争。当我写纯粹的Ruby时,我感觉更加高效。

在某个时候,Merb似乎是一个选择,下一个项目我将使用Rack/Sinatra和CouchDB。


0
Pablo,你可能想要了解一下Django,这是由一个专注于提供具有优先级的高质量文档的团队开发的。

1
无论何时讨论 Rails,一定会有 Django 粉丝出现。 - Matt Briggs
1
我是一名Rails开发者Matt。但我并不是一个狂热者。因为并非所有情况都适用于同一种方法。 - srboisvert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接