重构 Java 屎山代码的一种妄想,大佬们评估一下

175 天前
 wellR

前提:

场景:

理论:

  1. java 方法在编译期会生成 AST ,每个代码结构对应语法树中的节点 node ,AST 的分支也就对应方法的代码分支逻辑,比如 if/else 结构表现在 AST 中就是一个分叉,会有两个子分支
  2. 记录一次方法调用中所有执行过的 node ,这些 node 的集合 nodes 就是这次调用实际执行的代码分支
  3. 可以将 nodes 转换为代码,就是这次调用的源码

问题

2296 次点击
所在节点    奇思妙想
18 条回复
monmon
174 天前
感觉你在找的可能是 Intellij Profile ? By the way...如果你这个 method 的执行效率不是特别离谱,没人吐槽它慢,业务能跑最好别去动它,屎山这玩意谁沾谁脏😅
jamel
174 天前
链路追踪?
yuanmomo
174 天前
当年红岭创投重构.Net 到 Java ,花钱请了阿里的外援,全线使用阿里云。当时预计半年能搞完,我给他们预计的是,一年都搞完就不错了。结果最后花了一年多,上线的时候预计 8 小时,最后好像接近 20 小时吧。

一个项目,要重构,太多的先决条件了,最重要的就是测试覆盖率。如果测试用例不够,我是绝逼不重构的。
wellR
174 天前
@jamel 嗯,与链路追踪很相似,颗粒度更小,细致到表达式,到某行代码的追踪
wellR
174 天前
@yuanmomo 对对, 要有完备的测试用例与懂业务的人协助,否则没完没了
wellR
174 天前
@monmon 接手的项目,没有文档,反而要我们开发读源码输出文档,性能不是问题。有出那么些接口负责多种业务,一堆一堆的逻辑分支,头疼,开 debugger 才勉强搞明白些。说起来 java 的 Debugger 应该是能拿到我说的“代码追踪”数据的,怎么才能拿到呢
jamel
174 天前
阿里云的 arms 可以到方法 到类,还有性能数据,很像火焰图了
Dream95
174 天前
Jacoco ?
wellR
174 天前
楼上的回答启发我了,这跟单元测试中的代码覆盖率很接近啊,只不过目标不一样,我是为了抽离代码,关注指定方法在指定输入下的实际执行的代码,而排除其它的逻辑分支的视觉干扰,降低心智负担。
monmon
174 天前
idea 的 SequenceDiagram 插件应该可以满足你的需求
monmon
174 天前
@monmon SequenceDiagram 可以解决问题一自动分析出代码的所有调用过程,但是你想要代码自动拆分 method ,这个可能不太好实现
wellR
174 天前
@monmon 好的,多谢回复,我去了解了解
ukpkmk
174 天前
<<精简代码实战:核心系统缩减 80%代码>>
https://mp.weixin.qq.com/s/30PHdlnGZ4lGm3H5VeLRWQ
以前看过的一个文章和你说的很像,也是经过一个月的随机采样,采集到 46 万流量,以此来对系统代码进行染色,得到有效函数
SoloCompany
174 天前
实际上最简单的做法是把 method 直接复制 4 份, 然后把流程控制变量变成常量, 利用 IDE 静态分析删除 dead code, 剩余的 duplicate code 通常也能被分析出来, 根据提示 extract method
wellR
174 天前
@ukpkmk 谢谢了,文章我看过了,“代码染色”很贴切的描述
tikazyq
172 天前
用图论去解决屎山问题固然很酷,但投入产出比不一定值得,特别是需要重构的代码量没到一定量级的时候。几十百来个文件需要重构的话,可能还不如人海战术重写逻辑。

还有,现在 GPT 都这么大窗口了,直接扔进去加合理的 prompt 理论上也可能有低成本的收获。

最后,养成良好的编程习惯和团队文化(例如 TDD 、代码审核),比硬啃屎山更有效和稳定。屎山代码产生的根本原因,通常来自于急功近利的老板和不够负责的技术领导。
wellR
172 天前
@SoloCompany 这也是个法子
wellR
172 天前
java 的 debugger 能获取的信息很丰富,似乎可以支撑代码分割或者代码染色的实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1044265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX