【设计背景】
当前starTool已经可以完整输出一个产品的代码地图,类似于如下
但是这样还是有一个问题,就是实际上一个产品可能有多个工程,这些工程一般都是分层的,比如某些是底层基础能力,某些上层的业务,为了更快速对产品代码有一个层次上的理解,starTool最好能识别代码结构的层次
【设计思想】
不过AOP等切面编程如果对产品代码解耦,产品仍然绕不过去的是,上层业务必然会使用底层的基础能力,而底层基础能力不能直接引用上层业务,不然就是循环依赖
以下均是使用MyBatis的源码做分析
1、实现对文件目录级的依赖分析
先实现对各个文件之间的关系做分析
第一阶段日志结果如下,MyBatis总共51个文件夹,count等于50说明和其他文件夹没有依赖,count越小说明依赖其他文件夹的越多:
2018-09-08 10:03:58,848 - 14904 - code - total folder count 51
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.transaction] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.reflection.property] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.reflection.invoker] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.reflection.factory] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.plugin] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.parsing] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.stdout] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.nologging] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.logging] count [50]
2018-09-08 10:03:58,848 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.parameter] count [50]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.exceptions] count [50]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.datasource.jndi] count [50]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.datasource] count [50]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.cursor] count [50]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.type] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.slf4j] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.log4j2] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.log4j] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.jdk14] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.commons] count [49]
2018-09-08 10:03:58,849 - 14904 - code - folder name [main.java.org.apache.ibatis.jdbc] count [49]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.io] count [49]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.datasource.unpooled] count [49]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.cache.impl] count [49]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.transaction.managed] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.transaction.jdbc] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.scripting] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.logging.jdbc] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.cache.decorators] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.cache] count [48]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.reflection.wrapper] count [47]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.result] count [47]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.loader.javassist] count [47]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.loader.cglib] count [47]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.datasource.pooled] count [47]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.reflection] count [46]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.cursor.defaults] count [46]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.binding] count [46]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.session.defaults] count [45]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.keygen] count [45]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.scripting.xmltags] count [44]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.scripting.defaults] count [44]
2018-09-08 10:03:58,851 - 14904 - code - folder name [main.java.org.apache.ibatis.builder] count [44]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.builder.annotation] count [43]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.statement] count [42]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.loader] count [42]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.mapping] count [41]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.executor.resultset] count [40]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.executor] count [38]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.builder.xml] count [37]
2018-09-08 10:03:58,852 - 14904 - code - folder name [main.java.org.apache.ibatis.session] count [33]
由于整个文件夹个数是51个,所以count等于50的就是基础能力,而count越小的就越是上层业务建筑
但是上面的有两个问题:
1、目录级别不一样,结果不一定准确,有些文件夹可能只是放接口
2、衡量标准不全
第二阶段:
1、针对问题1,修改代码,统计只分析给定目录级别
2、针对问题2,修改代码,增加3个衡量标准,
a:no relation,表示两个目录之间没有直接联系
b:dependence,表示两个目录之间,a依赖b
c:reference,表示两个目录之间,b使用了a
结果如下:
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.cursor] no relation count [17] dependence count [0] reference count [0]
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.exceptions] no relation count [17] dependence count [0] reference count [0]
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.plugin] no relation count [16] dependence count [0] reference count [1]
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.parsing] no relation count [16] dependence count [0] reference count [1]
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.datasource] no relation count [16] dependence count [0] reference count [1]
2018-09-09 20:19:04,969 - 17644 - code - folder name [main.java.org.apache.ibatis.jdbc] no relation count [15] dependence count [2] reference count [0]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.logging] no relation count [15] dependence count [0] reference count [2]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.io] no relation count [14] dependence count [0] reference count [3]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.scripting] no relation count [14] dependence count [2] reference count [1]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.binding] no relation count [13] dependence count [4] reference count [0]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.transaction] no relation count [13] dependence count [0] reference count [4]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.cache] no relation count [12] dependence count [1] reference count [4]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.type] no relation count [11] dependence count [2] reference count [4]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.reflection] no relation count [11] dependence count [1] reference count [5]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.builder] no relation count [10] dependence count [6] reference count [1]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.executor] no relation count [10] dependence count [6] reference count [1]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.mapping] no relation count [7] dependence count [8] reference count [2]
2018-09-09 20:19:04,970 - 17644 - code - folder name [main.java.org.apache.ibatis.session] no relation count [5] dependence count [12] reference count [0]
这个结果就相对比较清晰了,没有被引用而依赖很多其他组件的一般就是最上层的代码,而没有依赖却引用比较多的就是基础代码
当然日志的形式还是不如表格的形式,继续修改为表格:
name | no_relation | dependence | reference |
main.java.org.apache.ibatis.cursor | 17 | 0 | 0 |
main.java.org.apache.ibatis.jdbc | 15 | 2 | 0 |
main.java.org.apache.ibatis.parsing | 15 | 1 | 1 |
main.java.org.apache.ibatis.datasource | 15 | 1 | 1 |
main.java.org.apache.ibatis.io | 14 | 0 | 3 |
main.java.org.apache.ibatis.plugin | 14 | 1 | 2 |
main.java.org.apache.ibatis.logging | 14 | 1 | 2 |
main.java.org.apache.ibatis.scripting | 13 | 3 | 1 |
main.java.org.apache.ibatis.transaction | 12 | 1 | 4 |
main.java.org.apache.ibatis.cache | 11 | 2 | 4 |
main.java.org.apache.ibatis.binding | 11 | 6 | 0 |
main.java.org.apache.ibatis.type | 10 | 3 | 4 |
main.java.org.apache.ibatis.reflection | 10 | 2 | 5 |
main.java.org.apache.ibatis.builder | 9 | 7 | 1 |
main.java.org.apache.ibatis.executor | 9 | 7 | 1 |
main.java.org.apache.ibatis.mapping | 7 | 8 | 2 |
main.java.org.apache.ibatis.session | 4 | 13 | 0 |
main.java.org.apache.ibatis.exceptions | 4 | 0 | 13 |
还可以打印出每个模块下面的详情(CSDN排版排的好乱,只好改成图片,还有一部分图片被截断了)
这样基本可以对代码的层次能有一个认识,但是这种表现形式仍不够直观,最直观的就是图形。
试着基于networkx画出图形
(未完待续)