一些基本概念
在开始独立研发公司本人的代码标准查看规定之前,先介绍一些相干的基本概念。阿里巴巴代码标准很多规定其实都是基于开源框架PMD进行的研发。PMD用官网的话语介绍来说:PMD是一个源代码分析器。它能够发现常见的编程缺点,如未应用的变量、空catch块、不必要的对象创立等。它反对多种语言。它能够用自定义规定进行扩大。它应用JavaCC和Antlr将源文件解析为形象语法树(AST),并对其运行规定以查找抵触。规定能够用Java编写,也能够应用XPath查问。开源代码库:https://github.com/pmd/pmd
这里波及到一个很要害的概念——AST 形象语法树(Abstract Syntax Tree)。AST使用场景其实十分多,日常咱们研发过程中谬误提醒、代码高亮、代码格式化、代码转译等等实现的根底都基于AST。简略说,会通过词法剖析和语法分析将代码转化成一种相似树样层次结构来进行形容,当然这种形容能够用XML格局。文字描述比拟形象,无妨看一个“Hello world”的具体AST语法树(Java 1.8),这样就很容易进行了解了。
另外一个概念XPath 是一门在XML 文档中查找信息的语言。自身和代码解析没有关系,但当AST通过XML格局形容时,XPath可能很好实现对相干节点进行查找。两者的联合就能进行违规代码的查看,这就是XPath规定代码标准查看基本原理。此外,与其配套的PMD-Designer规定可视化工具也很好用。
例如阿里巴巴代码标准中 PackageNamingRule 就是十分典型的XPath规定。包名只能由小写字母、数字来组成,具体的XPath:
private static final String XPATH = "//PackageDeclaration/Name" + "[not (matches(@Image, '^[a-z0-9]+(\\.[a-z][a-z0-9]*)*$'))]";
上面先写个规定的例子来感触下自定义规定具体的操作;从查看代码中System.out 相似的日志输入开始。
Example :查看代码中System.out 相似的日志输入。
步骤一,使用PMD-Designer 来辅助编写具体XPath的查看规定;这个工具也能够验证各种代码写法下,规定是否都能起到很好的作用。最终XPath 具体规定如下:
//Name[starts-with(@Image, 'System.out.print') or starts-with(@Image, 'System.err.print')]
步骤二,新建一个具体的规定类,继承AbstractXpathRule ;其中AbstractXpathRule 自身是继承 PMD 中 XPathRule,次要扩大了多语言的设计。具体如下:
package com.alibaba.p3c.pmd.lang.java.rule.emo; import com.alibaba.p3c.pmd.I18nResources; import com.alibaba.p3c.pmd.lang.AbstractXpathRule; import com.alibaba.p3c.pmd.lang.java.util.ViolationUtils; import net.sourceforge.pmd.lang.ast.Node; import static net.sourceforge.pmd.lang.rule.xpath.XPathRuleQuery.XPATH_2_0; public class VoidSystemPrintRule extends AbstractXpathRule { private static final String XPATH = "//Name[starts-with(@Image, 'System.out.print') or starts-with(@Image, 'System.err.print')]"; public VoidSystemPrintRule() { setXPath(XPATH); setVersion(XPATH_2_0); } @Override public void addViolation(Object data, Node node, String arg) { ViolationUtils.addViolationWithPrecisePosition(this, node, data, I18nResources.getMessage("java.naming.VoidSystemPrintRule.violation.msg", node.getImage())); } }
步骤三:在messages.xml 和 messages_en.xml 别离增加查看出错后给出相干中英文提醒。
<entry key="java.naming.VoidSystemPrintRule.violation.msg"> <![CDATA[程序中防止间接应用 System 对相干日志信息输入]]></entry>——<entry key="java.naming.VoidSystemPrintRule.violation.msg"> <![CDATA[Avoid using system print]]></entry>
步骤四:新建emo-common.xml 的规定汇合,并将实现的规定配置进去。
<ruleset name="AlibabaJavaNaming" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> <description>EmoJavaCommonRule</description> <rule name="VoidSystemPrintRule" language="java" since="1.6" message="java.naming.VoidSystemPrintRule.violation.msg" class="com.alibaba.p3c.pmd.lang.java.rule.emo.VoidSystemPrintRule"> <priority>3</priority> <example> <![CDATA[ System.out.println(message); ]]> </example> </rule></ruleset>
步骤五:在ali-pmd.xml 中引入咱们新加的规定汇合 emo-common.xml。
<rule ref="rulesets/java/emo-common.xml"/>
最初运行下批改完的代码程序,成果如下:
综述下关键点,代码标准查看基本原理能够基于AST语法树来进行实现;AST联合Xpath能够不便进行相干标准规定的编写;通过 PMD-Designer 能可视化的帮忙咱们实现 XPath 的相干代码标准规定以及验证相干规定;给出了一个例子,基于阿里开源代码标准插件源码,编写实用本人公司的代码标准的形式。
附上相干代码github链接:https://github.com/ariesfly/e...
如有遇到问题欢送公众号(Java研究者)私信留言