代码精简执行过程 代码精简执行过程是什么
lipiwang 2024-10-26 13:12 11 浏览 0 评论
一、代码精简背景
随着业务需求的不断增加和产品的逐步完善,我们应用对应的代码库也在日益庞大,其中有用的、无用的、低频使用的、灰度验证的等各种类型的代码堆积在一起,给后续接手的同学增加了很多的维护和学习成本。有些代码逻辑缺乏文档说明,无人能看懂,更不敢随意修改。当有新需求需要改动这些代码时,大多数选择都是重新写一套,老的代码还继续保留,慢慢的系统中这种代码越来越多,代码工程也逐渐腐化起来,腐化到一定程度只能进行推倒重构。因此定期进行代码缩减,清理腐化的代码,对代码进行优化升级,提升代码工程的可维护性与可理解性,是十分有必要的。
我们后端的java代码工程一般和应用一一对应,根据应用的分层,代码工程也可以分为以下几类:领域服务中心(领域服务)、业务聚合中心(业务系统)、多能力应用(前后端未分离、定时任务、消息...)等种类。针对不同类型的代码库,我们需要深入代码进行探查,掌握代码的腐化程度以及有效代码的占比,判断是进行代码缩减还是进行代码重构。如果进行代码缩减,哪些代码可以直接清理,哪些代码可以重用优化,识别过程是个需要花费精力去认真做的。
二、代码精简步骤
??
三、代码精简实施
1、静态代码检查
1)idea 自带工具检查
步骤1:通过idea 自带的工具来检查未使用的类、变量、方法。Preferences—>Analyze—>Inspections,执行:Run Inspection by Name
??
步骤2:输入:unused declaration(未使用的声明)
??
步骤3:输入:unused import(未使用的引用)
??
步骤4:重复代码检查,专业版才能扫描,扫描之后,通过人工识别的方式,看是否能抽离公共方法
??
??
??
?使用idea自带工具检查的缺点如下:
?spring注入的参数值@value,会认为没有赋值"Field is never assigned.",参数未被赋值,被检测出来;
?lombook的@data注解对象,会认为"All constructor usages belong to the calls chain that has no members reachable from entry points",被检测出来;
?实体类中没有初始化new过,会认为"Constructor is never used",构造函数没有使用过,被检测出来;
?无效代码的误判较多,识别需要要花费一定的时间;
?重复代码检查都能检查出来,检查到以后,都需要人工进行识别,进行抽象处理;
2)使用PMD插件检查
步骤1:安装插件:IDEA通过 File > Settings > Plugins > Marketplace 搜索 “PMD”,按照提示进行安装,然后重启即可
??
步骤2:配置检测规则:通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面
??
执行PMD:
??
使用默认的规则的话,比较多,我们关心的是哪些代码可以精简,因此我们选择自定义规则,定义setting.xml文件,然后配置 PMD检查规则,选择setting.xml文件。
??
具体文件内容如下:
<?xml version="1.0"?>
<ruleset name="myruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>My ruleset</description>
<!-- 空的 catch 块:发现空的 catch 块没做任何异常处理的事,在大多数情形下,这会吞噬一些应该被处理或报告的异常 -->
<rule ref="category/java/errorprone.xml/EmptyCatchBlock"/>
<!-- 空的 finally 块:避免空的 finally 块 - 这些是可以删掉的 -->
<rule ref="category/java/errorprone.xml/EmptyFinallyBlock"/>
<!-- 空的 if 表达式:发现使用 if 进行了条件判断,但是判断之后没做任何处理 -->
<rule ref="category/java/errorprone.xml/EmptyIfStmt"/>
<!-- 空的初始化块:发现空的初始化块 -->
<rule ref="category/java/errorprone.xml/EmptyInitializer"/>
<rule ref="category/java/errorprone.xml/EmptyStatementBlock"/>
<!-- 空的 switch 表达式:避免空的 switch 表达式 -->
<rule ref="category/java/errorprone.xml/EmptySwitchStatements"/>
<!-- 翻译 空的 Synchronized 块:避免空的 synchronized 块 -->
<rule ref="category/java/errorprone.xml/EmptySynchronizedBlock"/>
<!-- 空的 try 块:避免空的 try 块 -->
<rule ref="category/java/errorprone.xml/EmptyTryBlock"/>
<!-- 空的 while 表达式:发现空的 while 表达式 -->
<rule ref="category/java/errorprone.xml/EmptyWhileStmt"/>
<!-- 未用的常规参数 -->
<!-- <rule ref="category/java/bestpractices.xml/UnusedFormalParameter"/>-->
<!-- 未用的本地变量 -->
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
<!-- 未用的私有变量 -->
<rule ref="category/java/bestpractices.xml/UnusedPrivateField"/>
<!-- 未用的私有方法 -->
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod"/>
<!-- 不要引入java.lang:避免从’java.lang’包引入任何东西,它里面的类是自动引入的 -->
<rule ref="category/java/codestyle.xml/DontImportJavaLang"/>
<!-- 避免重复引入 -->
<rule ref="category/java/codestyle.xml/DuplicateImports"/>
<!-- 未使用的imports:去掉不使用的import -->
<rule ref="category/java/bestpractices.xml/UnusedImports"/>
<!-- 从同一个包引入:不需要从同一包引入类型 -->
<rule ref="category/java/errorprone.xml/ImportFromSamePackage"/>
<!-- 太多的静态引入:如果滥用静态引入特性,会使你的程序不具有可读性和可维护性,你引入的太多的静态成员污染 -->
<rule ref="category/java/codestyle.xml/TooManyStaticImports"/>
</ruleset>
检测效果截图:
??
步骤3:重复代码检查,下载pmd压缩包,运行cpdgui
??
?命令行执行:/Users/zhanglu7/Downloads/pmd-bin-6.39.0/bin/run.sh cpdgui
?选择检查的文件夹目录,执行检查,GO
??
使用PMD检查工具缺点如下:
?缺少无引用的public方法检查规则,目前都是私有方法的检查,公有方法检测规则需要自己实现,或者通过人工甄别的方式进行检查;
?重复代码检查需要额外使用CPD,重复代码检查都能检查出来,检查到以后,都需要人工进行识别,进行抽象处理;
3)静态代码检查结论
?建议使用PMD插件+CPD的方式进行,静态代码检查,检查包括:空逻辑控制代码块,未用的本地\私有变量、未使用的私有方法,检查出来的内容基本上都可以直接从代码库中删除。重复代码检查,使用CPD检查重复超过**行的代码,检查结果作为一个参考,帮助我们找到代码库中疑似重复的代码,然后通过人工甄别,判断该重复代码是否可以进一步抽象,抽象成公共的方法,供多处调用。
?test_code_reduce,demo工程,代码行数103行,通过pmd检查后,可删除10行左右(包括未使用的私有方法、无效引用、未使用的本地变量),占比10%左右。
??
?jdo-***,线上工程,代码行数20005,通过pmd检查后,可删除400行左右(包括未使用的私有方法,未使用的私有变量、重复引入、无效引用、未使用的本地变量),占比2%左右。通过idea扫描的重复代码,需要人工甄别,抽取出公共方法。另外需要人工检查无用的public方法,以及类等,估计可以删除600行左右,占比3%,可以完成整体缩减5%的目标。
??
2、动态代码检查
1)京东jacoco流水线
步骤1:配置流水线
??
步骤2:行云应用添加启动参数
启动前配置:
mkdir -p /export/home/jacoco
cd /export/home/jacoco && wget "http://storage.jd.local/bpp-quality-public/code_coverage_statistics/jacoco-0.8.7-20210115.151120-42.tar.gz"
tar -xzvf /export/home/jacoco/jacoco-0.8.7-20210115.151120-42.tar.gz
??
启动配置:
ip=$(/sbin/ip a | grep "inet " |grep -v "169.254.95.120" |grep -v "127.0.0.1" | awk '{print $2}' | awk -F/ '{print $1}')
export JACOCO_AGENT="-javaagent:/export/home/jacoco/jacoco-0.8.7-20210115.151120-42/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8840,address='${ip}' -Xverify:none"
export CATALINA_OPTS="${JACOCO_AGENT:-} ${CATALINA_OPTS}"
??
步骤3:运行流水线
??
待运行一段时间后,再运行流水线,查看动态代码覆盖率
??
2)动态代码检查结论
?建议使用京东jacoco流水线来进行动态代码检查,但需要进行长时间的运行才能得到一个相对精准的代码执行记录,该记录也仅供参考,代码是否可以删除,还需要人工进一步甄别。
相关推荐
- Nat. Synthesis: 重大突破,电化学形成C-S键
-
第一作者:JunnanLi,HasanAl-Mahayni通讯作者:AliSeifitokaldani,NikolayKornienko通讯单位:蒙特利尔大学,麦吉尔大学【研究亮点】形成C-...
- 网络安全与应用(二)(网络安全理论与应用)
-
1、应用层安全协议SHTTP和HTTPS:SHTTP:SecHTTP,安全超文本传输协议,是HTTP扩展,使用TCP的80端口。HTTPS:HTTP+SSL,使用TCP的443端口。大部分web应用...
- TN-C、TN-S、TT、IT供电系统详解及对比
-
TN-C、TN-S、TT、IT供电系统是低压配电系统中常见的四种接地方式,它们各自有不同的特点和适用场景。一、系统介绍TN-C供电系统①定义:整个系统中,工作零线(N线)与保护零线(PE线)是合一的,...
- 网络应用服务器(三)(网络应用程序服务器)
-
#头条创作挑战赛#1、DNS协议:域名解析协议,用于把主机域名解析为对应的IP地址。是一个分布式数据库,C/S工作方式。主要基于UDP协议,少数使用TCP,端口号都是53。常用域名如下2、DNS协议...
- 腾讯发布混元Turbo S:业界首次无损应用Mamba架构
-
21世纪经济报道记者白杨北京报道2月27日,腾讯正式发布新一代基座模型——混元TurboS。据腾讯混元团队介绍,混元TurboS在架构方面创新性地采用了Hybrid-Mamba-Transfor...
- 【收藏】低压配电系统中TT IT TN-S/TN-C/TN-C-S 的区别?
-
低压配电系统的接地型式选择是电气安全设计的核心环节,TT、IT、TN-S、TN-C、TN-C-S这五种主要接地型式因其结构、保护原理和故障特性的显著差异,在工程应用中有不同的适用范围和限制条件。如若发...
- 金万维公有云平台如何实现C/S架构软件快速SaaS化
-
金万维作为国内领先的企业信息化垂直B2B平台运营商,拥有超过5000家管理软件合作伙伴,掌握管理软件一线的发展动态,因此深知传统管理软件近年来面对的困境和问题。而SaaS却在软件行业内发展迅猛势如燎原...
- 随时随地做翻译:B/S架构的传奇时代到来
-
随着新兴技术的发展和大数据时代的到来,翻译作为连接各国语言和文化的工具,更是具有前所未有的拓展空间。传统的在计算机辅助翻译软件(CAT)上进行翻译的模式,受到时间和空间的限制,导致翻译过程中面临层层障...
- BS和CS 架构的介绍(一篇就够了)(cs和bs架构的含义)
-
简介C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或SQLServer。...
- 物管王(包租婆)软件架构与B/S和C/S架构的优点和缺点比较
-
一、B/S系统架构的优点和缺点优点:1)客户端无需安装,有Web浏览器即可。2)BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。3)BS架构无需升级多个客户端,升级服...
- 监听器入门看这篇就够了(怎么检查车上有没有被别人安装监听器)
-
什么是监听器监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。为什么我们要使用监听器?...
- 购物车【JavaWeb项目、简单版】(java购物车的实现原理)
-
①构建开发环境免费学习资料获取方式导入需要用到的开发包建立程序开发包②设计实体书籍实体publicclassBook{privateStringid;privat...
- 基础篇-SpringBoot监听器Listener的使用
-
1.监听器Listener简介1.1监听器Listener介绍Listener是JavaWeb的三大组件(Servlet、Filter、Listener)之一,JavaWeb中的监听器主要用...
- 你在 Spring Boot3 整合 JWT 实现 RESTful 接口鉴权时是否遇到难题?
-
各位后端开发小伙伴们!在日常使用SpringBoot3搭建项目时,RESTful接口的鉴权至关重要。而JWT技术,作为一种简洁且高效的鉴权方式,被广泛应用。但大家是不是在整合过程中遇到过各...
- javaWeb RSA加密使用(rsa加密java代码)
-
加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下。先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)