阅读开源项目源代码的方法 | IT宅编程分享

发布于 2012-02-16 | 更新于 2020-09-20

最近在研究一个开源项目的源代码,庞大的类库和复杂的调用关系,看的有毫无头绪。

偶然间从网上看到了一篇不错的介绍如何读懂他人写的代码的文章,觉得非常不错,IT宅在这里分享给大家:阅读他人的程式码

以下是内容的摘录:

1、读懂程式码,使心法皆为我所用

程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。

1.1、读懂别人写的程式码,让你收获满满

1.2、先了解系统架构与行为模式,再细读

倘若撰写程式码是程式人的重要技艺之一,那么读懂别人的程式码,接着加以修改,也势必是另一个重要的技艺。

从程式码的启始点开始读起,一来要循序读完所有的程式码旷日费时,二来透过这种方式来了解系统,很难在脑中构建出系统的面貌,进而了解到系统真正的行为。所以,阅读程式码的重点,不在于读完每一行程式码,而是在于有效率地透过探索及阅读,从而了解系统的架构及行为模式。以便在你需要了解任何片段的细节实作时,能够很快在脑上对映到具体的程式码位置,直到那一刻,才是细读的时机。

1.3、熟悉沟通语言与惯例用语

1.4、掌握程式码撰写者的心态与习惯

2、摸清架构,便可轻松掌握全貌

在本文中,我们的重点放在:要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。阅读程式码不需要从第一行读起,我们的目的并不是在于读遍每一段程式码。

学会分析绘制系统架构图。

2.1、阅读程式码的目的,在于了解全貌而非细节

但我们在阅读文学作品通常是采循序的方式,也就是从第一页开始,一行一行地读下去,依循作者为你铺陈的步调,逐渐进到他为你准备好的世界里。阅读程式码却大大不同。我们很少从第一行开始读起,因为除非它是很简单的单执行绪程式,否则很少这么做。因为要是这么做,就很难了解整个系统的全貌。是的,我们这边提到了一个重点,阅读程式码的目的在于了解系统的全貌,而不是在于只是为了地毯式的读遍每一段程式码。

2.2、由上而下厘清架构后,便可轻易理解组成关系

如果你想要跳脱困境,不想浪费大量时间阅读程式码,却始终只能捕捉到对系统片段认识,就必须转换到另一种观点来看待系统。从个别的类别行为着手,是由下至上(自下而上)的方法;在阅读程式码时,却应该先采由上至下(自上而下)的方式。对程式码的阅读来说,由上至下意谓着,你得先了解整个系统架构。

2.3、了解架构,必须要加上层次感

不要忘了,我们采取的是由上而下的方式,要先摸清楚主建筑结构,至于壁纸的花色怎么处理,那是到了尾声时才会做的事。

2.4、探索架构的第一件事:找出系统如何初始化

系统如何初始化是很重要的一件事,因为初始化是为了接下来的所有事物而做的准备。

要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。

3、优质工具在手,读懂程式非难事

系统的复杂度往往超过人脑的负荷。阅读程式码的时候,你会需要更多工具提供协助。使用好的整合式开发环境( IDE )的或文字编辑器,就能提供最基本的帮助。

善于使用各种优秀的IDE,方便跟踪阅读。

3.1、善用文字编辑器或IDE中,加速解读程式码

3.2、grep是一个基本而极为有用的工具

3.3、gtags可建立索引,让搜寻更有效率

3.4、再搭配htags制作的HTML文件,更是如虎添翼

4、望文生义,进而推敲组件的作用

先建立系统的架构性认识,然后透过名称及命名惯例,就可以推测出各组件的作用。例如:当Winamp尝试着初始化一个插件时,它会呼叫这个结构中的初始化函式,以便让每个插件程式有机会初始化自己。当Winamp打算结束自己或结束某个插件的执行时,便会呼叫退出函式。

必须熟悉常用的软件词汇,熟悉各种命名习惯,方便推敲类或者方法的含义。学会阅读和使用UML类图。

4.1、好的说明文件难求,拼凑故事的能力很重要

你可以利用熟悉或者自己发明的表示工具,描述你所找到的情境。甚至可以只利用简单的列表,直接将它们列出。只要能够达到记录的目的,对程式码阅读来说,都能够提供帮助。或者,你也可以利用基于UML中的类别图,合作图,循序图之类的表示方法,做出更详细的描述。

4.2、探索架构的第一步─ ─找到程式的入口

4.3、系统多会采用相同的架构处理插件程式

4.4、随着实务经验,归纳常见的架构模式

4.5、善用名称可加速了解

“望文生义”很重要,我们看到函式的名称,就可以猜想到它所代表的作用。

5、找到程式入口,再由上而下抽丝剥茧

根据需要决定展开的层数,或展开特定节点,并记录树状结构,然后适度忽略不需要了解的细节─这是一个很重要的态度。因为你不会一次就需要所有的细节,阅读都是有目的的,每次的阅读也许都在探索程式中不同的区域。

探索系统架构的第一步,就是找到程式的入口点。找到入口点后,多半采取由上而下(自上而下)的方式,由最外层的结构,一层一层逐渐探索越来越多的细节。

5.1、展开的同时,随手记录树状结构

5.2、无法望文生义的函式,先试着预看一层

对于某些不明作用的函式叫用,不是望其文便能生其义的。当我们看到“ itunesdb_init_cc ( ) ”这个名称时,我们或许能从“ itunesdb_init ”的字眼意识到这个函式和苹果所采用的的iTunes数据库的初始化有关,但“循环”却实在令人费解。为了理解这一层某个子动作的真实意义,有时免不了要往前多看一层。

5.3、根据需要了解的粒度,决定展开的层数

适度地忽略不需要了解的细节,是一个很重要的态度,因为你不会一次就需要所有的细节,阅读都是有目的的。每次的阅读也许都在探索程式中不同的区域;而每次探索时,你都可以增补树状结构中的某个子结构。渐渐地,你就会对这个程式更加的了解。

6、阅读的乐趣:透过程式码认识作者

即便每个人的写作模式多半受到他人的影响,程式人通常还是会融合多种风格,而成为自己独有的特色,如果你知道作者程式设计的偏好,阅读他的程式码就更得心应手。

建立架构观点的认识是最重要的事情。虽然这一系列的文章前提为“阅读他人的程式码” ,但我们真正想做的工作,并不在于彻底地详读每一行程式码的细节,而是想要透过重点式的程式码“摘读” ,达到对系统所需程度的了解。

6.1、阅读程式码是新时代程式人必备的重要技能

由上而下的阅读方式,是因为我们重视架构更胜于细节。

6.2、好的名称能够摘要性地点出实体的作用

6.3、转换立场,理解作者的思考方式

6.4、从程式码着手认识作者独有的风格,进而见贤思齐

本文作者: arthinking

本文链接: https://www.itzhai.comread-the-source-code-of-open-source-projects-it-house-programming-to-share.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。