在本专题第一篇,我们已经知道了不正确的阅读源码的方法,那正确的阅读源码的方式是什么呢?
其实很简单,我总结为四步:
建模:基于源码进行建模
梳理:基于模型进行流程的梳理
归纳:对梳理出的流程进行归纳,再整合进模型中
延伸:在建模、梳理、归纳中触类旁通,与其它项目或技术点产生关联,扩大知识面
这四步又可以细分为可操作的十个步骤(后面的十篇文章将对每一步进行详细的讲解,保证可操作性):
「通过demo,构建黑盒模型」:一般我们接触项目的第一步都是编写一个HelloWorld,我们应该如何看待这个HelloWorld小demo呢?跑起来就ok了吗?你有没有想过,你可能小看了这个demo?这个demo可能有你想象不到的大功效?本节将讲解如何通过demo构建出黑盒模型,使你对项目有一个最初的了解。
「阅读文档,了解概念模型」:完善的开源项目都会有比较完善的文档,你有没有好好读过项目文档?该怎么读项目文档?你能从项目文档里收获到什么呢?本节将讲解如何阅读项目文档,以及如何从项目文档构建出概念模型。
「根据模块依赖,找出核心模块」:一般我们在项目的设计阶段会绘制架构图,架构图一般表示的是模块之间的关系。那我们在阅读源码时能反过来找到这些模块吗?又如何确定这些模块之间的关系呢?本节将详细讲解如何通过源码反推出模块依赖,以及找出核心模块的方法。
「根据类依赖,构建抽象模型」:我们在开发设计的时候一直说着建模建模,我们在阅读源码的时候有思考过如何找到这些模型吗?我们该怎么找到这些模型呢?本节将详细讲解如何找出核心类,并通过核心类构建出抽象模型。这个模型就是项目的核心。
「根据抽象模型,梳理核心流程」:如果通过debug的方式不是梳理流程的好方法,那么什么样的方式是梳理流程的好方法呢?本节将详细讲解如何基于核心模型快速的梳理出核心流程。
「画图加深理解」:我们90%的信息来源于眼睛,画图能加深我们对项目的理解,那我们在阅读源码的时候该如何画图呢?本节将详细讲解如何绘制核心流程图,并将核心流程图整合进概念模型中,得到一个更完整的模型。
「阅读扩展模块,补充执行流程」:核心模块虽然是一个项目最重要的部分,但是必要的辅助流程也是整个项目流程中不可或缺的一部分。我们该如何梳理这些辅助流程呢?本节将详细讲解如何从核心流程梳理出辅助流程,以完善整个项目流程。
「理解核心流程设计」:我们梳理了核心流程,那为什么作者要这么设计呢?这么设计是基于哪些考量呢?本节将基于核心流程来理解具体的代码设计。
「关联延伸阅读」:一个项目可能会和其它的项目有关系,那我们该如何梳理这些关系呢?比如:Spring中使用了JUnit,它们是如何关联的呢?本节通过Spring使用JUnit的例子来讲解如何进行关联延伸阅读,使得两个项目的代码逻辑串联起来。
「不同版本之间源码的阅读」:一个项目会有很多的版本,我们读了一个版本,其它的版本还需要读吗?该如何读呢?本节通过JUnit3与JUnit4的源码对比来讲解不同版本之间的阅读方法。
注意,上面的流程不一定按顺序进行,比如:
有的人是实践派,那么可以先「编写demo,构建黑盒模型」;有的人是概念派,可以先「阅读文档,了解概念模型」
而「画图」则贯穿了源码阅读的整个过程
「关联延伸阅读」、「不同版本之间源码的阅读」则是非必选项
示例说明
专题后续的章节将使用JUnit来演示具体的流程。选择JUnit来作为示例,主要基于如下几个原因:
代码量相对较少,便于讲解:本专栏的目的是讲解一种高效阅读的方法,而不是对某个项目的源码的具体讲解,主要讲的是方法。如果选择代码量很大的项目,比如Spring,那么讲解代码本身就要耗费很大的篇幅,而阅读源码的方法可能就被代码给淹没了。
结构清晰:好的项目,一般都有一个比较好的结构。JUnit自开发出来后,就被称赞结构清晰,且使用了多种设计模式。在学习源码的同时,可以理解设计模式在项目中的应用。
文档齐全:好的项目,也应该是文档齐全的。JUnit有官方网站,有较完善的文档。对阅读源码有很大的帮助
测试框架事实上的标准:虽然在单元测试里,还有如TestNG这样的开源项目,但是一般情况下,使用JUnit进行单元测试的项目更多。JUnit可以说就是测试框架事实上的标准。学习标准项目的收益更高,既学习到了知识,又能在实际工作中使用,加深印象。同时,后面如果要学习同类型项目也会轻松很多。
版本迭代:JUnit从JUnit3,JUnit4一直到JUnit5,新版本都对老版本做了兼容。多版本比较阅读,能理解项目的发展,为什么会这么发展。由于JUnit5已经发展成了测试平台,这里不做讨论,只讨论JUnit3和JUnit4。
总结
本文给出了源码阅读的一个整体流程,后面的章节将通过基于JUnit的演示,来详细的说明每一个步骤的具体做法。