后端:手把手带你精简代码 - 京东零售实践
一、代码精简背景
随着业务需求的不断增加和产品的逐步完善,我们应用对应的代码库也在日益庞大,其中有用的、无用的、低频使用的、灰度验证的等各种类型的代码堆积在一起,给后续接手的同学增加了很多的维护和学习成本。有些代码逻辑缺乏文档说明,无人能看懂,更不敢随意修改。当有新需求需要改动这些代码时,大多数选择都是重新写一套,老的代码还继续保留,慢慢的系统中这种代码越来越多,代码工程也逐渐腐化起来,腐化到一定程度只能进行推倒重构。因此定期进行代码缩减,清理腐化的代码,对代码进行优化升级,提升代码工程的可维护性与可理解性,是十分有必要的。
我们后端的 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 文件
具体文件内容如下:
检测效果截图:
步骤 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 流水线来进行动态代码检查,但需要进行长时间的运行才能得到一个相对精准的代码执行记录,该记录也仅供参考,代码是否可以删除,还需要人工进一步甄别。
作者:京东零售全渠道生态 章露
来源:京东零售技术 转载请注明来源
版权声明: 本文为 InfoQ 作者【京东零售技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/fea43a382855e0beb3ee4a05d】。文章转载请联系作者。
评论