如何阅读现有的Rails项目?

15
当您开始处理现有的Rails项目时,您需要采取哪些步骤来理解代码?您从哪里开始?在深入了解控制器、模型、帮助程序和视图之前,您使用什么工具来获得高层次的视图?您是否有任何特定的技巧、诀窍或工具可以帮助加快这个过程?
请不要回答“学习Rails和Ruby”(就像上一个问题的last guy所得到的回答一样-他也没有得到太多的回应,所以我想再次提问并提示一下)。我对自己的代码感到非常舒适。它是整理其他人的代码让我头疼,并且需要很长时间才能理解。
10个回答

10

看模型。如果应用程序编写得好,则应该能够了解其领域模型,这是有趣逻辑所在的地方。我还会查看模型的测试。

通过使用Rails应用程序并观察URL,就应该可以看出控制器/视图的实现方式。

不幸的是,有许多情况下控制器甚至视图中包含了过多的逻辑。这意味着您还需要查看这些目录。更不幸的是,这些层的测试往往不太清晰。


5

首先我使用应用程序,注意有趣的控制器和操作名称。

然后,我开始阅读这些控制器的代码,必要时还会阅读相关模型的代码。视图通常不太重要。


3
与迄今为止很多人的看法不同,我认为测试不是开始的地方。我认为它们太狭隘、太专注了。这就像试图通过首先放大分子内力和量子力学来理解基本物理/力学一样。我还认为你过于依赖写得好的测试,在我的经验中,很多人不写足够的测试或者写了质量较差的测试(这些测试不能准确地反映代码实际应该做什么)。
1)我认为首先要做的是了解应用程序到底是做什么的。使用它,至少要长时间使用,以建立对其主要目的、不同类型的数据以及可以执行哪些操作的概念,并且最重要的是,为什么要这样做。
2)您需要退后一步,看到整个画面。我认为最好的方法是从schema.rb开始。这告诉您一些非常重要的事情:
- 这个项目的词汇/概念是什么。在这个应用程序中,“用户”实际上意味着什么?为什么应用程序有“用户”和“帐户”模型,它们之间有什么不同/联系? - 您可以通过查看app/models了解有哪些模型,但是这实际上会告诉您每个模型保存的数据是什么。 - 由于* _id字段,您将了解模型之间的关联,这有助于您理解它们如何配合使用。
我会继续查看每个模型的*.rb文件,以获取(希望)的注释、验证、关联和与每个相关的任何其他逻辑。注意可能位于lib/中的常规Ruby类。
3)个人而言,我会简要浏览routes.rb,因为它会告诉您两个关键信息: 应用程序中所有操作的简要调查,以及如果路由和控制器/操作被良好命名和思考,则快速了解不同功能可能存在的位置。
此时,您可能已准备好深入研究您需要学习的特定内容。找到您最感兴趣的功能的控制器并打开它。开始阅读相关操作,看看涉及哪些模型,现在如果您想的话,可以开始打开测试。
别忘了使用您的其余工具:Ruby/Rails调试器、浏览器开发工具、日志等。

rails-erd gem是另一种有用的方式,可以帮助处理2)问题。 - jsuth

1

我能够想到两个看现有应用程序的原因,而我之前没有参与其中:我需要进行更改或者我想了解一个或多个方面,因为我正在考虑将它们作为输入用于对另一个应用程序进行更改。我包括在第二种情况中阅读以获得教育/启示。

特别是在MVC模式中,以及许多Web应用程序中,真正的好处在于它们可以被相当容易地分成请求/响应对,这些对可以在某种程度上独立地理解。所以,您可以从单个交互开始,并从那里增加您的理解。

当需要修改或扩展现有代码时,我应该对第一个变化有一个很好的想法 - 如果没有的话,那么我可能还不应该去碰这段代码!在Rails应用程序中,变化最有可能涉及视图、模型或两者的组合,我应该能够相当快地识别出相关的项目。如果有测试,我会检查它们是否运行,然后尝试编写一个暴露缺失功能的测试,然后我们就可以开始了。如果没有测试,那就有点棘手了 - 我会担心自己可能会不经意间破坏某些东西:我会考虑添加测试来增加自信心,这反过来又会开始建立对所研究领域的一些理解。我应该能够相当快地进入一个red-green-refactor循环,随着我熟悉情况而逐渐加快速度。

1

运行测试。:-)

如果你很幸运,它将建立在RSpec上,这将描述行为而不考虑实现。


1
我会建议先看一下测试(如果项目使用 RSpec,则是规范)来了解应用程序的高层次预期。一旦你从顶层理解了模型/视图/控制器的预期行为,就可以深入到实现细节中去。

1
如果Rails项目处于相对稳定的状态,我一直是使用调试器来帮助浏览代码库的忠实粉丝。我会启动浏览器并开始与应用程序进行交互,然后针对某些功能设置断点,并在相关函数的开头设置断点。有了这个设置,我只需要研究进入函数的参数和返回的值,以更好地理解正在发生的事情。一旦你感到舒适,你可以稍微修改功能,以确保你理解正在发生的事情。仅对代码执行一些静态分析可能很麻烦!祝你好运!

0
  1. 我在终端中运行rake test
  2. 如果环境没有加载,我会查看堆栈跟踪以找出问题所在,然后修复它以使环境加载并再次运行测试
  3. 我启动服务器并在浏览器中打开应用程序。四处点击。
  4. 开始处理手头的任务。
  5. 如果代码很棒,我很高兴。如果代码很糟糕,我会为了好玩和利润而修改

0

除了已经发布的运行规范和分解MVC的提示之外,我还喜欢:

rake routes

作为另一种获取应用程序所有路由的高级视图的方式

./script/console

Rails irb控制台仍然是我最喜欢的检查模型和模型方法的方式。在irb中获取一些记录并与它们一起工作。我知道这有助于我的开发和测试。


-1

看文档吧,有些项目的文档非常好。 理解他人的代码有点困难,但试一试...阅读代码就好了;-)


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