当前位置: 首页 > 后端技术 > Java

别再写垃圾代码了:试试阿里巴巴Java开发插件,打造属于你团队的专属风格,..

时间:2023-04-01 20:42:03 Java

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)/查找所有方法节点ListmethodNodes=node.findChildNodesWithXPath(METHOD_XPATH);if(methodNodes!=null&&methodNodes.size()>0){for(NodemethodNode:methodNodes){//查找每个方法的参数列表声明ListformalParameters=methodNode.findChildrenOfType(ASTFormalParameters.class);if(formalParameters.get(0).getParameterCount()>=PARAMETER_COUNT_LIMIT){//违反规则提示信息,第二个参数为提示信息位置,第三个参数为提示信息key,第四个参数用于替换提示信息中的占位符//,这里获取的节点图片属性为方法名addViolationWithMessage(data,methodNode,"java.oop.MethodParameterCountRule.violation.msg",newObject[]{methodNode.getImage()});}}}}catch(Exceptione){e.printStackTrace();}返回超级。访问(节点,数据);}}4.2.4.p3c-pmd项目配置规则将写好的规则配置到ali-oop.xml文件中14.2.5.p3c-pmd项目前两步使用的提示信息和规则信息写提示信息需要写在message.xml配置文件中,message_en.xml是英文提示,这里就不演示了4.2.6。单元测试编写测试样例,将待测源码写入测试目录对应的xml文件中推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...0编写单元测试运行单元测试,因为示例代码中的methodB不符合规范,但是我们期望问题数写成0,所以单元测试会失败:4.3.配置插件4.3.1.p3c-pmd先打包安装到本地maven仓库,把不需要的插件maven-javadoc-plugin和maven-gpg-plugin注释掉,然后运行mvn命令:mvn-DskipTests=truecleaninstall4.3.2.idea-plugin项目打包插件idea-plugin项目是基于gradle搭建的,在根目录下配置Build.gradle,让build使用本地私有maven仓库来build然后运行gradlebuild:cleanbuildDependents打包成功后会在idea-plugin\p3c-idea\build\distributions\目录下生成AlibabaJavaCodingGuidelines-1.0.0.zip文件。这是我们为扩展阿里开发协议而添加的插件。在IDEASettings->Plugins->Installpluginfromdisk4.3.3安装这个插件。IDEA使用编码安装好协议插件后,重启IDEA,用之前的代码测试一下插件是否有效。右键“CodingProtocolScan”结果:5.Maven打包加入PMD验证至此,我们实现了开发阶段的实时验证最后需要在代码打包中加入规范检查,使部署到生产环境的代码符合规范。如果不符合规范,包装就会失败。考虑到大部分项目都是maven管理的,可以将自定义的pmd规则集成到maven中,这样就可以使用maven来验证代码规则了。在maven项目中添加pmd插件,配置插件在package阶段执行。通常我们的项目有一个共同的父pom,那么只要将插件添加到父pomorg.apache.maven.pluginsmaven-pmd-plugin3.8rulesets/java/ali-comment.xmlrulesets/java/ali-concurrent.xml<规则集>rulesets/java/ali-constant.xmlrulesets/java/ali-exception.xmlrulesets/java/ali-flowcontrol.xmlrulesets/java/ali-naming.xmlrulesets/java/ali-oop.xmlrulesets/java/ali-orm.xmlrulesets/java/ali-other.xmlrulesets/java/ali-orm.xmltrue1packagecheckcom.alibaba.p3cp3c-pmd1.3.3如果有不规范的代码打包,会失败:更详细的mavenpmd插件介绍,参考官网6.总结这篇文章确实有点长,需要一点耐心才能看懂。但其实很简单。重点是分析抽象语法树,找到问题代码节点。剩下的工作就很简单了。PMD也有局限性。比如它只能校验java源文件,与XML等配置协议无关。而且最重要的是,代码逻辑等关键问题无法验证,也无法完成。PMD只是在一定程度上规范了我们的代码。要想写出优雅的代码,就需要多思考,多实践。来源:blog.csdn.net/u014513883/article/details/79186893近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.惊艳!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!