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

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

程序界有个老传统,学习新技术时都是从「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. 用Json给表单赋值

    $.extend({ setForm :function(frm,jsonValue) { var obj=$(frm); $.each(jsonValue, function (name, ival ...

  2. java下载网络大文件之内存不够的解决办法(包含分片上传分片下载)

    一.背景 2020年11月份的时候,我做过一个项目,涉及到网络文件,比如第三方接口提供一个文件的下载地址,使用java去下载,当时我全部加在到JVM内存里面,话说,单单是80M的下载单线程没问题,但是 ...

  3. Cocos2d-JS环境配置教程

    最近感觉还有时间,就在CSDN上再写一篇,顺便把一些错误纠正,下面开始正文,这里的Cocos2d-JS是3.0版本.这里环境配置还是有一些坑的,希望可以帮到看博客的你. 一.准备工作 1.安装pyth ...

  4. JavaScript检查Date对象是否为Invalid Date

    使用Date()构造日期对象,如果传入非日期格式的字符串,仍然能构造出Date对象. 在chrome控制台 >var date = new Date("hello"); &g ...

  5. axios取消接口请求

    axios取消请求 这里就是分析一下接口请求需要被取消时的一些操作 因为我是用vue写的项目,所以标配用的是axios,怎么在axios中取消已经发送的请求呢? 1.在这之前我们还是先介绍一下原生js ...

  6. 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'

    书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...

  7. Maven多环境配置实战 filter

    目前在开发一个wap项目,主要有开发.测试和最终部署上线几个阶段,每个阶段对配置(数据库.日志)都有不同的设置.以前都是以开发环境为主,在测试和部署上线时由部署工程师负责修改配置并上线.但是公司并非都 ...

  8. 《PHP程序员面试笔试真题解析》——新书上线

    你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚 ...

  9. Solution -「CF 1375G」Tree Modification

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个结点的树,每次操作选择三个结点 \(a,b,c\),满足 \((a,b),(b,c)\in E\),并令 ...

  10. Office RTF远程模板注入

    远程模板插入   ProofPoin最近写了一篇文章,报告中提到近年来RTF模板注入进行office钓鱼攻击的数量增加.之前还没怎么了解过RTF模板注入的,现在和小编一起去看看吧(笑hhh).   相 ...