在《源码阅读四步走,这才是阅读源码的正确姿势》一文中,给出了源码阅读的完整步骤。

本篇是《如何高效阅读源码》专题的第四篇,正式开始讲解阅读源码的具体方法!

程序界有个老传统,学习新技术时都是从「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执行流程图。

HelloWorld:通过demo,构建黑盒模型的更多相关文章

  1. 使用Flask构建机器学习模型API

    1. Python环境设置和Flask基础 使用"Anaconda"创建一个虚拟环境.如果你需要在Python中创建你的工作流程,并将依赖项分离出来,或者共享环境设置," ...

  2. 机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)

    函数说明 1.LDA(n_topics, max_iters, random_state)  用于构建LDA主题模型,将文本分成不同的主题 参数说明:n_topics 表示分为多少个主题, max_i ...

  3. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&构建使用jquery来实现

    使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这篇文章进行安装和破解 ...

  4. 从头认识java-13.5 利用泛型构建复杂模型

    这一章节我们来展示一下如何利用泛型构建复杂模型? 1.元组列表 我们之前已经说过元组是一个复杂的模型,能够返回多对象. package com.ray.ch11; import java.util.A ...

  5. Java编程思想:构建复杂模型

    import sun.nio.cs.Surrogate; import java.util.ArrayList; import java.util.Random; public class Test ...

  6. PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品,产品设计严格遵循国际数据挖掘标准CRISP-DM(跨行业数据挖掘过程标准),具备完备的数据准备、模型构建、模型评估、模型管理、海量数据处理和高纬数据可视化分析能力。

    http://www.meritdata.com.cn/article/90 PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品, ...

  7. 硬货 | 手把手带你构建视频分类模型(附Python演练))

    译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...

  8. 使用 keras 和 tfjs 构建血细胞分类模型

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识!

  9. pytorch入门2.2构建回归模型初体验(开始训练)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

随机推荐

  1. glibc-2.18升级

    1.下载文件下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.18.tar.gz 2.安装部署解压tar -zxvf glibc- ...

  2. 细说string和stringbuffer

    ========================================================================================= 在我看来,学习jav ...

  3. Nodejs ORM框架Sequelize(模型,关联表,事务,循环,及常见问题)

    1.建立连接 const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username ...

  4. 利用纯代码写出一个秒表表盘的方法 —— #DF

    @interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...

  5. TableView 常用技巧与功能详解

    分割线顶格iOS8 UITableview分割线顶格的做法 //iOS8 Cell分割线顶格 if ([_tableView respondsToSelector:@selector(setSepar ...

  6. JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍

    一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式   方式一:直接赋值法 String str1 = "hello"; 方式 ...

  7. 配置docker的DNS

    方式一:在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS: { "dns" : [ "114.114.114.114 ...

  8. Solution -「LOJ #6029」「雅礼集训 2017」市场

    \(\mathcal{Description}\)   Link.   维护序列 \(\lang a_n\rang\),支持 \(q\) 次如下操作: 区间加法: 区间下取整除法: 区间求最小值: 区 ...

  9. [入门到吐槽系列] Webix 10分钟入门 二 表单Form的使用

    前言 继续接着上一篇的webix入门:https://www.cnblogs.com/zc22/p/15912342.html.今天完成剩下两个最重要的控件,表单和表格的使用.掌握了这两个,整个Web ...

  10. 【Python自动化Excel】pandas处理Excel的“分分合合”

    话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...