Dead Code Clean

优质博文:IT-BLOG-CN

一、死代码产生的原因

任何项目随着时间的推进,代码量通常会持续上涨,总会积累出死代码,死代码可能是一些久远的

配置,或者只在某个历史阶段有效的业务代码。它的产生原因大致有如下几种:

1、所谓默认规则,If it's not broke, don't fix it;

2、很难百分之百地确定某些代码真的无用;

3、相对于日常的业务迭代等工作,代码清理的优先级不高;

二、死代码的定义

死代码通常包括如下两种:

1、不可达代码

不会被执行的代码,又可被细分为控制流不可达和分支不可达,具体定义如下:

控制流不可达:如果不存在从程序入口到达某一段代码的路径,则该段代码就是控制流不可达。

分支不可达:对于分支语句(if & switch),如果条件值是固定的,则其中一个分支都不会被走到,这些分支的代码即为分支不可达。

2、无用代码

会被执行,但执行结果不会被用到的代码

三、死代码的代价

1、人工清理的话,需要耗费相当的时间和精力,并且可能需要周期性地去执行;

2、系统复杂度高,这主要会带来两个方面的影响:

(1)新人学习成本较高,虽然代码已经僵死,但新人学习时往往难以区分,所以还是会

耗费一定的精力去熟悉可能早已僵死的代码;

(2)在排查问题时这些死代码也会产生干扰,进而导致排查成本的上升,也容易导致误判;

3、维护成本高,编译、执行单测、打镜像,以及一些技术债的升级等,都会带来一定的开销,进而影响

业务的迭代效率;

四、如何清理代码?

代码清理分两步,一是要定位需要被清理的代码,二是执行删除动作。

定位

静态分析 静态分析工具的最大好处就是在软件开发流程的早期阶段对代码进行检测,目前行业内正在被使用的静态

代码分析工具如下:https://github.com/analysis-tools-dev/static-analysis#java

工具 分类 优点 缺点 简介
Spoon 全能 功能强大,扩展性好,API更易使用,支持更多的Java版本 Spoon is a metaprogramming library to analyze and transform Java source code. It parses source files to build a well-designed AST with powerful analysis and transformation API. Can be integrated in Maven and Gradle.
Soot 全能 功能强大 难以跟上Java快速的升级节奏 A framework for analyzing and transforming Java and Android applications.
JavaParser 全能 功能强大,解析速度较快,支持更多的Java版本 易用性较低 Java 1-17 Parser and Abstract Syntax Tree for Java with advanced analysis functionalities.
IntelliJ IDEA 插件 开发工具内嵌支持 需人工操作 Comes bundled with a lot of inspections for Java and Kotlin and includes tools for refactoring, formatting and more.
Checkstyle、FindBugs、PMD 专项工具 现成插件或sonar集成 功能单一 check code style、find potential bug

执行分析 对于死代码检测来说,最准的就是统计那些在实际程序运行中没有被执行过的方法等。

工具 分类 优点 缺点 简介
Arthas、NewRelic、PinPoint、dingjs/javaagent、CodeKvast、DongTai、Scavenger JavaAgent 代码无侵入 有一定性能损耗 利用java自带的instrument特性+javassist字节码编辑技术,可以实现低损耗、无侵入的代码方法执行等监控。
Jacoco JavaAgent 代码无侵入,分析可到代码行 代码膨胀,有一定性能损耗,会产生覆盖率的计算偏差 Jacoco是通过agent在字节码中插入boolean数组,来标记每句可执行代码,只要执行过相应语句,boolean数组会产生相应标记(true or false),这个boolean数组连同产生的标记称之为探针(Probe)。
Serviceability Agent Jhsdb JVM自带工具 代码无侵入,性能无损耗 需attach java进程,依赖jdk版本,不同的版本可能不通用,attach时会暂停目标进程 SA是HotSpot工程师开发的用于调试的工具集,它可以探视JVM的运行时数据。
Spring AOP Spring AOP 实现简单 代码有侵入,有一定的性能损耗,对于静态方法等无法支持 通过AOP的拦截,为目标对象提供增强功能,低侵入,有一定的性能损耗。

五、清理

根据上面定位的死代码,清理按便捷程度分为人工和自动化两种。

人工

根据定位的死代码路径,人工做代码删除,提交MR,审核后合并代码。

优点:安全

缺点:仍有一定的费力度

自动化

根据定位的死代码路径,自动创建分支,利用JavaParser等工具重写代码,自动提交MR,人工审核后合并代码。

优点:链路自动化

缺点:为了安全起见,最后阶段仍需人工审核。

代码工具:

JGit,可完成Git一些基本操作。
https://git-scm.com/book/en/v2/Appendix-B%3A-Embedding-Git-in-your-Applications-JGit

六、Code Clean设计方案

结合上面静态分析和执行分析各工具的优缺点,一个相对比较合适的方案是Spoon + SA + JGit,大致方案如下:


七、Config Clean

基于上面的设计方案,可以扩展支持配置的自动化清理,具体方案如下所示:

八、项目推进

代码清理整体项目较大,基于实现复杂度及开发周期两方面考量,计划采取分布推进的方式,具体如下:

1、基于静态分析的配置清理,限定QConfig;

2、代码静态分析;

3、清理的自动化(自动拉取分支->代码清理生成→自动提交MR);

4、代码执行分析;

5、基于静态+执行分析结果的代码自动化清理;

相关推荐
子兮曰8 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!8 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰8 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里8 小时前
java中的继承和多态的区别
java
小羊没烦恼!8 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝8 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕8 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码9 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖9 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时9 小时前
01-06-A-JVM排查实战详解
java·jvm