上一篇文章中,我向大家汇报了 CA 的诞生,定位,能力与使用,今天向各位汇报下 CA 的设计与实现。
Tips:在设计 CA 的整体流程时,我们预设了一个前提,待分析的项目是通过 Maven 构建的 Java 项目,并使用 Git 进行版本控制。
CA 的流程设计
我们先来回顾下上一篇文章中提到的 CA 的两个核心功能:
- 功能 1: 根据分支间的差异,解析到本次修改的方法,并分析出方法的调用链路;
- 功能 2: 通过指定类型和方法,分析该类型中的指定方法,在程序中的调用链路。
在功能 1 中,CA 需要做 3 件事情:
- 对比分支间差异,解析到发生变更的方法;
- 通过发生变更的方法,生成方法调用链路;
- 使用方法调用链路,输出不同形式的报告。
在功能 2 中,CA 只需要做两件事:
- 通过用户指定的方法,生成方法调用链路;
- 使用方法调用链路,输出不同形式的报告。
可以看到,功能 1 和功能 2 都要分析方法的调用链路,输出不同形式的报告,只不过对于功能 1 来说,这个方法是分支对比后的结果,对于功能 2 来说,这个方法是用户指定的,那么功能 2 就相当于功能 1 的子集,我们只需要完成功能 1 的设计,并将公共的部分提取出来,复用到功能 2 中就可以了。
对于这种情况,我们首先想到的是使用责任链模式来设计 CA 的主流程,责任链中每个节点负责独立的逻辑处理,CA 只需要根据功能来组装责任链的节点就可以实现不同的需求了,那么我们的初版的设计如下图所示ÿ