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、基于静态+执行分析结果的代码自动化清理;
原文地址:https://blog.csdn.net/zhengzhaoyang122/article/details/144329358
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!