近期在阅读一个陌生Java项目的过程中,学习了“断点回溯法”,也亲测了几个代码阅读工具。这里简单分享一下工具的使用体验。
Idea Debugger
大部分同学应该都是使用 Debugger 方法来读代码的,其最大的好处就是可以逐行展示出运行时堆栈和数据。
但 Debug 模式只能维持当前一个堆栈上下文,还不能回退,这就带来了两个问题:
- 需要很多次操作,才能搞清楚流程的来龙去脉
- 需要人脑存储不同的堆栈上下文,遇到复杂项目,直接内存溢出而罢工
因此,这种朴素的方式是比较费劲的。
Debugger-to-Uml
有少部分 jy 提到了这个工具,我就去体验了一下。这是对“Debugger”的一个增强。简单来讲,就是可以把一个堆栈转换成序列图。
体验下来,感觉有点点用,但是不大。毕竟,堆栈就是一个线性的序列,没有分叉。
唯一有点超出预期的地方就是,这个工具可以筛选包名,可以针对性看某个局部。这在一个堆栈非常长的时候,有点用。
在看堆栈的时候,有一个真正的问题,大家却都没有解决,那就是抽象类的问题。比如上面这个堆栈,可以看到很多 Filter 都显示是”OncePerRequestFilter“,这明显不符合预期的,按照Chain的设计模式,一般不会有重复的 Filter。而堆栈之所以这样显示,是因为 OncePerRequestFilter 是一个基础父类,很多Filter都是继承了它去实现的。但这些继承的子类,在堆栈中,却没有展现出来。这个问题,在第一次看代码时,很容易懵逼!
SequenceDiagram
这是比较老的一个静态代码序列图工具。 安装插件后,随便找到一个函数,右键“SequenceDiagram” 就可以生成一个序列图。
这个插件最大的优点是简便易用,但缺点也很明显:
- 生成的是静态序列图,没有运行时数据可以参考,不能协助去除分支和抽象,
- 对于设计模式,没办法有效地展现(比如上图本应该是一个Chain模式,但序列图无法知道下一个Filter是什么)
而现代程序越来越复杂,分支抽象,设计模式充斥其中。 个人体会下来,SequenceDiagram 更多地是一种画图工具,主要用来总结代码,对于阅读陌生代码作用比较有限。
XCodeMap
XCodeMap,动态生成上下文序列图,5分钟就能读懂源码,解决问题。
其官网描写的优势有:
- 免分支抽象
- 免设计模式
- 免反复Debug
其能做到这一点,主要是因为其采集了程序的运行时数据,并保存下来,像分析型数据库一样进行分析。
XCodeMap 一个出乎意料的工具,有很多创新的功能,我的好多文章,都是在它的帮助下完成的。
详情可以查看官网 xcodemap.tech/ 。
体验下来,Idea Debugger 仍然是必不可少的工具,而 XCodeMap 则是一个非常有潜力的工具,在快速进步中,有望改变整个竞争现状,