原标题:改善 Java 代码质量的工具与方法

我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏?

代码质量是什么?为什么它很重要?

作家通过他的著作来讲述了一个清晰的、令人信服的故事。他们使用章节、标题和段落等工具来清晰地组织他们的思想,并轻松地引导读者。

开发者的工作与作家类似,只是使用不同术语如命名空间、类和方法。如果创作者不能有效地使用他们的工具,那么无论他们的作品是书还是代码,读者都很难读懂。

回到代码质量这个话题,好的代码都应该具备如下一系列理想特征:

可靠: 能够稳定工作,不会频繁崩溃。

一致的代码风格: 遵循该语言一致的代码风格和命名惯例。

可维护: 易于理解,可维护的代码应该易于扩展及添加新功能。

完善的测试: 具备良好测试的代码往往 bug 更少。

高效: 不应使用不必要的资源来执行所需的业务。

安全: 应防止SQL注入等编码漏洞。

较低的技术债务: 较低的技术债务使团队能够快速前行和开发新功能,而不会被低质量和不可维护的代码拖累。

具备的上述特征越多,代码的质量就越高。根据项目及客户的具体情况,其中一些特性可能不是代码必需的。

当面临交付期限时,编写高质量的代码非常具有挑战,但如果你考虑到代码的长期可维护性,这一点很重要。同时,高质量的代码也会帮助团队长期保持一致的交付速度。

根据我的经验,下面是一些在我的项目中对改进和维护高质量代码非常有效的总结。

使用静态代码分析器提高代码质量

编译器可以捕捉和防止语法问题,但它们无法检测到类似情况:

代码结构不一致

社区已经成型的经验

代码复杂性

静态代码分析是一种在代码运行前对其进行检查的技术。有一些工具可以进行静态分析,它的工作原理是根据多种编码规则分析代码,来发现一些违规行为。这些工具可以集成到构建工具中,如 gradle、maven 等,并让有问题的代码构建失败。

以下是一些可以整合到项目中的工具。

Checkstyle

Checkstyle (1) 是开发中用于检查 Java 源代码是否符合编码规则的静态代码分析工具。Checkstyle 进行的检查限于代码的表现形式,这些检查并不能确认代码的正确性和完整性。

https://checkstyle.sourceforge.io/

使用 Checkstyle 可以确保开发团队遵循一致的编码风格,使其更容易阅读和理解。

下面是一些可以使用 checkstyle 进行的检查。

属性和方法的命名惯例

函数参数的数量

代码每行最大宽度

强制性的文件头描述,如版权

import 和范围修饰符

字符之间的空格

Class 构建函数的约定

多重代码复杂度测量

PMD

PMD(Programming Mistake Detector,编程错误检测器)(1) 是一个静态代码分析器,它可以报告在应用程序代码中发现的问题。

https://pmd.github.io/

PMD 可以帮助检测代码中的问题,这些问题可能会在代码交付生产环境时引起问题。

可能的 bug: 空的 try/catch/finally/switch 块,吞掉原来异常并抛出一个新的异常。

死代码: 未使用的局部变量、参数和私有方法。

空的 if/while 语句

过于复杂的表达式: 不必要的 if 语句,for 循环可以是 while 循环。

次优代码: 浪费的 String/StringBuffer 的使用

高循环复杂度的类

错误的 BigDecimal 用法

CPD(复制/粘贴检测器)

CPD (1),顾名思义,是一个基于拷贝的检测器,即使对于大型代码库来说也是非常高效的。它使用 Karp-Rabin (2) 字符串匹配算法编写。

https://pmd.sourceforge.io/pmd-4.2.5/cpd.html

https://xlinux.nist.gov/dads/HTML/karpRabin.html

它可以被配置为检测大于确定数量的标记的重复。复制/粘贴代码是不可取的,因为它使代码难以维护,并可能在对其中一个地方做了一些改变,而忘记在其他地方也存在相同的代码的情况下导致 bug。

衡量代码质量

免责声明:当一项措施成为目标时,它就不再是一项好措施。(1)

https://en.wikipedia.org/wiki/Goodhart%27s_law

代码覆盖率指标

代码覆盖率是一个指标,可以用来获得一些关于代码质量的信心。说了这么多,选择哪些测试来衡量覆盖率时要小心。并不是所有测试金字塔的测试都是一样的,像 JaCoCo 这样的工具可以用来计算代码覆盖率。

在看代码覆盖率的指标时,只应该考虑单元测试,因为单元测试是为了测试代码是否完成了开发者想要做的事情,执行这些测试是最快的验证方法。

衡量集成测试的代码覆盖率可能是有价值的,但它应该被视为单独的结果,而不应该与单元测试报告合并。记住集成测试是为了确保所有的组件一起工作。使用集成测试来提高代码覆盖率,就像使用大锤来敲开一个螺母一样。

