|
' P4 ^0 H9 f* a R
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
. d* F, M5 U5 R
: a& U$ U9 Q: G' i 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 . |4 @- O0 {# \ t' Q
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
9 C. ~3 ]/ }- @! e. ` 一、Alibaba Java Coding Guidelines . Z" R$ r" u( I! F
1、整体介绍: 9 }. D9 `+ q) g/ ^+ L* J. y
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 - @5 o$ [: x. H& N" k& x
阿里巴巴规约扫描包括:
' m0 }6 f7 n& x6 Q! r: T* d
# I: ]- D) y% v9 |5 c OOP规约2 b2 ^6 H" N ]$ V0 y
并发处理
0 A3 w8 _0 U9 Y; B9 a! A 控制语句/ A. B" g* X. J' O6 e2 ]8 q
命名规约* }0 [4 j% G' S6 N" T7 N1 x
常量定义0 Q$ q: g+ O9 Q
注释规范
9 } ]# v% F7 O8 _+ V( T5 J1 |, Y
. p. t1 |& r7 s6 a! O7 v 2、安装步骤: 0 p$ Q$ ~- Y% j1 a9 W
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 ( ~- j3 K$ x* R6 h8 ]7 n. d7 a- E7 r
3、使用说明: 9 P2 `( p9 N1 w4 }0 M) @
3.1、运行方式: 1 T) c- E' Y X' a7 a% c
(1)可以Tools > 阿里编码规约 > 编码规约扫描
v' i, S, I3 `2 S' e  7 V1 y! k/ A5 {) p5 ]3 m: T
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
( W/ b9 e0 \: w; b  3 ~8 \1 d, N2 L- @) U
3.2、菜单功能: $ f. p+ E. j# A7 g" Z
0 K# H5 ~% u* G0 k# p
编码规约扫描:开始扫描代码* ]+ J9 ^& k( v+ e& n" X
打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能7 u, }4 _! |0 n* M" Y3 J
切换语言至英文:中英文切换
1 ?+ H; `3 A, x# Y; ~; {
1 y& Z% ^; k9 n- S; a 3.3、运行结果: ' W. W# p V5 F+ b6 k, c$ d( V5 ~- o
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
6 N7 V- e: g: D/ g* S4 a# ? 
7 T$ ?3 t5 l: X) Y 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
1 A" m! M7 h1 c2 Q 
2 O& Y# L6 z* e# `0 T, ]! G (1)指定区域搜索同一类问题:
) }9 m* w6 g8 O) M# z$ y 当点击③处的按钮时,会弹出如下按钮: & l. e9 E9 M" J" z/ D3 x8 X

/ r! M3 S$ Q# ~# Z 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示: ( C# U+ i1 D) E1 A" i, l9 E

