|
9 q8 o: z; K. b" L 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! + `2 l$ I* ]1 }2 l2 W2 ^6 k' I
$ s7 T/ k# G L0 d# s 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。
$ u3 u2 i' `. j- ~; U 工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 * o5 A2 ]1 j0 f7 l' d3 O
一、Alibaba Java Coding Guidelines ( q" e$ w4 I/ ~
1、整体介绍:
" ~; S/ m" G' q* x& y Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
: k5 R0 f+ U& A' G4 g" m Y" a( M0 I 阿里巴巴规约扫描包括: 7 B3 o3 s" J- E( q. c0 N
; ~ i3 [! `: { S0 B4 D OOP规约; O! |: K6 H; f
并发处理
( B/ I' R3 v/ `: H 控制语句
+ t, Q, V) g+ x 命名规约
% ~" w9 C, d8 a; {2 W' P% ?! T 常量定义
4 D* \' }' X4 Y- E1 y 注释规范 ~" Y! v4 C6 \& v5 x1 @+ U2 F$ m6 T
4 s2 ^6 A. e% }7 @# L
2、安装步骤: * W. G1 j' b" T$ E$ M% Y2 K8 ~
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 2 d( r" A' n" \& f
3、使用说明: 5 S2 O+ c0 ~/ g) d) n. U7 g
3.1、运行方式: 4 b Y( m4 Q; U- X5 W8 w
(1)可以Tools > 阿里编码规约 > 编码规约扫描 2 Q+ e4 `) _: m' P" k5 d# c, W
 # F3 e8 P) k1 k* ]$ E7 l( j
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
4 x$ h9 I4 o3 i6 B; M  8 D( D2 c6 ^- B, @, w! ~7 U& F
3.2、菜单功能: " Z# T# p5 R9 ]# } R
# y/ E* u; i5 ~/ A+ A" g2 Z 编码规约扫描:开始扫描代码
P8 D) j E( t8 n0 L$ E 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
5 L+ {9 `7 K/ }, p5 j$ R 切换语言至英文:中英文切换# S' R6 t- S K
( r" z; J1 c9 ]
3.3、运行结果: ( F5 x5 R+ s# Y9 g6 D& g1 l
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
# g7 @/ Z% @0 j; W6 K u% t7 C  / P u+ t# T+ i/ w
选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
6 }, v$ q7 y7 I  - b+ P+ q& @; U! U
(1)指定区域搜索同一类问题:
. c9 U6 z5 v7 K 当点击③处的按钮时,会弹出如下按钮:
6 y, P. p; z. e v$ T4 [) P  3 N N% h% t8 ] [) p$ J
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
j3 M- V6 x/ r' s  1 F \. I" U6 P: F
这里我们可以看到,显示了整个Project中的所有该类的问题。 , b# C$ s$ r5 \! P3 n; ], z$ K
(2)预览具体的不规范代码:
: F0 z, y1 N) K8 ` 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 1 `$ T7 r6 U/ c; V% {# e P

" q6 p) v* z; T9 }5 l$ L& w/ f# i T 3.4、工具栏功能介绍:
, i! W! u: {5 g4 u  7 Q& o( K: ?2 B$ a$ u
1 n( r! l8 s1 |, k$ k _
Rerun Inspection:重新运行一次扫描 s" ?* v! s1 H# }
Close:关闭真个AJCG面板
Y5 B0 O6 U& ]4 ^ Expand All:展开结果的树状结构,整个结果是树状结构的。$ g/ B, q4 V5 r+ J# g+ R
Collapse All:收起结果的树状结构; p7 J" K/ c% X, q
Go Pre Problem:选择上一个问题
% k) ?4 o5 t: U9 D6 \# A Go Next Problem:选择下一个问题& Q+ ?$ M0 K, h* U* a* c* W' j6 y
Help:帮助
4 @: e% V2 e2 e; A Group by Serverity:(不知道如何描述)
0 M$ g2 O5 t! a7 [5 y- @ Group by derectory:按目录分组/按类名分组间切换
0 `0 I p* x/ F3 R- v9 m Filter resoled items:过滤掉已经解决的项
7 J0 w' u* E1 `0 J6 x2 n Autoscroll to Source:自动滚动到源码* ~; W. ^/ @( t: q8 u% L ^ n
Export:导出,可以导出为XML和HTML两种格式* y4 y8 e$ ]6 ]! Z S% @
Edit Settings:编辑设置& [9 D" R' Q7 @' U( T7 [; a
/ V* F) V# R0 e7 M% Q
二、CheckStyle:
" i& H/ X% S8 r+ c2 S 1、整体介绍: + n( I% H- \0 M9 z. C. i8 P% Q
CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。 1 U! w- z( x* z6 j% g
Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 0 h7 T2 r% t2 X
2、安装步骤: 7 x9 m: p1 n$ s8 p& r! U
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
5 R' u8 w! l1 C 3、使用说明: 5 Z) k4 m$ o2 U- S; _1 r. E: E) }

* j7 B' m3 l. e# p( }) W, q% `9 y 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ! z- O0 r$ |5 t) o3 p8 Y
三、PMD ( B0 K/ n9 ]8 r3 m4 g
1、整体介绍: I! [. g0 h0 O. H
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
9 W. W4 X$ u+ {$ \; h) ?+ L8 ^! L, }. z8 `( Y, |
潜在的bug:空的try/catch/finally/switch语句
, N7 @3 `6 B b9 [ 未使用的代码(Dead code):未使用的变量、参数、私有方法等
/ }% M+ f, Y' z4 W 可选的代码:String/StringBuffer的滥用
* M3 w$ r% l7 n7 _ o6 F/ K) W% V n 复杂的表达式:不必须的if语句、可被while替代的for循环4 i( g3 b# e2 _
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
2 a4 q- E: H [* d! o, @ g# q 循环体创建新对象:尽量不要在循环体内实例化新对象
7 p; L& D1 G: z6 Y; q7 p 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
: \7 R7 p% K: o7 o
2 @7 P8 E. r7 \6 f" o4 U4 Z( W( W9 ~ 2、安装步骤: & X o: t- ^+ n4 Q8 Z2 R4 W
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
0 M* j, \' A. ]. ?" n6 M0 Z1 a N 3、使用说明:
% _% d! U% }0 J' R& b8 c
# S) I4 k% G6 I- m 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html
* Y' g4 ~* G- j2 h) A5 I
2 b3 \1 ]* X, @1 @! i7 J8 e 3.1、运行方式: ' U- R; y$ S& r, |
(1)从Tools菜单中启动: 1 V C$ Y6 _: K% y* t9 l% E
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
4 Y/ V: ?3 v5 r& _, ]7 K7 r% c- ^4 S( j2 n) x/ h
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。" X# \8 ]9 k& h5 A
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。/ |( |7 r+ n) H+ B. M% X8 a
! w- n: A$ j( U9 L; E% f1 m7 Y3 r (2)从右键菜单中启动: K) u1 g" i( J2 S
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 % G! m2 s/ X( j% V7 M. C
3.2、运行结果: ' u( \0 P1 b8 g

/ d: y2 I+ O: H9 Q2 a V 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
& x2 \- L7 O' ?* s 3.3、配置检测规则:
0 H& _' O' l) g* V( W( n' H 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: " y$ G* X- `! V* f- U( x) n
 0 t+ [& H0 I9 z5 R5 ^1 {/ J
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
/ Z, j8 O# L- f& c; G0 w5 D 点击“Options”选项卡,在其中可以配置一些检测规则选项:
% E8 q: @8 o | 
4 n0 o; `# g, @, _' T* Q( @; P9 H 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 / i7 e* \# l+ N% y
四、FindBugs: 3 L3 Z* [' j) W7 `
1、整体介绍: ! c9 d( I9 I! | @0 e4 S: G' Q
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考
, T) y0 w: @9 c5 ^1 M3 |( r 2、安装步骤: 4 X7 g/ ]: w. E( m# }1 B! U
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 3 n" y7 q9 Q D. B6 U' j
3、使用说明: 6 M2 O4 a* N3 W9 P4 H0 j+ f
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
' M s; n F' W# n) s  ) Q( _5 y+ p- h, p" L1 F6 [
分析完之后就会出现结果面板
- t" E! o5 s3 J4 S u* e+ r* }8 B( B 
3 A2 I- }, B F4 T 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 % P$ A, U$ ]( z @" a
; ?, L# L" s7 `, H' R0 o
4、附:常见的错误信息 1 x$ Z4 }. k4 q- s/ F: C9 K" @
4.1、Bad practice 代码坏习惯: ; o+ A: R* A m; C
4 H$ S3 Q* j& F: m. b# \* v/ N 图片
# D" s% Y' Q* }/ W% S 4.2、Dodgy code 糟糕的代码: 4 a4 T4 ~, T% s: \0 K, [
* B! I7 o, _% Y& e$ L
4.3、Internationalization 代码国际化相关: ) S; C* H9 V% W, l" B: e& H& t& L0 w
4.4、Performance 代码性能相关:
" y4 {: V9 _4 Y7 X. X& Z# M
& z) e% @! Q; t& s 4.5、Experimental: 6 T, e* r: S' ]+ W0 S
/ d1 s. b9 T" A; E7 P0 e
4.6、Malicious code vulnerability 恶意破坏代码相关:
) p! b7 l, ^" F$ s
* f, `" W% i# ]' g, _3 o0 K2 S" | 4.7、Multithreaded correctness 多线程代码正确性相关: 8 i. R0 P: r' e+ H, P
4.8、Correctness 代码正确性相关:
) U# X3 i7 Z4 h6 \/ v
% o, b" X+ L! w% Y- a 五、SonarLint:
2 I9 H, L) ]# a) E" I 1、整体介绍: ; B' ~( ?2 m/ p5 Y/ F- b/ D/ `
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 - Q2 `2 o/ D B5 Q- S! G# \' G
2、安装步骤: . i2 }- {/ z3 a, Q, i3 e
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
" L2 `/ v; j' n% \ 3、使用说明: 6 [3 W! C: i; K3 j
- L v# g: u$ o1 u. }+ b2 t, P' z j 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
4 z- u% ^0 o# z9 w Q$ l
2 x; V2 w9 k2 H2 s% Y* W 4、配置 SonarLint 服务端: % m6 O, i8 U: n, @* ?- U/ S
4.1、配置 Sonar 服务器:
4 v) l: R$ }8 I2 s! V4 M sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: 3 u" r7 z% I V% k+ Y9 ]
# a( e0 \6 j+ E8 Z2 H" w2 t
点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
. y9 p& K3 v! J% t. x
, Y% G6 z3 s+ A( P 4.2、具体 Sonar工程配置:
4 Z5 H& J* z" s: m0 P* R 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
' S9 \* y8 G f7 { t! b5 ~- b2 i+ \, {* I+ }7 [
4.3、使用 SonarLint 检查:
1 @+ E9 e$ t3 b6 i _* J 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 4 X J' F) R8 s+ G! g3 B% n3 H
- l5 ` m; R7 ~' N 总结
+ F7 u$ J( `2 l% a% u; @" e% y* U' F# b' u1 |& N
检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
7 _5 ?6 N+ A b* O7 v7 E+ l 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
) c/ @% _* c _ PMD 自定义能力强,用来自定义项目BUG规则非常好用, u' r$ R( e; _* U" k5 k" {
Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
8 [/ P* _+ K1 A( ?' ]: |. { SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
3 b; h9 ~6 x' N/ s8 p% m
/ m% Q; E5 t- a! M- y& U7 m 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
& R1 h. Z9 ~' e* P/ V2 W0 O3 X0 D/ H, C2 m9 B& ], D4 a$ g* l
责任编辑: ! A4 Z Z& d2 k' @- E% K" K/ \( i
5 R9 x% v: f+ B9 e; O7 k7 f
% @* t9 B7 [7 A% s# w
4 i4 \, S6 d- ?4 ~$ y; I# @# m9 D
|