作者:小傅哥
博客:https://bugstack.cn
❝沉淀、分享、成长,让自己和他人都能有所收获!😜
❞
你会对你用到都技术,好奇吗?
虽然我们都被称为码农,也都是写着代码,但因为所处场景需求的不同,所以各类码农也都做着不一样都事情。
有些人统一规范、有些人开发组件、有些人编写业务、有些人倒腾验证,但越是工作内容简单如CRUD一样的码农,用到别人提供好的东西却是越多。一会安装个插件、一会引入个Jar包、一会调别人个接口,而自己的工作就像是装配工,东拼拼西凑凑,就把产品需求写完了。
坏了,这么干可能几年下来,也不会有什么技术上都突破。因为你对那些使用都技术不好奇,不想知道它们是怎么实现的。就像阿里的P3C插件,是怎么检查代码分析出来我写的拉胯的呢?
P3C 是阿里开源代码库的插件工程名称,它以阿里巴巴Java开发手册为标准,用于监测代码质量的 IDEA/Eclipse 插件。
插件安装完成后,就可以按照编程规约,静态分析代码中出现的代码:命名风格、常量定义、集合处理、并发处理、OOP、控制语句、注释、异常等各项潜在风险,同时会给出一些优化操作和实例。
在最开始使用这类代码检查都插件的时候,就非常好奇它是怎么发现我的屎山代码的,用了什么样都技术原理呢,如果我能分析下是不是也可以把这样都技术手段用到其他地方。
在分析这样一个代码检查插件前,先思考要从 IDEA 插件都源码查起,看看它是什么个逻辑,之后分析具体是如何使用都。其实这与一些其他的框架性源码学习都是类似的,拿到官网都文档、GitHub 对应的源码,按照步骤进行构建、部署、测试、调试、分析,进而找到核心原理。
P3C 以 IDEA 插件开发为例,主要涉及到插件部分和规约部分,因为是把规约检查的能力与插件技术结合,所以会涉及到一些 IDEA 开发的技术。另外 P3C 插件涉及到都技术语言不只是 Java 还有一部分 kotlin 它是一种在 Java 虚拟机上运行的静态类型编程语言。
<action class="com.alibaba.p3c.idea.action.AliInspectionAction" id="AliP3CInspectionAction" popup="true" text="编码规约扫描" icon="P3cIcons.ANALYSIS_ACTION"> <keyboard-shortcut keymap="$default" first-keystroke="shift ctrl alt J"/> <add-to-group group-id="MainToolBar" anchor="last"/> <add-to-group group-id="ProjectViewPopupMenu" anchor="last"/> <add-to-group group-id="ChangesViewPopupMenu" anchor="last"/> <add-to-group group-id="EditorPopupMenu" anchor="last"/></action>
编码规约扫描
通过源码中找到这个关键字,看它都涉及了哪个类都配置。class AliInspectionAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return val analysisUIOptions = ServiceManager.getService(project, AnalysisUIOptions::class.java)!! analysisUIOptions.GROUP_BY_SEVERITY = true val managerEx = InspectionManager.getInstance(project) as InspectionManagerEx val toolWrappers = Inspections.aliInspections(project) { it.tool is AliBaseInspection } val psiElement = e.getData<PsiElement>(CommonDataKeys.PSI_ELEMENT) val psiFile = e.getData<PsiFile>(CommonDataKeys.PSI_FILE) val virtualFile = e.getData<VirtualFile>(CommonDataKeys.VIRTUAL_FILE) ... createContext( toolWrappers, managerEx, element, projectDir, analysisScope ).doInspections(analysisScope)}
当我们再往下翻看阅读的时候,就看到了一个关于 pmd 的东西。PMD 是一款采用 BSD 协议发布的Java 程序静态代码检查工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产生符合特定语法结构的语法,同时又在JavaCC的基础上添加了语义的概念即JJTree,通过JJTree的一次转换,这样就将Java代码转换成了一个AST,AST是Java符号流之上的语义层,PMD把AST处理成一个符号表。然后编写PMD规则,一个PMD规则可以看成是一个Visitor,通过遍历AST找出多个对象之间的一种特定模式,即代码所存在的问题。该软件功能强大,扫描效率高,是 Java 程序员 debug 的好帮手。
那么 p3c-pmd 是什么呢?
ViolationUtils.addViolationWithPrecisePosition(this, node, data, I18nResources.getMessage("java.naming.ClassNamingShouldBeCamelRule.violation.msg", node.getImage()));
讲道理,说一千道一万,还得是拿出代码跑一下,才知道 PMD 具体是什么个样子。
guide-pmd└── src ├── main │ ├── java │ │ └── cn.itedus.guide.pmd.rule │ │ ├── naming │ │ │ ├── ClassNamingShouldBeCamelRule.java │ │ │ ├── ConstantFieldShouldBeUpperCaseRule.java │ │ │ └── LowerCamelCaseVariableNamingRule.java │ │ ├── utils │ │ │ ├── StringAndCharConstants.java │ │ │ └── ViolationUtils.java │ │ └── I18nResources │ └── resources │ ├── rule │ │ └── ali-naming.xml │ ├── messages.xml │ └── namelist.properties └── test └── java └── cn.itedus.demo.test ├── ApiTest.java └── TErrDto.java
这是一个类似 p3c-pmd 的测试工程,通过自行扩展重写代码监测规约的方式,来处理自己关于代码的审核标准处理。
public class ClassNamingShouldBeCamelRule extends AbstractJavaRule { private static final Pattern PATTERN = Pattern.compile("^I?([A-Z][a-z0-9]+)+(([A-Z])|(DO|DTO|VO|DAO|BO|DAOImpl|YunOS|AO|PO))?$"); @Override public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { if (PATTERN.matcher(node.getImage()).matches()) { return super.visit(node, data); } ViolationUtils.addViolationWithPrecisePosition(this, node, data, I18nResources.getMessage("java.naming.ClassNamingShouldBeCamelRule.violation.msg", node.getImage())); return super.visit(node, data); }}
<rule name="ClassNamingShouldBeCamelRule" language="java" since="1.6" message="java.naming.ClassNamingShouldBeCamelRule.rule.msg" class="cn.itedus.guide.pmd.rule.naming.ClassNamingShouldBeCamelRule"> <priority>3</priority></rule>
<example>
标签,在里面写好标准代码即可。问题类示例
public class TErrDto { public static final Long max = 50000L; public void QueryUserInfo(){ boolean baz = true; while (baz) baz = false; }}
单元测试
@Testpublic void test_naming(){ String[] str = { "-d", "E:\\itstack\\git\\github.com\\guide-pmd\\src\\test\\java\\cn\\itedus\\demo\\test\\TErrDto.java", "-f", "text", "-R", "E:\\itstack\\git\\github.com\\guide-pmd\\src\\main\\resources\\rule\\ali-naming.xml" // "category/java/codestyle.xml" }; PMD.main(str);}
测试结果
TErrDto.java:3: 【TErrDto】不符合UpperCamelCase命名风格TErrDto.java:5: 常量【max】命名应全部大写并以下划线分隔TErrDto.java:7: 方法名【QueryUserInfo】不符合lowerCamelCase命名风格Process finished with exit code 4
category/java/codestyle.xml
这个是 PMD 自身提供好的规约监测。其实有了 PMD 静态代码检查规约,能做都事情就很多,不是只对正在写的代码进行检查,还可以对不同阶段的代码进行分析和风险提醒,比如:准备提测阶段、已经上线完成,都可以做相应的监测处理。
而 Sonar 就是一个这样都工具,它是一个Web系统,可以展现静态代码扫描的结果,结果是可以自定义的,支持多种语言的原理是它的扩展性。https://www.sonarqube.org/
- END -
下方扫码关注 bugstack虫洞栈,与小傅哥一起学习成长、共同进步,做一个码场最贵Coder!
你好,我是小傅哥。一线互联网 java
工程师、架构师,开发过交易&营销、写过运营&活动、设计过中间件也倒腾过中继器、IO板卡。不只是写Java语言,也搞过C#、PHP,是一个技术活跃的折腾者。
2020年写了一本PDF 《重学Java设计模式》 ,全网下载量50万+,帮助很多同学成长,现已出书。同年 github 的两个项目, CodeGuide
、 itstack-demo-design
,持续霸榜 Trending,成为全球热门项目。
2021年上架一本小册 《SpringBoot 中间件设计和开发》 ,16个互联网中间件场景、30个工程,是全网唯一一次手把手教你造轮子、写中间件,因为这样的技术离P7最近、离架构师最近、离高薪资最近!
原网址: 访问
创建于: 2021-11-11 15:36:30
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论