1。前言在工作中难免会遇到维护别人代码的情况,所以首先要看懂别人写的代码。如果对方写的代码杂乱臃肿,维护成本一定很高。如果对方写的代码优雅清晰,维护者一定会显得很高兴。俗话说,“前人栽树,后人乘凉;前人埋坑,后人骂娘”。代码是先给人看的,再给机器看的。如何编写任何人都能理解的代码?答案是规范!每个公司都会有自己的编码标准,但往往是因为赶项目进度、偷懒,或者个人水平习惯等原因,没有进行代码审查,最终代码写得千奇百怪.原因是有规范,但没有人遵守。因此,编码标准需要被强制执行,并交给工具来执行。本文将通过介绍java静态代码检查工具PMD、阿里巴巴p3c开源项目,最后编写自定义编码协议,来学习如何规范代码的编写。2、PMD静态码扫描2.1.PMD官网https://pmd.github.io/2.2。概述PMD是一个用于分析Java代码错误的开源工具。它通过静态分析了解代码错误。即在不运行Java程序的情况下报告错误。PMD自带很多规则,可以直接使用。使用这些规则,你可以发现Java源程序中的许多问题,例如:潜在的错误:空的try/catch/finally/switch语句未使用的代码:未使用的局部变量、参数、私有方法等可选代码:String/StringBuffer滥用表达式复杂:不需要if语句,for循环可以用while循环完成代码重复:复制/粘贴代码就是复制/粘贴bug循环体创建新对象:尽量不要在for或while循环体中实例化新对象环形。关闭资源:Connect、Result、Statement等,使用后务必关闭。此外,用户还可以定义自己的规则来检查Java代码是否符合某些特定的编码。规格。例如,您可以编写一条规则,要求PMD查找所有创建Thread和Socket对象的操作。2.3.工作原理PMD的核心是JavaCC解析器生成器。PMD结合了JavaCC和EBNF(ExtendedBackus-NaurForm)文法,加上JJTree,将Java源代码解析成抽象语法树(AST,AbstractSyntaxTree)。从根本上说,Java源代码只是一些普通的文本。但是,为了让解析器将这些普通文本识别为有效的Java代码,它们必须符合特定的结构要求。这种结构可以用称为EBNF的句法元语言来表达,通常称为“语法”。JavaCC根据语法要求生成一个解析器,这个解析器可以用来解析Java编程语言编写的程序。2.4.规则分类最佳实践:被认为是最佳实践的规则。编码风格:这些规则强制执行特定的编码风格。设计:帮助您发现设计问题的规则。文档:这些规则与代码文档有关。容易出错的规则:用于检测损坏的、非常混乱的或运行时容易出错的结构的规则。多线程:这些规则在处理多个执行线程时会标记问题。性能:用于标记具有性能问题的代码的规则。安全性:显示潜在安全漏洞的规则。2.5.编写PMD自定义规则https://pmd.github.io/pmd-5.4...https://testerhome.com/topics...http://www.w3school.com.cn/xp....3.阿里巴巴Java开发协议插件p3c3.1。GITHUB地址https://github.com/alibaba/p3c3.2。概述阿里巴巴p3c项目由三部分组成:p3c-pmd,提供了大部分的规则实现,基于PMD框架开发,如果你想实现自己的规则,可以基于这个模块开发(这个模块是编译和编译的)基于maven打包)IntelliJIDEA插件,即idea-plugin模块(本模块基于gradle编译打包)Eclipse插件,即eclipse-plugin,本文暂无介绍3.3.阿里编码协议IDEA插件使用传送门:https://github.com/alibaba/p3...4.基于p3c4.1编写自定义编码规则。自定义规则假设你现在需要制定这样一条规则:method请求参数列表不允许超过(包括)54.2.开发步骤4.2.1。找出问题代码,使用pmd图形化工具解析成抽象语法树代码示例:packageorg.p3c.demo;publicclassDemo{publicvoidmethodA(inta){}publicvoidmethodB(inta,intb,intc,intd,inte){}}将源代码放入SourceCode框中,点击Go按钮,分析结果显示在左下框4.2.2分析抽象语法树,可以看到整棵树的根节点是CompilationUnit,即编译单元,它代表了每一个java源文件。我们首先需要找到所有的方法声明。根据树节点的名称,我们大概可以看出是MethodDeclaration。点击相应的节点,查看光标是否定位到源码方法声明的位置。仔细分析MethodDeclaration节点,可以看到它有以下直接子节点:ResultType、MethodDeclarator、Block,即返回类型、方法声明、方法体。MethodDeclarator就是我们要查找的节点。XPATH表达式可以这样写://CompilationUnit//MethodDeclarator验证表达式是否正确,写入PMD图形界面的XPATHQuery框,点击Go按钮下一步,我们需要找到对应的参数列表对于每个方法,参数列表节点是方法节点的直接子节点,完整的XPATH表达式为://CompilationUnit//MethodDeclarator/FormalParameters获取参数列表节点后,我们查看节点的属性,找出参数数量的属性,观察它是ParameterCount属性。至此,抽象语法树分析完毕,知道了如何找出代码中参数列表大于等于5的方法。4.2.3.p3c-pmd项目编写自定义代码规则打开阿里p3c-pmd项目,开始编写我们的自定义规则。阿里写了很多规矩。我们现在要写的规则属于面向对象的范畴。我们可以在opp包下写规则,新建一个规则类MethodParameterCountRule,继承AbstractAliRule,重写访问方法:packagecom.alibaba.p3c.pmd.lang.java.rule.oop;importcom.alibaba.p3c.pmd.lang.java.rule.AbstractAliRule;导入net.sourceforge.pmd.lang.ast.Node;导入net.sourceforge.pmd.lang.java。ast.ASTCompilationUnit;importnet.sourceforge.pmd.lang.java.ast.ASTFormalParameters;importjava.util.List;/***方法参数列表个数不要太长**@autherqingjian.wu*@创建2018-01-2714:59*/publicclassMethodParameterCountRuleextendsAbstractAliRule{privatestaticfinalStringMETHOD_XPATH="//MethodDeclarator";私人静态最终整数PARAMETER_COUNT_LIMIT=5;{OverridepublicObjecttryvisit(ASTCompilationObjectdata)/查找所有方法节点List
