如果开源软件作者没有意识到他们写的代码将会被其他人阅读,他们就写不出好代码。类似的情况是我们目前开发者的情况。
阅读大的代码库是艰巨的。有这么多的抽象,相互链接在一起,让你的大脑觉得一团迷糊。
但是,如果有一点点的经验,阅读代码将会变的更容易。让我们开始吧!
Ruby Gems
Ruby世界里标准模式的代码发布手段是万能的gem。
让我们先考虑一些Ruby Gem是怎么组织的。最块的方式是使用 “bundle gem” 命令。
进入到你写代码的路径 (我经常使用 ~/code), 然后运行命令 bundle gem <name of gem>
这样就会创建一个name of gem的路径。如果你浏览这个目录, 你会看到几个文件夹和几个文件。
bundle gem 这个命令建立了一个ruby gem的基本框架和文件结构。
我们感兴趣的目录是 lib/, 包含了绝大多数的Ruby Gem的代码。同样的, 一个gem会包括 bin/ 和 test/ 目录。
bin/ 包含那些希望在系统里使用的可执行文件。 例如, “bundler” gem 有bundle 这个命令可以使用。
还有, spec/ 或者 test/ 包含那些这个Gem的单元和功能测试。
前期工作
在你深入到gem的源代码,有几件事你应该记住。
首先,提出一个目标。我会详细说明这一个故事。几年前,我决定,我要让自己熟悉一些低层次的开发(如内核开发)。为此,我检出了一个实现ext3文件系统的副本,并决定尽可能多的学习。
令人难以置信,这种方式失败了。
我一直被小细节所牵制,无法纵观全局。这样做后一个星期左右,我决定,我需要设置一个目标。我决定,我要改变目标为了解文件系统如何实现缓存。
这似乎是非常困难的,当我刚刚开始的时候 - 我完全不知道代码是如何工作的!但是,通过有一个目标,我把所有代码排序,在我的脑海里意思到 关于哪部分是做什么的总的认识,这是个不错的感觉!
在脑海里提出一个目标将会帮助你快速排序每件东西。
其次,你所使用的编辑器是很重要的。就我而言,我通常使用Vim。但是,我认识几个人使用IDE专为阅读代码。我可以理解这种做法,IDE中,可以很容易从一个类跳到另一个或从一个函数跳到另一个函数。所以,选择一个你感觉适合并且可以快速跳转的工具。我可以肯定地说,你将在很多文件和变量之间来回搜索你想要的。
破解Gem
一旦你深入研究源码,不要害怕去猜它的意思。
我的意思是,你不必花时间去寻找到执行的每个函数(那会花费跟写代码同样多的时间!)。相反,使用函数/类/模块的名称和它的使用方式,尝试着去猜测它做什么。通常,这将是显而易见的。还有一些情况,没有这么容易看出来。
如果你觉得一个函数是至关重要的,那么通过各种手段,理解它里面的每一行代码。但是,跳过那些不是那么重要的东西也是很重要的,(再强调一次,有一个目标是重要的 - 你可以衡量哪些东西是重要的)。如果一个gem没有足够的文档(因为某些原因这种情况经常发生),你需要找出某个函数做了什么,请参阅 spec/!
任何项目的单元测试都是一个很好的方式来查看不同部分是如何一起工作的,他们每部分都做了什么。对于那些有很多的功能,但文档很少的gems,这可以说非常有用的。
对那些你已经学会的东西做笔记是一个很好的跟踪学习方式。它让你保持在一定的路线上, 我认为保持在一定的路线上是我阅读代码时遇见的最重要的问题。
您的笔记通常应该包含每个类,函数和方法,以及它们是如何相互关联的。例如,如果你知道的方法Person.get_data 从服务器下载员工数据并调用Util.parse_json,并且这跟你的目标相关,把它写下来。
阅读的代码的可执行文件(库)时,一个常用的技巧是直接跳转到所谓的“主方法”。此方法“开始”的行动,通常与用户交互。从这个方法中,你可以岔开,并找出在哪部分上集中精力。我发现,一个类似的技巧能够很好地处理库中的事件循环 - 找到主事件循环,找到你感兴趣的那个调用,并遵循它的面包屑找到回家的路。
最后,猜猜什么是阅读一个gem源码的最重要的技巧?实际上是使用gem本身!这是令人难以置信的被低估。请考虑这样的情况:如果你从来没有使用过一台微波炉,你怎么可能应该知道它是如何工作的?
例如,当我开始使用Event Machine的时候,我真的很希望看到这样的库的内部是如何实现的,但是,我还没有真正使用过它。所以,我用了一个星期的时间写了一个IRC bot,有一些很酷的特征,这帮助我理解了Event Machine是如何组织的。如果没有这种经验,正确的理解这些东西是怎么工作的是非常困难的。
此外,随着你读代码的过程, 通过实际测试检查您的“发现” 总是一个好主意。如果,你认为get_server_ident 方法获取的服务器的名称,通过一小段简单的代码使用gem看看是否相匹配。如果你尽可能地尝试猜测并且掠过了大部分代码,在第一次过程中误解一些代码是不可避免的,测试是一个非常棒的方式来清除自己的这些误解。
结论
阅读代码像是使用牙线 - 那种你知道你应该做,但最终没有做成的事情。
但是,读完这篇后,我希望你养成一个这样的习惯!这会让你成为一个更好的开发者。
希望这篇快速入门的文章能帮助你以更好的方式穿过Ruby Gems的障碍。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务