|
4 f# d5 s$ z1 ` V8 @8 I+ c/ ]
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! 1 s0 o# J6 S! X
: i* q" v& \4 _" R f 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 7 X- q) ]$ D; E, R
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
5 E+ ~( k0 z+ q/ H" f; p7 s" g/ { 一、Alibaba Java Coding Guidelines 1 O7 n9 {1 ]5 ?5 z% c5 S7 f
1、整体介绍:
& t) k( r+ f8 [. v g7 L Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 ) S3 t, h4 f# J3 d
阿里巴巴规约扫描包括:
% T1 F4 r! U! p" j6 F6 M$ O
* P2 b% R0 s2 C/ I' p& D" w5 M4 N0 x OOP规约& N5 y! E9 Y5 r
并发处理
$ Q' a! t# H8 C" K7 a- c& ? 控制语句
+ f( N! P7 i# X! N6 a4 v 命名规约
( X( v2 r5 a* d5 [, s 常量定义2 ]0 e7 R1 X0 j6 }
注释规范" ], Q* `& ?$ A& m# g: Q5 F- |
$ G6 J1 o1 A* e8 k/ V& Q6 [5 P/ A& s 2、安装步骤: $ Y- P& \% I% K. k/ P% W8 V0 o
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
+ S8 |0 _) ^" n3 ?1 U; E1 ^ 3、使用说明: 9 _6 _& u& X/ g, [- J
3.1、运行方式: : ]" O$ y" [3 y5 \
(1)可以Tools > 阿里编码规约 > 编码规约扫描
$ C& l, T, [9 h P. } 
, g" s5 V7 r3 Y& P, k2 { (2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: 0 g. G0 y; a- f
 ( b% `) a* K' L7 b/ A' \4 y
3.2、菜单功能: 5 Q2 B P/ q' s$ {: `9 j
1 T. W6 Z, @; N1 G1 y+ n! Z: O. T 编码规约扫描:开始扫描代码0 @# v2 o0 F4 v Q! h9 a/ H
打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
, D) J [" H& \0 B7 s# H 切换语言至英文:中英文切换% s: ?- K# v$ R* u- j, E# c* H! {- `
( X4 v9 P( [$ v8 H6 Q
3.3、运行结果:
$ K. K, F. w- `% u+ d 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
6 f7 G' q3 [% {1 T+ A; b3 L 
( h6 {( n7 p+ p9 c 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
. k) g- w9 ?3 F8 e$ Q7 H. u 
) s4 h: ~3 n& o7 L (1)指定区域搜索同一类问题: # W, I- w* S- `5 U0 h
当点击③处的按钮时,会弹出如下按钮: , X+ l) |4 d/ p* {1 U" o) e" j
 ; ?% [+ ?5 M! _
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
$ d k, t* C T4 A5 y: E  ( X* } [/ a$ ~' K# r( p
这里我们可以看到,显示了整个Project中的所有该类的问题。 7 x9 U7 v- `/ H& ]/ G/ b5 Q
(2)预览具体的不规范代码:
- ]6 p8 V6 q& V d3 [+ d 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
) V9 J- k+ U! \7 @2 E/ n" S) A  # k+ P6 D; U. l4 f8 I9 k2 u
3.4、工具栏功能介绍:
$ ?" n) A D$ z- Z: N" B 
8 S3 m6 R. m/ s' N0 ?9 S0 Y( o1 w
; I8 R k& O& R* [; c# @: Y" N Rerun Inspection:重新运行一次扫描/ p( V" O4 c0 b/ k) S2 i
Close:关闭真个AJCG面板! g5 x/ X4 |2 U8 }3 s0 q
Expand All:展开结果的树状结构,整个结果是树状结构的。
8 A0 Y1 y. {( m" H Collapse All:收起结果的树状结构$ J& ]) R" I( s n+ j2 g5 U
Go Pre Problem:选择上一个问题
. T# f1 |7 W2 h1 _& k Go Next Problem:选择下一个问题
4 s+ i+ l R1 Y! c; ?+ o Help:帮助
F' D7 s3 w; Z& I, u8 V4 W Group by Serverity:(不知道如何描述)
5 F9 J2 I+ ]- e1 M7 b$ d2 y; g Group by derectory:按目录分组/按类名分组间切换4 D( U0 A0 G% Y; L
Filter resoled items:过滤掉已经解决的项0 g- O9 v0 W# K( O' b4 v
Autoscroll to Source:自动滚动到源码/ A+ `6 d- R0 ?* Q8 x0 X' a
Export:导出,可以导出为XML和HTML两种格式5 Z8 Y# [+ O1 B: h
Edit Settings:编辑设置9 [+ D. k# F; D7 w9 \% r+ N1 Z n
: L! L5 u0 P5 S6 ?. c$ F0 E/ \) u8 m 二、CheckStyle: 1 l! M/ l' G* m2 y3 s
1、整体介绍:
6 N5 |" Y3 S% W- `1 S CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
1 U8 X5 W6 n9 ^7 y Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
3 D% r: N0 c$ b+ L. ?# g 2、安装步骤: 5 n& H# R( k9 Z. n) B2 A2 g
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 ' G# Z, H/ _" d0 y4 }+ s9 d8 M
3、使用说明:
0 E; ~5 f$ a: J3 ]+ { 
$ D! Y' h- {. u) z+ h5 b 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 + M6 m7 w% H3 E: V; \- A% T l
三、PMD
6 n: O4 Q' B( G 1、整体介绍:
) F* o3 g4 n x* q0 V7 n PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
# G% B. y E$ t
: r* Z" R: \" k5 }5 h4 T- u1 q 潜在的bug:空的try/catch/finally/switch语句, x! N: h1 t. @- \/ z% }: |" J8 A
未使用的代码(Dead code):未使用的变量、参数、私有方法等
& k U' F4 z3 E 可选的代码:String/StringBuffer的滥用
8 g9 Z5 J" X* I8 A s( e" Y- h 复杂的表达式:不必须的if语句、可被while替代的for循环( ~; W ~2 f' M' T
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
U' w& k. s C$ u& e* b; d' @ 循环体创建新对象:尽量不要在循环体内实例化新对象2 a" D$ ^/ A" N8 R. `& h4 J L
资源关闭:Connect,Result,Statement等使用之后确保关闭掉) Z. M* Z* c' O* w7 c* c$ X$ t# g
9 ~/ Z$ I, \2 y0 l! p" ^ 2、安装步骤: 3 R1 Q5 W4 z- o) r1 Q r5 p# ?
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 . f. ]2 r0 P* {- i; V' t
3、使用说明:
. v; e$ m4 R3 D
7 }) r* s' |8 j8 `! A 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html1 J/ ?/ ?% M/ ^# Z3 e% N/ L9 Y$ y/ @6 W
( h! l k! `+ H8 N, T- n 3.1、运行方式: + R: ~! T& w6 X% }4 d3 K
(1)从Tools菜单中启动:
7 y4 N$ T0 T$ i2 g) i0 [2 } 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
" ?& h2 n, y3 A' y4 ~2 G3 m/ f( k
& w1 y) v% L) S1 y; ?2 N Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。6 d' y/ G; u% B5 t# s; f
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。3 a( }5 ^+ c" d1 R) a U- ~
0 S" \) y6 g5 v% B (2)从右键菜单中启动: + I8 u% o/ Y" a: V( L7 e
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
. w {9 g" ?* e0 i 3.2、运行结果: & R8 x7 b; Y2 M
 ! B' O/ D% a) o
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 0 h3 C% {& i5 F! J5 Z: N+ e# i4 V% M
3.3、配置检测规则:
2 i; Z) R/ j" N; e9 S7 { 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
6 g( t" T# b0 c" ~4 ^, _  h* r+ J* i& }) |9 z
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 * m8 Z& G" V, e5 |) [, y$ E; H7 N
点击“Options”选项卡,在其中可以配置一些检测规则选项:
1 o0 Y: }9 _2 ?. ?8 e! V 
, q* u4 f$ h" l" v- x S 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 9 R6 U0 t% _( X" Q9 ~; Z, M
四、FindBugs: " ]; [$ j& _0 z
1、整体介绍: ! i3 W. [( t/ [6 i* M
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 " o8 L& ^! Z# O) C# F7 Y
2、安装步骤: : e' n$ I4 G2 c2 R6 L$ I5 l
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 ( J; t1 ]7 s7 W* L; y0 L& Y, b7 A
3、使用说明:
) \8 L: S9 p# ~ FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
. ~- j; R( Z& L( l- N  / G# x l8 w& N/ a0 i0 F
分析完之后就会出现结果面板
3 `$ U' }/ U7 k* S0 j, x3 K  * L4 M, d+ @2 c8 O" y0 N/ Y- c8 `; r8 }
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 G! |, ~7 J8 {/ n2 j* P
- ~9 i% X4 K' m% E' d& u, h9 o
4、附:常见的错误信息
/ V' Y9 M: S+ L0 Q* e( z4 R 4.1、Bad practice 代码坏习惯:
2 Z7 ~0 I1 R# J5 a% A6 m, X) E# B0 @
7 R9 F/ |* f7 A+ D- w2 |9 S: v' d 图片 % e3 |4 V$ E/ ~2 p" O- K/ R3 o
4.2、Dodgy code 糟糕的代码:
+ `! p, S7 T7 |% Z1 \1 f* k- E, a0 F- O) R; s; i( X
4.3、Internationalization 代码国际化相关: : c1 B' ]$ g% a6 D; V' J4 [
4.4、Performance 代码性能相关: + o7 K. c/ l4 S9 h
" _4 m* X- P" L7 J. S% b; D
4.5、Experimental:
0 T) V9 a) t; z
: Z5 ?6 Z+ p- b `, e2 ` 4.6、Malicious code vulnerability 恶意破坏代码相关:
; w) u( C" L$ k3 O4 x1 _# ?9 n' b/ Y
) f$ K% G4 f1 H% A0 N! `4 T 4.7、Multithreaded correctness 多线程代码正确性相关: 1 c& J+ z- K; p7 s7 |, ^7 N, P: \; O* m
4.8、Correctness 代码正确性相关:
1 E/ v& F/ H/ s& O o0 ^2 f5 D% `4 N3 L) i9 t# j6 D
五、SonarLint:
: {/ t& p- M( d I& }4 Z( p 1、整体介绍: # n- `' d' f/ J: T
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
) Y1 U7 |5 s* S- Q 2、安装步骤:
7 ^3 m$ c4 X q8 d' U, _ 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
; w( Y+ a @7 p* C% V3 {( l 3、使用说明: 8 F8 F% f6 ~6 E3 Q
: Y! V+ {5 x P8 U, V: D; g6 l 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
; b! d; k% E1 f) r+ R! N+ h8 S1 E5 X7 e4 M3 Y. {2 i. r3 I
4、配置 SonarLint 服务端: + s2 D" G" Q$ L1 A+ Z) u
4.1、配置 Sonar 服务器:
. M# b% u' V9 O2 [% G0 h sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
4 q) Z! Z& i" U
`# W" m; B; A4 r) x8 J 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码 ( o0 m+ C4 T8 g$ e: d
$ \0 X" v: ?& L- Q; \. k 4.2、具体 Sonar工程配置: 3 `9 H9 c! j0 g& j% A- V
配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: 9 n1 ?) t* E. N: l0 M! F/ m: G
; }; @! E; ^1 y 4.3、使用 SonarLint 检查: % U0 r* O7 q1 ^! A
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查
, T! I$ z4 y1 D8 l) j: T2 ^4 M! k' R) P
总结
# N2 v v7 L* Q3 l& K7 P2 n# t
+ t0 X3 ~/ q8 R9 l# f i- Z 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
9 Z B* F# _. R! J0 c; G 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
2 d" A: d) K* a3 S8 c$ J9 c2 M PMD 自定义能力强,用来自定义项目BUG规则非常好用
0 ^9 p f+ r( Y- J2 D! z Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。, B" h$ p' D" E' O, R8 M6 V- _3 m
SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景& k, h$ r" a3 A4 _
! o# P4 e9 G, @$ F% s0 M) } 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多 ( U: Q' W9 i* @
; b& t2 l2 N/ }& ]0 ?5 V# x* ? 责任编辑:
- f ]$ b8 E- s2 {8 r8 l5 M/ L B2 N9 ^
6 f9 t5 g z- f: }& [% `% j
, t# ^) J; E9 F- t$ y6 d
1 ]( u; B2 z1 J, w$ ?6 S |