|
7 O. k$ {. e- x2 t( O/ T$ m9 ^
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
! |; j2 p" c! c0 y. q
/ Z. m8 ]0 v$ I 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 5 J- o- H5 @. r7 @8 G
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
; g2 V a0 Z; c 一、Alibaba Java Coding Guidelines
3 u( Y4 T5 V a& T& i# T" W* l 1、整体介绍: , p" T+ x u0 t- T0 f* N6 p9 l8 e
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 7 Y* r4 q' x2 @, Z7 K5 |2 X8 s
阿里巴巴规约扫描包括:
( W( T1 |- ^( K6 O7 E: m# Z* T6 \$ R9 y' F( p" e& ?
OOP规约6 z8 h8 ?8 X2 l4 z3 ^
并发处理/ k, ]$ c5 T3 X0 w% x: E s4 ^6 L
控制语句
5 J3 g5 B2 v" m3 V) c3 ` 命名规约- b- A) z! u- ~0 i3 `8 f/ I
常量定义
4 f# W9 t: w. g( ~; A: Q& Y0 q, }* q 注释规范
# A$ m1 ] @) R' S8 W
1 N5 P" N0 _% `! p; N7 l% l 2、安装步骤:
- e2 c7 `, W* q9 j& H0 N File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 3 Z! i* W$ N# \% `+ l4 V
3、使用说明:
% l9 [& b' N, k0 I, d/ _ 3.1、运行方式: H; f5 U* i! c1 U' w$ t: e7 @& M( o
(1)可以Tools > 阿里编码规约 > 编码规约扫描 ( H* ~* Z7 L+ \2 z' m" g! w5 A8 C2 h$ C
 3 H0 j. n! z' ~: Q2 V
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
0 L- C$ d+ e( |* Q4 r8 z 
& {" m8 ^" s- j 3.2、菜单功能:
7 X8 b; R* F, Z2 z( i. N1 H6 u& p6 a0 [* s: p
编码规约扫描:开始扫描代码
! X4 E. B/ h- a( c. `: z/ y5 B 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
& l$ s8 r- I% M+ i8 L4 W. n 切换语言至英文:中英文切换. j# I! ^. Q4 }& @7 C
' Z+ L) |) e2 ~* b 3.3、运行结果:
8 U* q6 q' ]: e; z4 j 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
, c/ l6 h& r* x8 {  & j6 k! z0 ~& `! @8 ]% W
选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
7 I) W8 g% y: p; f4 v 
* D8 w4 b( C( |5 C0 N6 o7 B (1)指定区域搜索同一类问题:
7 Q5 x$ W" ^; H# O1 d9 S1 |/ q2 F 当点击③处的按钮时,会弹出如下按钮: : l$ a$ v0 y) L) r6 f5 e1 P

0 G$ [8 r5 B5 J& v2 l 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示: 3 Z6 I; U! l! n& U0 V4 H; G, Z( h

* m! ]2 O. T2 w+ D 这里我们可以看到,显示了整个Project中的所有该类的问题。
4 P. L4 }1 |1 `; i+ H6 p6 n& J (2)预览具体的不规范代码: 7 d! }/ Z- M$ Y% a5 y5 F
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
0 q/ \: Z0 V2 Y! X7 J! f  3 b0 n" {, e& v6 h! q8 q
3.4、工具栏功能介绍: + v" U: U) _! C* D# O4 P

2 j' z9 w4 C0 a, W2 [$ e
& s h9 Z& W( }% w; p8 G" e# x Rerun Inspection:重新运行一次扫描2 E6 ?7 f' s, o6 p' y% z9 m2 i
Close:关闭真个AJCG面板$ f. S' y, h( h8 L. R) K, `( d
Expand All:展开结果的树状结构,整个结果是树状结构的。
# k0 I! P: ?3 _/ r Collapse All:收起结果的树状结构# a, m9 \ c- A4 W
Go Pre Problem:选择上一个问题; p+ I7 i4 ~1 ?0 a
Go Next Problem:选择下一个问题( \) D6 A& {6 _, N g- t" L
Help:帮助( q" `4 ^* }# x# m- q2 S
Group by Serverity:(不知道如何描述)" E5 z$ b( [0 Y
Group by derectory:按目录分组/按类名分组间切换3 Z$ a9 i c+ d
Filter resoled items:过滤掉已经解决的项/ F1 X. }9 |- `% |: T' U
Autoscroll to Source:自动滚动到源码
# h* Y/ [1 T& \' u Export:导出,可以导出为XML和HTML两种格式
8 E t2 m/ E9 @5 n. H Edit Settings:编辑设置
5 f5 g0 f4 T7 \ { B6 _
6 [- a. I7 W" ]4 Y; `, b0 h 二、CheckStyle: 2 q- h8 q0 M% }: m1 ~" B# e1 w
1、整体介绍: 9 h4 p! M0 {. T, l
CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。 1 |( Q9 ?# ?. _7 A% ?( t1 |
Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 / g$ A" K% X6 Y; \
2、安装步骤: / O/ Q* ~7 a' t' P/ D/ ]
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
$ d5 G. p7 @; u3 h: o# e7 k 3、使用说明:
S2 J) W. V8 ?$ m1 Q4 H3 v  / h$ p+ n! K0 Q( d
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 $ s' I U- s+ T6 k7 Q0 h
三、PMD ) m$ z6 A2 X8 f1 O& I& d7 w# ?
1、整体介绍: : e! V' O/ i: O& Z8 q9 t
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
0 U7 g/ r* j' W: h# P3 z+ c5 O. }# r% V- X# [2 W) Z
潜在的bug:空的try/catch/finally/switch语句
1 T% d9 A, l& k 未使用的代码(Dead code):未使用的变量、参数、私有方法等
# _5 l9 G/ C$ {/ m" s+ [4 a- X 可选的代码:String/StringBuffer的滥用9 m9 a, Q p# \4 `
复杂的表达式:不必须的if语句、可被while替代的for循环3 P) l1 R% a J; H
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
^- ^' u) R" H% s. F% [ 循环体创建新对象:尽量不要在循环体内实例化新对象1 z5 _" j3 S, h% P
资源关闭:Connect,Result,Statement等使用之后确保关闭掉9 O* Q# g6 |% v- t
! P9 O) P. ]# K4 y
2、安装步骤:
A! Y( W1 I6 p5 Z. Y. K" ]3 K 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
( K0 g# F' S1 a3 `; x9 | 3、使用说明:
% i: H; y# _) w
7 _4 F" G5 c; s. m+ L$ k 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html0 @+ h+ e- Z- Z C0 @9 L' ~5 |1 e }1 h
! a4 D7 K# s# k" H0 y
3.1、运行方式: 9 T' P9 a6 e3 s- M5 z
(1)从Tools菜单中启动:
5 h# F0 X1 N3 a; m/ n. C 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
' V6 t3 A$ Y: k* A# R _* q6 C9 F; v7 ]( |# _' Y
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
) O7 I, L- J; {* K- O; ^ Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。3 v9 m- c5 P( e" }: U
9 r4 E# ^+ n+ |: u6 _ (2)从右键菜单中启动:
1 d4 ^9 w% e. @8 N 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
0 `5 }$ s( q, k- K 3.2、运行结果:
5 A J3 F3 n3 ~) b' a- \( H7 C 
! F$ M7 |: I W- w$ j& e* Q( n. }9 t* [ 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
* }# T1 u4 i+ V: t" [: p: K/ s 3.3、配置检测规则:
: H) x: x, H3 H6 F0 @ Y, C 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
$ [9 a4 s; |* Z; G6 V 
7 Q. _& O* ^" ~/ i 在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
* N- H/ b9 \, c 点击“Options”选项卡,在其中可以配置一些检测规则选项: ) ^6 ?7 j I2 G- d! J- X1 ~

0 N! I( K0 _! a; ]; \ 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 5 K" m$ I+ s1 s+ k+ n1 }. t: t
四、FindBugs:
9 A2 q) e; i; ^7 g G4 t% V( p V8 I 1、整体介绍:
6 i! ^# H) k) U; ]( Z' W, @ FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考
! a* I# K) m5 N* U' s 2、安装步骤:
5 Q/ d* D8 w1 t% Q; B 通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 1 T& l: y$ i9 u3 f8 N/ W* T6 ?
3、使用说明: g# v3 }) D, T5 P3 d" f# P" X
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project 0 j+ {3 K+ m( W
 0 `2 _1 ~' [+ X3 P
分析完之后就会出现结果面板
+ c7 ? }1 r$ p$ o8 _/ r$ p 
4 ` g5 g0 g" g& ^ 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 ; K) q$ }- c' @7 ^+ n- g8 K7 h
- ?/ p' f8 k3 b, c$ }: W' { 4、附:常见的错误信息 5 T. [1 m/ ^ o/ ?3 ]: t
4.1、Bad practice 代码坏习惯: 9 a5 `8 @4 r# N9 ~% q
: m+ Z: a7 B5 ^ 图片 ' o0 {- B$ }/ @. i R
4.2、Dodgy code 糟糕的代码:
' x4 ^6 v5 A. s/ j3 B8 \3 G; s/ j, O
4.3、Internationalization 代码国际化相关: ' k& I2 U: x3 n6 p( q5 U. l
4.4、Performance 代码性能相关: , X8 ?, E5 U, }- H9 F" M
' j' J" E2 c. A1 o, _( e$ z
4.5、Experimental:
8 ^; Q: g, ^9 R* \( v
6 V! W# s0 A0 k8 l& P' M2 K t' _ 4.6、Malicious code vulnerability 恶意破坏代码相关: / _9 n8 p1 h6 J0 g- W
5 c X( j, @. z+ H# j0 p+ v. \ 4.7、Multithreaded correctness 多线程代码正确性相关: 7 a. N, [6 h2 C+ Y! b8 P+ N
4.8、Correctness 代码正确性相关: . z4 s& x8 M0 p3 N* Q) x+ Q
$ x$ t# ?( {2 }% Q5 z
五、SonarLint:
- C: J; _' z( q: i+ H 1、整体介绍: . J/ k$ \% d& n
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 % c, J+ W4 j0 b. f+ S* q) }* D+ U, r
2、安装步骤:
% | W0 f, l" u$ m5 B2 p9 b 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 9 {; V+ z1 S+ X- `0 @* U3 q
3、使用说明: 0 k: W; ^4 l, p+ O7 t; ^
9 U+ z8 G1 T2 N# H
右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 . ^) P, k0 a | B$ r
6 K4 K$ `9 f* h: b! f% U 4、配置 SonarLint 服务端:
/ |' g1 Z" ?% S. r' Q3 [% v$ }2 `4 G 4.1、配置 Sonar 服务器: 3 s' r; u% e* p8 Z- N( E
sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: . H0 K! L# x/ d. n. U. A
$ j0 v0 T$ F4 H, m/ W' D 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
! @. _% l+ I0 G* q1 a8 Z1 `( Z; ^& c/ G; a! Y% Z
4.2、具体 Sonar工程配置:
9 ]( L/ ]4 x2 P, N0 ^9 k9 \3 K 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: 0 g3 [3 h- \" M! ^& ?
6 X; f3 l) x8 X: B: f
4.3、使用 SonarLint 检查: 4 M1 y# |8 K& \; v7 V
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 . }& s0 W5 W" Q6 C& u5 |: D8 D q
5 B+ M' D" b% ^+ ~! n1 U, g' U
总结 & i3 e" B$ H# p2 u) G9 v4 v
: F. A* ?% k; ] 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
% y1 K5 J0 \/ G 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
% Q+ A1 D# U! w- V' Z; @$ }; K PMD 自定义能力强,用来自定义项目BUG规则非常好用
5 ^8 Z L& X9 Y3 u j Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
) n; T2 V! b d# {# E5 U2 O SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景6 n, S+ T8 r+ U w
4 g/ l- e) l) ]2 ?4 N+ l( M$ ^
文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
0 e) ~ r2 O; r g$ D
2 J/ i# m! F( C4 d$ [ 责任编辑:
$ q( s1 ~. F% X9 ^3 K
/ {+ \0 J. y5 Q$ k9 w
5 d; Q% L2 }3 `- \ l
3 s/ u; I/ y- C# x1 |# b
1 b- q8 n0 u% ^# m; o( ], _ |