掘金 后端 ( ) • 2024-04-19 16:49

近期在阅读一个陌生Java项目的过程中,学习了“断点回溯法”,也亲测了几个代码阅读工具。这里简单分享一下工具的使用体验。

  1. SequenceDiagram

大名鼎鼎的 SequenceDiagram,可能有不少小伙伴们已经在使用的了,毕竟序列图是最接近于真实业务流程的表达形式。

安装插件后,随便找到一个函数,右键“SequenceDiagram” 就可以生成一个如下形式的图。

image.png 这个插件最大的优点是简便易用,但缺点也很明显:

  • 生成的是静态序列图,不能反映真实的请求运行情况,没有运行时数据可以参考
  • 对于抽象类和实现,没办法有效地展现(比如上图本应该是一个Chain模式,但序列图无法知道下一个Filter是什么)
  • 细节无差别地展示,重点不突出,遇到复杂函数,感觉会一团糟
  1. Idea Debugger

大部分同学应该都是使用 Debugger 方法来读代码的,其最大的好处就是可以展示出运行时堆栈和数据。

image.png 在上一篇文章中,介绍了“断点回溯法”,就是基于这个 Debugger 来操作的。

运用好“断点回溯法”,配合 Debugger 的运行时数据,一般来说,就是一个比较好的源码阅读体验了。

至于该方法的缺陷,之前也提到了,就是“只见局部,不见整体”,遇到复杂异步或者多线程的项目,阅读起来依然会比较费劲。

  1. Debugger-to-Uml

有少部分 jy 提到了这个工具,我就去体验了一下。这是对“Debugger”的一个增强。简单来讲,就是可以把一个堆栈转换成序列图。

体验下来,感觉有点点用,但是不大。毕竟,堆栈就是一个线性的序列,没有分叉。

唯一有点超出预期的地方就是,这个工具可以筛选包名,可以针对性看某个局部。这在一个堆栈非常长的时候,有点用。

image.png

在看堆栈的时候,有一个真正的问题,大家却都没有解决,那就是抽象类的问题。比如上面这个堆栈,可以看到很多 Filter 都显示是”OncePerRequestFilter“,这明显不符合预期的,按照Chain的设计模式,一般不会有重复的 Filter。而堆栈之所以这样显示,是因为 OncePerRequestFilter 是一个基础父类,很多Filter都是继承了它去实现的。但这些继承的子类,在堆栈中,却没有展现出来。这个问题,在第一次看代码时,很容易懵逼!

  1. XCodeMap

这是一个新兴的阅码工具,还处于测试阶段。其野心比较大,目标是”5分钟读懂一个陌生项目“。

这个有点夸张了,不过其理念还是不错的,把运行时数据和静态代码分析相结合,并且利用AI进行标注,以突出重点。

看一下效果图。

image.png 整体效果还是不错的,不过目前功能还不够完善,只能生成序列图。有兴趣的同学可以去官网申请测试 http://xcodemap.tech/

体验下来,Idea Debugger 仍然是非常重要的工具。不够,随着现代化项目越来越复杂,“只见局部不见整体”的阅码方式,效率还有较大的提升空间。这方面,XCodeMap 是一个值得期待的产品。