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

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

程序界有个老传统,学习新技术时都是从「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. ESP32:蓝牙BLE控制M3508电机

    ESP32:蓝牙BLE控制M3508电机 先给各位朋友拜个年,祝大家新春快乐,事事顺利,身体健康啊! 还是熟悉的3508,内容概述: ESP32主控 蓝牙BLE通信 使用实时系统(FreeRTOS) ...

  2. django入门 02 初探app、view、url、templates、static

    创建APP命令 python manage.py startapp myapp app组成介绍 如上图,在终端中展示树状结构-- windows为 tree /f macOS为 tree 注册APP ...

  3. 【SimuPy】Python实现的Simulink 文档翻译全部完毕

    作者:CycleUser 前情回顾: 前些天在和@iGuo.@白小鱼以及@12334在关于如何看待哈工大.哈工程受美商务部「实体名单」影响,被禁止使用 MATLAB 商业软件?的问题中讨论到了 sim ...

  4. C#运算符重载---逐步地分析与理解

    1.什么是运算符重载 定义:(百科定义)就是把已经定义的.有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能.操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过 ...

  5. VC里打开网页

    转载请注明来源:https://www.cnblogs.com/hookjc/ 1     ShellExecute 开放分类: API 编程 ShellExecute函数原型及参数含义如下: She ...

  6. 2021羊城杯比赛复现(Crypto)

    bigrsa 题目: from Crypto.Util.number import * from flag import * n1 = 10383529640908175186077053551474 ...

  7. Kubernetes 集群日志 和 EFK 架构日志方案

    目录 第一部分:Kubernetes 日志 Kubernetes Logging 是如何工作的 Kubernetes Pod 日志存储位置 Kubelet Logs Kubernetes 容器日志格式 ...

  8. 1、架构--架构图、Iptables(简介、四表五链、流程图、使用、扩展模块)、包过滤防火墙

    笔记 1.画架构图 2.Iptables 1.1 什么是防火墙 防止别人恶意访问. 1.2 防火墙种类 硬件防火墙 F5 软件防火墙 iptables firewalld 安全组 3.Iptables ...

  9. 利用脚本快速执行Dockerfile以及docker镜像的启停与删除

    `关于脚本:` 'sh setup.sh build' # 将Dockerfile创建成镜像 'sh setup.sh run' # 启动build创建好的镜像,放到后台运行 'sh setup.sh ...

  10. IDEA一键部署SpringBoot项目到服务器

    1. 安装Alibaba Cloud Toolkit插件 2. 配置部署环境 2.1 为本次部署设置一个名字 2.2 选择被部署文件的生成方式 IDEA提供了三种方式:Maven Build,Uplo ...