毒性图(Toxicity Chart)

毒性图(Toxicity Chart) (1),顾名思义是一种展示代码毒性的方法。这个图代表了代码库中每个类的毒性,毒性分数是根据一系列参数计算出来的,比如文件长度、方法长度、循环复杂度、嵌套语句等等。这个图表可以展示给业务人员、管理人员等非技术人员,帮助他们了解代码的质量。

https://erik.doernenburg.com/2008/11/how-toxic-is-your-code/

示例代码

下面的 Github 仓库包含了一个包含上述所有工具的示例项目。它的结构让你很容易选择一些需要的工具来集成到你自己的项目中。

https://github.com/singhalkul/java-quality-checks

保持代码质量是一个持续的过程,它不能由团队中的某一个人来完成,整个团队都有责任确保编写的代码是高质量的。

虽然上面提到的工具会帮助确保减少代码中一些质量问题,但这不是唯一的方法。团队应该遵循极限编程实践,如配对编程、测试驱动开发、代码审查、持续集成,以确保高质量代码特征存在于代码库中。

英文原文:

本文由高可用架构翻译,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。返回搜狐,查看更多

责任编辑:

java 代码解析工具_改善 Java 代码质量的工具与方法相关推荐

  1. java 注解应用技巧_改善Java应用程序性能的快速技巧

    java 注解应用技巧 曾经遇到过性能问题吗? 我也是. 如果我的经理再喊一次" faaaaster",我一生都会有听力障碍. 顺便说一句,我能听到所有噪音中的德语发音吗? ;-) ...

  2. java数组子类型_[改善Java代码]数组的真实类型必须是泛型类型的子类型

    List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...

  3. java dns 解析域名解析_使用Java实现DNS域名解析的简单示例

    普通的域名解析方法: import java.net.*; public class Kkkk { public static void main(String args[]) throws Exce ...

  4. java xml 解析 列表_用Java解析高级XML

    小编典典 //规范化您的XML,然后Document通过该XML 创建一个,然后遵循以下代码 NodeList nList = doc.getElementsByTagName("foo&q ...

  5. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  6. java的时间变化_通过java记录数据持续变化时间代码解析

    这篇文章主要介绍了通过java记录数据持续变化时间代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.需求:获取count为null和不为n ...

  7. java检测工具_常用Java代码质量检测评估工具

    常用Java代码质量检测评估工具 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的潜在问题: 可能的bug--try/ca ...

  8. java动态执行逻辑_动态执行代码逻辑

    动态执行逻辑的方法据我所知有一下两种方式 QLExpress Groovy QLExpress QLExpress是阿里开源的动态脚本执行的项目. 由阿里的电商业务规则.表达式(布尔组合).特殊数学公 ...

  9. java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

    本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,checkLogin()方法是登录前的验证,而真正的登陆方式采用的是Shiro,若不是采用Shiro登陆,将该 ...

最新文章

  1. Rpgmakermv(31)MOG插件与YEP的结合
  2. 碰到问题集锦(简述)1
  3. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
  4. “数据中台”是什么?
  5. 转载 一篇UI规范文件
  6. linux proc文件 write的原子性,Linux命令之write调用的原子性
  7. 精选30个优秀的CSS技术和实例
  8. python中复制n次字符串_Python正则表达式,如何将字符串匹配n次 - python
  9. 转载 linux系统调用和库函数调用的区别
  10. 运行tuxedo自带例子simpapp,测试tuxedo安装
  11. Spring框架——day04参数校验和文件上传
  12. 机器学习(6): 决策树算法 小结与实验
  13. Typora免费版(Typora最后一个版本下载)
  14. 研究生学习生活日记——第十三次组会
  15. suffix arrary
  16. vivo手机便签扫描功能怎么识别图片文字转为电子文字
  17. win10java怎么打开_图文传授win10如何打开java控制面板的解决本领
  18. Linux 邻居子系统介绍
  19. matlab图像网格化像素提取像素扩大图片分块
  20. HTML2游戏——绿林怪盗

热门文章

  1. php中使用curl采集小说网,PHP:通过curl实现采集网站内容
  2. android 吐司服务中显示,android里的“吐司”
  3. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...
  4. 软件测试人员进阶必读的八大书籍
  5. git21天打卡day4-查看仓库地址
  6. python21天打卡Day8-string,int互转
  7. 软引用和弱引用的应用场景
  8. maven打包忽略注解_Maven打包时遇到的一些坑和解决方案
  9. 电大计算机网络本作业1,2017年最新电大计算机网络作业1-3答案.doc
  10. 用MATLAB编程课程设计,matlab课程设计报告---用Mtlab编程实现句柄图形应用