Dead Code Clean

news2025/1/7 22:42:38

优质博文: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、ScavengerJavaAgent代码无侵入有一定性能损耗利用java自带的instrument特性+javassist字节码编辑技术,可以实现低损耗、无侵入的代码方法执行等监控。
JacocoJavaAgent代码无侵入,分析可到代码行代码膨胀,有一定性能损耗,会产生覆盖率的计算偏差Jacoco是通过agent在字节码中插入boolean数组,来标记每句可执行代码,只要执行过相应语句,boolean数组会产生相应标记(true or false),这个boolean数组连同产生的标记称之为探针(Probe)。
Serviceability Agent JhsdbJVM自带工具代码无侵入,性能无损耗需attach java进程,依赖jdk版本,不同的版本可能不通用,attach时会暂停目标进程SA是HotSpot工程师开发的用于调试的工具集,它可以探视JVM的运行时数据。
Spring AOPSpring 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、基于静态+执行分析结果的代码自动化清理;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理,基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…

What is load balancing? 什么是负载均衡?

原文链接 What Is Load Balancing? | IBM 什么是负载均衡? 在多台服务器之间高效的分配网络流量的过程,以优化应用程序的可用性,同时确保积极的用户体验。 电商网站依赖负载均衡(load balancing)来确保web应用能够无…

【C++算法】40.模拟_N 字形变换

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 6. N 字形变换 题目描述: 解法 解法一:模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去,最后从左往右读取。 解法二:模拟优化-…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

期末复习-计算机网络

目录 第四章&#xff1a;网络层 1. 虚电路服务和数据报服务的对比 2. 分类的 IP 地址 3. IP 地址与硬件地址&#xff0c;地址解析协议 ARP 4. IP 数据报的格式 5. IP 层转发分组的流程 6. 划分子网&#xff08;子网掩码、划分子网、使用子网时分组的转发&#xff09; …

20分钟入门solidity(1)

1. Solidity简介 Solidity是一种静态类型编程语言&#xff0c;专门用于在以太坊区块链上编写智能合约。它借鉴了JavaScript、Python和C的语法&#xff0c;非常适合开发在以太坊虚拟机&#xff08;EVM&#xff09;上运行的应用程序。 智能合约&#xff1a;表达商业、法律关系的…

【毕业设计选题】数据科学与大数据专业毕业设计选题与建议

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

AI开源南京分享会回顾录

AI 开源南京分享会&#xff0c;已于2024年11月30日下午在国浩律师&#xff08;南京&#xff09;事务所5楼会议厅成功举办。此次活动由 KCC南京、PowerData、RISC-Verse 联合主办&#xff0c;国浩律师&#xff08;南京&#xff09;事务所协办。 活动以“开源视角的 AI 对话”为主…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

架构学习第六周--Kubernetes(二)

目录 一、Service与服务发现 1.1&#xff0c;Service资源基本概念 1.2&#xff0c;名称解析 二、应用编排 2.1&#xff0c;Deployment控制器 2.2&#xff0c;DaemonSet和StatefulSet控制器 2.3&#xff0c;Job和CronJob控制器 三、认证体系 3.1&#xff0c;认证介绍 3…

[SWPUCTF 2021 新生赛]crypto9

[MoeCTF 2021]Web安全入门指北—GET 意思是GET传参&#xff0c;moeflag 就可以得到falg 输入?moeflag flag为&#xff1a; NSSCTF{ff26110b-8793-403c-990e-15c7f1820596} [SWPUCTF 2021 新生赛]crypto9 #gpt写的代码 from itertools import product letter_list ABCDEFG…

Python爬虫之Selenium的应用

【1】Selenium基础介绍 1.什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driv…

VSCode设置字体

参考文章&#xff1a;【面向小白】vscode最佳实践&#xff08;2&#xff09;—— 字体设置&#xff08;fira code更纱黑体&#xff09;&#xff0c;这篇文章末尾给了安装字体的链接。 配置的字体还是很好看的。 ‘Fira Code Retina’, ‘Sarasa Mono Sc’ 需要注意的一个点&am…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速&#xff08;Edge Secure Content Delivery Network&#xff0c;SCDN&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为…

币安移除铭文市场的深度解读:背后原因及其对区块链行业的影响

引言&#xff1a; 就在昨天&#xff0c;2024年12月10号&#xff0c;币安宣布将移除铭文市场&#xff08;Inscriptions Market&#xff09;。这一消息引发了全球加密货币社区的广泛关注&#xff0c;尤其是在比特币NFT和数字收藏品市场快速发展的背景下。铭文市场自诞生以来迅速…

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…

鸿蒙ArkTS语言基础语法详解

文章目录 鸿蒙ArkTS语言基础语法详解一、引言二、ArkTS语言概述1. ArkTS语言特点2. TypeScript基础语法2.1 类型注解2.2 接口2.3 泛型2.4 类的继承2.5 类的访问修饰符 三、ArkTS的基本组成3.1 装饰器3.2 UI描述3.3 自定义组件3.4 系统组件3.5 属性方法和事件方法 四、自定义组件…

STM32 HAL库之SDIO例程 Micro SD卡 - 2

1、硬件图 2、示例代码 根据提示配置SDCLK为72/3 24MHz。 static void MX_SDIO_SD_Init(void) {/* USER CODE BEGIN SDIO_Init 0 */SD_InitTypeDef Init;Init.ClockEdge SDIO_CLOCK_EDGE_RISING;Init.ClockBypass SDIO_CLOCK_BYPASS_DISABLE;Init.ClockPo…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号&#xff1a;小白的大数据之旅 在小程序的开发过程中&#xff0c;插件作为扩展功能、提升效率的重要工具&#xff0c;扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块&#xff0c;还能优化开发流程&#xff0c;缩短项目周期。 …

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL开源项目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代&#xff0c;将自然语言查询转化为结构化查询语言&#xff08;SQL&#xff09;的能力变得日益重要。无论是小型创业…