9 E0 g# L) ^+ |5 A; F2 N 这里我们可以看到,显示了整个Project中的所有该类的问题。 6 c: A6 O3 r! |% d$ W% ~
(2)预览具体的不规范代码:
. W# L' b, S, g 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
3 x+ P1 C# C7 e$ D6 V. Z 
4 p- N0 c8 \. h 3.4、工具栏功能介绍:
8 u' ~+ A; T7 g o8 h* n  , [8 g4 ]! Q( V4 C
' ]6 Q: S' u4 q5 Z; l0 Z
Rerun Inspection:重新运行一次扫描
( b2 v/ v& B. D" w% y" U! P Close:关闭真个AJCG面板
% x3 G7 W: F! Z$ h7 q. i Expand All:展开结果的树状结构,整个结果是树状结构的。
3 E, }* D3 z5 ?2 A) y Collapse All:收起结果的树状结构
* c: Y! l+ T1 j( H0 y Go Pre Problem:选择上一个问题
% b' `- S) ?: ?* R, H7 Z& A5 P Go Next Problem:选择下一个问题
8 D; ]: K! Y7 F Help:帮助
5 Z- M9 l2 b* r* g9 d$ } _ Group by Serverity:(不知道如何描述)
* P' b( r, N8 j Group by derectory:按目录分组/按类名分组间切换
7 [) o+ q5 I: H7 ?1 ~ Filter resoled items:过滤掉已经解决的项8 N+ L$ |& _5 E
Autoscroll to Source:自动滚动到源码
$ |" S5 ?/ b" ?- L Export:导出,可以导出为XML和HTML两种格式/ R3 l$ T) z ~# M/ D
Edit Settings:编辑设置
$ I: i F6 s3 F2 h* x7 R4 O
6 z- u, G( A( p( Y4 o- [0 J {% ` 二、CheckStyle: 5 J. ^8 e* @& G& c/ g
1、整体介绍: ) |, Q% K* v- x' J
CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
1 C4 N" t* C+ w) i g1 X5 X5 v# D Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 4 T9 Z. |, Y9 e% _ t0 e3 A
2、安装步骤: G7 L& e# l4 b# z# x* t" q) K: z
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
3 ?. d) v# y, S2 i9 z, \( A& S0 W 3、使用说明: . F* H4 E5 Q$ E* [" `! j
 & v2 r( g) N, N8 N4 O) H7 T. \
可以看到基本都是一些缩进啥的编码规范,可以不用太关注
! W( L. s: [3 j9 @) u1 p 三、PMD
+ K; ^. }9 j4 Y$ E 1、整体介绍: 8 M* v0 t4 q0 T0 p1 h6 q+ r
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: ! y* N5 g" x9 C J
0 j4 V. Y1 K7 }: D, `5 b k 潜在的bug:空的try/catch/finally/switch语句
4 @5 N0 V% l) z2 u) E6 j, O 未使用的代码(Dead code):未使用的变量、参数、私有方法等
9 r# ?9 C) h8 i( T 可选的代码:String/StringBuffer的滥用
! I5 @* L* e+ ]; C) b% N 复杂的表达式:不必须的if语句、可被while替代的for循环; }, z* Y. |" q8 P) P1 T
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs, ~& t2 q8 d1 ~4 f: `
循环体创建新对象:尽量不要在循环体内实例化新对象
& b( w: l5 I' F! e# d 资源关闭:Connect,Result,Statement等使用之后确保关闭掉5 A; @1 x, T7 h9 c) F/ u; W
- E9 F* Y! i9 ~$ N 2、安装步骤: 7 w# f$ U5 s) Q" d7 u
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 6 w) s. A0 {" R" M
3、使用说明:
8 e5 k+ z6 q; `, h# S% t! ^
; O7 d" R/ T" ~% v: J( y 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html4 Q9 T# C; d( ^( X# E8 p1 ]" j
" W# p% h5 z; n3 f P
3.1、运行方式:
4 e& Z2 \ D: T4 l+ Y2 I$ ] (1)从Tools菜单中启动: 0 ?6 j9 f5 N: _1 V5 J3 K1 z# K$ G
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
3 l m9 w8 O; @! k' N
* c$ y2 Y/ Y" B! c- s, l) }" H O* q Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
}/ e1 I: J# {7 L Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
0 O7 y$ A$ j' J1 {: P2 c; A
2 F" N/ B3 G4 B: R- s7 ^0 m (2)从右键菜单中启动:
$ y5 G! F, w/ u 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 $ N* B* ~2 Z& z8 L2 N
3.2、运行结果: 1 i. U& X0 O3 ]* |
 6 ^+ j- R3 J( L! f' L
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
; ?2 h2 g8 N; T9 h' j 3.3、配置检测规则: # A; T' i' ^' {: c1 k( Z3 A
通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: % j# T" r5 k( V0 d7 }4 |( J* t
 3 ~0 k, R7 \0 l! r
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 3 J' p: [. i4 D
点击“Options”选项卡,在其中可以配置一些检测规则选项: 5 Z! v7 g+ D( r2 B1 |; U5 @

8 g' C; X4 u. J/ B" C 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 : K. ^/ O. P! x/ Z! B4 ^4 [+ m
四、FindBugs: ( O; K3 f4 {7 x# N! i* @
1、整体介绍:
% S) X" o3 S7 D! {: m! C, d FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 1 ^, i% O5 V0 p* G) A4 x4 T9 _
2、安装步骤: ) z/ o- r( w, L
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 4 x) ^9 j6 z4 ?) _% J
3、使用说明: & n& G5 C9 C% W3 M5 X: o
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project * g. ~( c' _2 Q+ D" c/ }
 7 V# r- z) |, N& q) T
分析完之后就会出现结果面板
( @' R+ K$ [- p. d2 K1 A. C 
- W1 R" Q- x2 O3 L. y+ i 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 / [: N( W/ Z+ Z% R% D
( V+ D: ], N4 L! I- ~9 s) k 4、附:常见的错误信息 " r8 {- M4 B2 u' Z
4.1、Bad practice 代码坏习惯:
0 q: p3 @7 U3 n5 l- O0 f. @
( ~9 \0 c; D) P. W 图片
9 i# i! G0 \3 A9 W4 T 4.2、Dodgy code 糟糕的代码:
V: ~1 L* F4 V/ }* p: O' ~! z; X9 h$ E- D; s0 @
4.3、Internationalization 代码国际化相关:
# M1 E4 w, P" S/ ~4 V- o 4.4、Performance 代码性能相关:
% A. I; s2 b5 L$ l3 s( i
4 s Z$ _4 t5 e6 Q! r; V6 s7 ^2 k 4.5、Experimental:
$ R: i# l6 I( H5 Q. F$ L* s! U# M- f" s& B1 {4 a/ W3 ^7 U" A" P' B
4.6、Malicious code vulnerability 恶意破坏代码相关: 2 G5 ?: H0 ?6 a& N+ s' K0 @& m
$ V; r* `6 G. Q4 e; b, B 4.7、Multithreaded correctness 多线程代码正确性相关:
- r/ p1 f, f$ d1 [/ V8 ^; ? 4.8、Correctness 代码正确性相关: ! s0 ?: ^/ ^3 Y
* I9 @: g& g" L8 l- [+ {- D7 }5 j
五、SonarLint:
' Z( S6 z3 u2 U 1、整体介绍: ( v1 ]$ ^0 _1 x: c U
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 * b+ A( G5 u* f }- f$ L- A
2、安装步骤: * }4 [) g: }, F
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 6 `* D$ ^4 G1 S
3、使用说明: 2 `% q) ] ?8 p" c
+ V) h( n1 a& e" G: d 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
4 v/ ], p8 h+ D% T: T4 @
6 g4 F; K# q3 k; j6 e3 l0 ] 4、配置 SonarLint 服务端: 3 Z/ Z$ C x4 f( q. W( A
4.1、配置 Sonar 服务器: 6 M1 A, e) g1 q( t! i
sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: 6 ?0 M0 R$ z* h0 b% r) I* _* G
3 g- H% |" t, l. x2 U 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
- Q! T X2 w( i2 _! Z3 j3 N: a$ O, d! ]" B% b- \+ t" F
4.2、具体 Sonar工程配置:
! W6 m+ [# {: o8 A: u3 b! y 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
# i. ]7 `2 z/ ~& j4 D, c& i. w3 v9 L2 L
4.3、使用 SonarLint 检查: 4 a: Q n& w8 ^ J w, m G) G& f
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 # {5 S+ h4 `) k" T/ c" R5 q
3 S, L) w! e* K2 M8 w2 e1 G 总结
2 K1 M' m+ ?$ n# R" J; t9 q
5 j6 K2 b3 _) `5 K/ W 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了, O- Z2 a) r/ n" `- b
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:; A5 J K" \/ {4 m" u3 `
PMD 自定义能力强,用来自定义项目BUG规则非常好用
' u" r w$ e! S' m% p! N) K9 z Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
/ D& u2 q9 \) v SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景3 d" G. [3 X5 i# W
% {- E# q) J6 J" u
文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
8 M6 A- U$ H" z& K* ^' p) J) q% I
, S0 X/ g, M9 e" C: q6 R8 X- C 责任编辑: 0 c* Z* o* A/ l. @- @
; t/ H4 W9 R4 i+ B% `! S
9 c- o" X$ b. c, k0 q/ {/ m! @4 r; k
* y" r0 Z* r/ W6 n. a |