在《源码阅读四步走,这才是阅读源码的正确姿势》一文中,给出了源码阅读的完整步骤。
本篇是《如何高效阅读源码》专题的第四篇,正式开始讲解阅读源码的具体方法!
程序界有个老传统,学习新技术时都是从「Hello World」开始的!无论是学习新语言时打印「Hello World」;还是学习新框架时编写个demo!
对于了解语言或项目来说,编写个demo可能就够了。但是如果要阅读项目源码,仅仅是编写个demo是远远不够,你需要通过demo构建「黑盒模型」!
本节内容如下:
-
什么是黑盒模型,以及为什么要构建黑盒模型
-
如何构建黑盒模型?
-
通过demo演示构建黑盒模型的具体流程
什么是黑盒模型?
在测试里有「黑盒测试」一说!黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,程序被看作一个不能打开的黑盒子,只对程序接口进行测试,它只检查程序是否能适当地接收输入数据而产生正确的输出信息。
而所谓「黑盒模型」,即先把我们要阅读的项目看做一个黑盒子,基于这个黑盒子构建一个可以运行的模型。基于这个模型,我们可以大致的了解项目的功能流程。对项目流程有个整体的印象。
如何构建黑盒模型?
在有些讲解面向对象设计的书里,讲了如何通过需求构建简单对象模型的方法:
-
找出需求中的名词,构建为对象
-
找出需求内的动词,构建为方法
-
将对象和方法归类组合,构成业务流程
构建黑盒模型的流程和上面的流程很类似,甚至更简单,不需要你去设计,只需要梳理即可,大致流程如下:
-
编写一个具有基本功能的demo
-
把项目本身当做黑盒子,找出demo中使用到的对象,同时补充可能会用到的对象
-
基于这些对象来绘制结构图
-
基于demo梳理流程,将结构中的模块串联起来
下面以JUnit4为例,来演示此流程。
编写demo
假设,我们有一个包含say方法的Person类,这个方法接收一个String类型的参数,返回”Hello,”+arg,如下图所示:
我们通过JUnit对此类进行测试,测试代码如下图所示:
现在的IDE都集成了测试的运行环境,可以直接执行测试,这在执行测试时很方便,但是却会隐藏了一些我们需要了解的内容。
为了能更清晰的梳理测试的执行流程,我们通过命令行来执行测试(建议在运行其它项目的demo时也通过命令行执行):
java org.junit.runner.JUnitCore org.ivan.PersonTest
复制代码
执行结果如下:
JUnit version 4.12
tearDown invoke
Time: 0.014OK (1 tests)
复制代码
绘制结构图
基于上面的demo,我们来绘制对应的结构图!
上面的demo中我们可以很明显的看到四个类:
-
Person
-
PersonTest
-
Assert
-
JUnitCore(如果使用IDE来执行,那你就看不到这个类了)
实际上,应该还有一个类,用于展示结果的对象,我们这里暂且叫它Result。可能在JUnit中,它并不叫Result,但是没关系,我们现在只要知道有这么一个类即可。
找到类后,我们对这些类进行归类:
-
很明显,Person和PersonTest是我们自己编写的代码,所以属于自身项目
-
而JunitCore,Result和Assert是由JUnit提供的,所以属于JUnit
最终结构图看起来像这样。
梳理流程
基于上面的结构图并结合demo流程,我们来绘制执行流程:
-
首先,很明显JUnitCore是入口类,因为它是被Java直接调用的
-
此类调用PersonTest来执行测试
-
PersonTest调用Person执行对应方法
-
并通过Assert类的方法判定结果是否和预期的相同
-
测试结果通过Result返回,输出到命令行
这个流程是我们通过demo梳理出来的一个粗略的流程。它正确吗?不一定,不过它给了我们一个项目流程概览,我们可以基于这张图来不断的完善,从黑盒到灰盒最终到白盒,得到详细的项目执行流程。
总结
本文梳理了阅读源码的第一步「通过demo,构建黑盒模型」:
-
编写一个具有基本功能的demo
-
将开源项目本身当做黑盒子,绘制结构图
-
基于demo梳理流程,将结构中的模块串联起来
后面的文章将基于上图来不断的完善,最终得到一个相对完整的JUnit执行流程图。