当前位置: 首页 > 科技观察

掌握软件代码质量的七种方法

时间:2023-03-22 11:43:39 科技观察

【.com快译】我们都知道,业界常把低质量的程序代码称为“技术债”。它们不仅会影响软件建设的效率,还会在软件交付和运行中造成严重的服务质量问题。由此可见,软件质量的重要性不言而喻。本文将与大家探讨自动化代码质量控制流程中的代码风格、正确性、复杂性、设计、安全性、覆盖率、审查等关键要素。1.代码的风格俗话说:你的代码观感直接反映了你对代码的关心程度。这个说法没错,即使那些代码段上的缩进不一致,也会给后面的代码分析带来噩梦。更不用说在联调过程中不同开发团队之间由此产生的冲突了。幸运的是,我们可以使用Idea、Eclipse等IDE工具来自动化我们检查代码风格的方式,进而修复和提高代码的准确性。具体来说,开发团队的每个成员都应该首先使用相同的代码风格定义,要么在共享的.editorconfig文件中设置,要么在特定于IDE的配置中设置。其次,我们需要通过将样式检查集成到构建过程中来确保每个成员都能遵循代码样式规则。每次将代码更改推送到存储库时,我们都可以使用Checkstyle来实现Jenkins插件、Maven和Gradle脚本。2、代码正确性代码扫描一直是一项耗时费力的工作,有时甚至难免会出现一些遗漏。为此,我们可以使用一些免费工具,包括:SpotBugs(它是已停用的FindBugs项目的继承者)、PMD、ErrorProne和SonarQube。其中一些还可以识别重复代码并发现潜在的性能问题。类似于Checkstyle,我们可以将这些工具集成到我们的IDE中,方便地检查出目标代码中的缺陷。此外,您还可以使用CheckerFramework来增强Java系统的代码检查和预防潜在问题的能力。当然,您可能需要对其进行一些额外的手动配置。值得注意的是,我们需要在项目构建期间预先运行这些工具,以免我们忘记在将代码推送到存储库之前对它们进行“门控”。3.代码的复杂性在前面的讨论中,我们主要关注于寻找代码中常见的编程缺陷。接下来,让我们关注代码的复杂性。显然,没有人愿意阅读和使用难以推理、维护和扩展的代码。通常,我们可以使用以下指标来衡量代码的复杂度:CyclomaticandNPathcomplexity——一种基于控制流的复杂度计算方法。换句话说,它显示了测试中应涵盖的不同路径的数量(可测试性)。我们可以使用的工具包括:Checkstyle、SpotBugs和PMD。认知复杂性——衡量人类理解代码的难度(可读性)。我们可以使用的工具包括:SonarQube和SonarLint的IDE插件。4.代码设计接下来,让我们看看如何使用静态代码分析工具来发现目标代码中的设计缺陷。目前很多面向对象的设计实践都可以通过自动化的源代码检查来发现高继承层次、上帝类等设计问题。在这方面,Checkstyle和PMD都提供了一套完整的检查工具。其中包括:源代码文件、类、方法和参数列表。它们都根据基本设计规则对代码进行全面检查。除了上述基本的设计检查,我们还可以通过以下静态分析工具进行更深入的检查:PMD的LawOfDemeter可以用来降低各个类之间的紧耦合。Checkstyle的DesignForExtension实现了JoshuaBloch的《Java高效编程(Effective Java)》3rdEdition第17章:Designanddocumentforinheritanceorelseprohibitit。PMD的CouplingBetweenObjects通过独特的属性、局部变量和返回类型的数量来检测难以测试、分析和扩展的紧耦合类。jPeek,它可以衡量类的内聚性,从而保持各种类、模块和包的高内聚性。embold,包含大量针对耦合和内聚的高级设计缺陷的检查。CodeScene从开源项目CodeMaat演变而来。通过分析版本控制系统中的历史代码变更,不仅可以发现潜在的设计问题,还可以识别开发中的瓶颈。值得注意的是,最后两个工具仅对开源项目免费。5.代码安全在开发过程中,为了保证代码的安全性、可扩展性和可维护性,我们需要不断地搜索CVE数据库,避免第三方依赖存在安全漏洞。此外,您还可以从以下资源中获得有关代码安全的各种实践:通用安全编码规则-OWASPTOP10技术特定安全编码规则-OracleJava的安全编码指南最常见的安全漏洞-MitreCWETop25.SANSTOP25作为补充,下面介绍几款具有自动执行功能的代码安全检查工具:FindSecBugs是SpotBugs的一个插件,可以用来审计Web应用中Java程序的安全性。您不仅可以将它集成到Maven或Gradle等构建过程中,还可以在使用IDE插件进行编码时使用它。SonarQube是一款一体化的安全检查工具。其母公司SonarSource在2020年收购RIPSTechnologies后,进一步增强了Sonar的安全检测能力。此外,各种第三方依赖和Docker镜像也可以在代码质量控制过程中实现各种安全扫描。6、代码覆盖率俗话说:没有大量的自动化测试,就无法验证代码是否能如期运行;没有自动回归测试,就不可能安全地重构代码。那么,如何才能在保证高质量代码置信度的基础上,覆盖尽可能多的流程,检查并提高代码覆盖率呢?显然,我们需要提前充分准备好以下不同测试覆盖率相关的指标:语句和指令的覆盖率,即:程序中执行了多少条语句。代码行覆盖率,即:测试了多少行源代码。分支覆盖率,即目标控制结构中执行了多少个分支。方法和函数的覆盖率,即:定义了多少方法。在工具方面,我们可以使用IntelliJIDEA的Coverage、Eclipse的JaCoCo等流行的IDE工具。通过将Coverage工具集成到构建过程中,我们可以通过上述指标了解代码的哪些部分被覆盖,进而在测试中发现不足之处。JaCoCo是Java领域最流行的代码覆盖工具。您可以通过Maven、Gradle甚至Ant将其集成到构建过程中。JaCoCo不仅提供开箱即用的支持,还可以从远程进程收集覆盖率信息。同时,它也帮助我们在代码覆盖率的最终报告中包含端到端测试。值得一提的是,Sonar还使用JaCoCo来监控代码随时间的覆盖率。您还可以针对太低的新代码覆盖率级别自定义QualityGates通知和警报。除了提供一组基本的覆盖率指标和集成之外,OpenClover还包括一组旨在提高代码覆盖率的指标。Cobertura曾经是Java最流行的代码覆盖工具,但是现在已经不再维护和更新了。7、半自动化代码审查在整个代码控制过程中,最复杂、最难实现自动化的环节就是代码审查。因为它是部分手动的,这个过程往往取决于审稿人的技能、资历甚至态度,结果也各不相同。例如,SonarQube仅在其付费版本中为合并和拉取请求提供静态自动分析。据此,当你打开一个合并请求(MergeRequest)时,你可以登录SCM,直接查看代码中静态代码分析的结果。开发人员会主要从以下几个方面进行代码审查:功能需求审查项目特定的需求审查高级设计或架构审查代码复杂度和性能审查因此,为了使代码审查过程更加一致,我们应该准备好代码审查核对清单,以预先就手动代码验证的细节达成一致。这个可以参考谷歌的《代码审查之开发者指南,Code Review Developers Guide》。它在“代码审查”部分给出了一个简短的审查清单,以实现整个团队审查过程的统一。原标题:如何7步控制代码质量,作者:ArturKluz