【代码分析工具】starTool支持梳理代码层次

【设计背景】

当前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]

这个结果就相对比较清晰了,没有被引用而依赖很多其他组件的一般就是最上层的代码,而没有依赖却引用比较多的就是基础代码

当然日志的形式还是不如表格的形式,继续修改为表格

nameno_relationdependencereference
main.java.org.apache.ibatis.cursor1700
main.java.org.apache.ibatis.jdbc1520
main.java.org.apache.ibatis.parsing1511
main.java.org.apache.ibatis.datasource1511
main.java.org.apache.ibatis.io1403
main.java.org.apache.ibatis.plugin1412
main.java.org.apache.ibatis.logging1412
main.java.org.apache.ibatis.scripting1331
main.java.org.apache.ibatis.transaction1214
main.java.org.apache.ibatis.cache1124
main.java.org.apache.ibatis.binding1160
main.java.org.apache.ibatis.type1034
main.java.org.apache.ibatis.reflection1025
main.java.org.apache.ibatis.builder971
main.java.org.apache.ibatis.executor971
main.java.org.apache.ibatis.mapping782
main.java.org.apache.ibatis.session4130
main.java.org.apache.ibatis.exceptions4013

还可以打印出每个模块下面的详情(CSDN排版排的好乱,只好改成图片,还有一部分图片被截断了)

这样基本可以对代码的层次能有一个认识,但是这种表现形式仍不够直观,最直观的就是图形。

试着基于networkx画出图形

(未完待续)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值