|
" E1 E6 f2 H- `: M* X2 @" W/ `
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
5 q# r; Y. l7 L( i$ k4 `8 s6 T0 x5 P% c5 k( k
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。
' A5 u$ D, }' E) z 工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 + z# P( U2 z. Z5 A* |. B
一、Alibaba Java Coding Guidelines " Z! f8 [( _3 A( Q) E; W# e% n8 V
1、整体介绍: . `, v7 ?: f* H. E8 ]
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 6 U( o4 p) F1 N% L
阿里巴巴规约扫描包括: ; U% P; d( Z8 y2 i, O! y
$ X. M j. V6 |: K
OOP规约
2 i2 f3 z' F( Y, } 并发处理
* A6 y& D2 f# N# J 控制语句4 D+ D" l* J$ F1 j/ \5 ?. S: n
命名规约. n% y$ l( }2 o2 e& s4 s$ {
常量定义
% j0 `$ H! y2 n" H& [ 注释规范
. z' L$ B/ r% P- l7 ]9 Z3 ~+ O% A) q5 q
2、安装步骤: 4 D- [+ h3 h, z+ s, ]& n
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
1 x3 d3 A0 w- u6 d2 E 3、使用说明:
- D& k; c: c8 w z7 W" z 3.1、运行方式:
+ O$ }3 j$ V% a% K) h (1)可以Tools > 阿里编码规约 > 编码规约扫描 8 @' p0 v6 g1 f \1 Q* l5 s+ C
 " k, H& y% F+ M( E4 o* L9 J5 Z2 {
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: 7 v0 b+ X! C, j
 8 ?1 O: v3 F, W+ n& N' h
3.2、菜单功能:
9 l4 @/ E6 L; o7 M" _$ f3 p% i4 X! f( w# u% x
编码规约扫描:开始扫描代码
7 {+ Y% ]+ ?8 g& o: q 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
1 J+ z3 l- I3 q" h8 P, _. C: K 切换语言至英文:中英文切换; j4 ]+ {3 e$ m! r; x
& f' e( f# @9 m# t- N
3.3、运行结果: 2 ^: B @4 o" _# X4 P+ E4 R! M9 C
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。 % P: w* ^: X/ ^1 g5 R

6 g- f6 ?/ P) h% Q 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): 3 r9 j% j9 U% t7 O. N, i; I: Q2 ?
 " I" Q3 @1 T( w1 u# b" {* ?0 E; L
(1)指定区域搜索同一类问题:
' T1 N9 h: g( a& Y i; C; s; H 当点击③处的按钮时,会弹出如下按钮:
* b. A4 M8 }; E8 E; r/ l  ) n8 Y# k) K" q4 d" v
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
4 l1 C! V; g: U- y& p8 T 
B$ f* |0 A8 ]6 O 这里我们可以看到,显示了整个Project中的所有该类的问题。 / n3 T& i3 ~$ r. o5 ?! k# w
(2)预览具体的不规范代码: : a: ^8 _6 t7 c( N; F' G
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
3 U j- F. K6 ^) Y# b  ; W) l9 {/ p* x, B6 i
3.4、工具栏功能介绍:
! h" H7 \! r1 m6 b+ z9 Y- h) c4 B1 r  , S2 p- t& _" v
; ]0 w+ S* X7 C- S( a Rerun Inspection:重新运行一次扫描
2 j1 {" b2 E# V% w Close:关闭真个AJCG面板: V) |2 L' x1 V" z2 K$ f( q
Expand All:展开结果的树状结构,整个结果是树状结构的。
- h( P1 Y$ R; Y' S8 s1 M Collapse All:收起结果的树状结构3 ~/ G5 L/ r# l' P4 C
Go Pre Problem:选择上一个问题9 Z1 M' ]% i w. ^: H$ `; j( ]3 S" \
Go Next Problem:选择下一个问题
- H. C U$ }! p; Q" X( p3 k Help:帮助3 o4 h% {) m) b) A7 p4 _
Group by Serverity:(不知道如何描述)* G, J: o4 l, J
Group by derectory:按目录分组/按类名分组间切换
4 `9 D1 \' H- e6 {/ X { Filter resoled items:过滤掉已经解决的项7 |% H) N4 _% ?+ A( L8 |$ ]
Autoscroll to Source:自动滚动到源码
2 |& G I! J8 P" j Export:导出,可以导出为XML和HTML两种格式
- z3 b g( _- x A* ?/ I: v Edit Settings:编辑设置9 R$ A Y2 O3 \/ V6 m
5 i% d! i4 S; }, \ 二、CheckStyle:
3 n2 T+ k( k7 W 1、整体介绍: " w0 r4 A. h. |: k1 |' T
CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
# ?8 ^) b/ f8 t1 ?) s. `/ l Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 % o6 u+ y- M( X" \9 z3 D( q
2、安装步骤:
, F6 ?! N* L, ?+ w, m" i 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 9 ] B5 z% K) _# z6 j
3、使用说明: , ]! M* {* i! w! R* T: \$ t

$ @6 W! `! U; z8 Z' }: t8 O3 d 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 - s }+ Q, j6 {/ V9 }, c+ K# K
三、PMD $ H& p% K3 h" W! o* R
1、整体介绍:
9 k2 W% V5 M0 v5 x# V( N5 J A PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: 4 b& v, V) Y: \
: R5 A+ j4 t" m- k+ b
潜在的bug:空的try/catch/finally/switch语句
* v' e: D6 l* \5 s: {" f7 K3 C2 w 未使用的代码(Dead code):未使用的变量、参数、私有方法等& Q/ L0 ?% x0 ?0 q
可选的代码:String/StringBuffer的滥用
% m& B; m6 W, {' F9 ^: N( m% ` 复杂的表达式:不必须的if语句、可被while替代的for循环3 N* q9 r: _$ i0 j6 \
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs+ d9 c7 `4 c k
循环体创建新对象:尽量不要在循环体内实例化新对象1 r, z' P& j8 Z& r$ P. s s: c+ V
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
~/ }1 m' Z) q; h; Y0 ^0 r2 N: _( g: P( Z/ R
2、安装步骤:
2 p* I% L; l6 E 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 0 }: X! c+ Q) ]' c4 v6 J' i
3、使用说明:
* {$ A6 R h9 N" `4 G# T; H+ X6 h
参考文章:http://wjhsh.net/andy-songwei-p-11830812.html/ e7 f6 H+ {3 E0 h0 K; E, p
( n' H. |- {" b$ B0 ?; h# G2 M! I 3.1、运行方式: * y5 V& U! n' X6 z* p# e
(1)从Tools菜单中启动:
% y7 t% Y6 X, v 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 # o3 C: J6 u( {" L
1 \# f8 C6 x7 L; T6 T3 X6 K
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。* A" z# ~4 G; h$ b# X' ]! s4 v6 o
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。! K/ z! f$ f- x+ O
) f9 I5 ?) Z: C4 Y9 z# n% L$ h (2)从右键菜单中启动:
3 b/ d! r0 O3 B# `4 ? 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 4 l9 F9 h1 I1 }- q8 U1 ?8 B
3.2、运行结果: % f+ d' q5 Y, N0 j5 J2 b9 x

" ^) t9 q' v7 \8 S/ C2 h/ U 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 : J( ]' O- Q$ `& s, i
3.3、配置检测规则: 6 B2 o- o. Y8 V) B2 A
通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: 6 o2 _8 p: V. Q7 S. d! l i3 j

' n# w/ j3 x/ J 在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
7 O2 @. C# p8 B 点击“Options”选项卡,在其中可以配置一些检测规则选项: ( p- t% {0 V8 r6 W7 m5 g
 3 U' n: q4 k- R
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 2 V0 Y: d4 T; S6 F8 p
四、FindBugs: 0 I+ g% Z% {/ c0 d. G# S+ _
1、整体介绍: / h7 m: w1 D& w/ v
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 1 b- z+ M; a* r' t" F9 S2 i
2、安装步骤:
- A, W9 ~ P9 W* z4 a 通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 H: ]& p: v, Q1 L9 y6 x
3、使用说明: 0 ^. d, i. Y+ p2 L' a" U
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
; d& o/ S* z( A2 N8 a 
6 f( A7 Q& D7 d' U: ` 分析完之后就会出现结果面板 . {- x# j; y7 V. p0 c0 N0 R
 # F7 U0 v/ z+ J4 w$ `4 v
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行
3 q7 [ h0 q$ ], i- e* i7 M1 @5 d) r) O, k8 @
4、附:常见的错误信息
3 r ~1 k6 J& R 4.1、Bad practice 代码坏习惯: p: F- n* a6 e# R, y8 L5 T
, r) j& d5 _2 B, z* F 图片 ; ?3 r. z$ s" s+ B+ L+ {' ~
4.2、Dodgy code 糟糕的代码: ( O6 i/ ]0 L* V* ]) k: d
- k8 u8 ~7 J# C- N" }
4.3、Internationalization 代码国际化相关:
# E' j- M1 Z+ K- i& J# B 4.4、Performance 代码性能相关:
: [& q9 Y9 f- e5 `0 @3 o! `. k: D& Y
4.5、Experimental:
/ M! D$ S; q$ x+ p3 s/ X) T9 ]6 ]8 v- @8 u
4.6、Malicious code vulnerability 恶意破坏代码相关: - o- D. t% S# [, J# j
6 Q' z a! Y- i3 N! z
4.7、Multithreaded correctness 多线程代码正确性相关:
( u* W$ U2 r9 w2 { 4.8、Correctness 代码正确性相关: + U' }8 Z$ [# q) P( q# e0 h" b
% ~0 h- h8 D! X+ I) r7 X1 G( j 五、SonarLint:
* ^6 T1 R" |8 J 1、整体介绍: ( b, |! u/ C6 ~
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
; ~* F% t; o4 c0 A 2、安装步骤:
3 p y- c: y' i; { 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 4 v5 `% z, l4 p" g) o& c# Y
3、使用说明:
0 E( X) }# _2 \
) Q7 o( k7 b8 N5 q' H' F4 ^ 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
+ c' ?0 u. k; }
( f8 I" [+ X7 y9 d* b 4、配置 SonarLint 服务端:
# Q' q: a# L- ~# B! p! [$ R C 4.1、配置 Sonar 服务器: j, [" I; G6 `& e l* }
sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
( j/ T" F# a$ S4 |, d4 |; ]4 z
9 Y& |, z, G) q, s" R3 P7 M5 b) c6 \ 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
. G8 e% x- D2 Y; {% Q* g& ?& U
7 u+ N3 C8 ` O) [7 G- d( U 4.2、具体 Sonar工程配置:
+ }/ e& d9 h) P; B6 @( @ 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: & f0 o0 {5 i% g) Q! x) g
5 h4 h; I! V* P/ X; X/ K, `9 L; i 4.3、使用 SonarLint 检查:
; ^1 K0 L1 Y$ V9 @% O4 g9 a 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 : a/ V w% X; H
1 ^' {/ k7 y7 t2 a, H; P 总结
+ T1 P- p4 }2 p# _3 ]& K2 B' f; p2 X. s' E
2 Z! Q- ~6 O) p1 }3 y' e 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
/ ~5 }7 i$ \, k. S! X* ? 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:5 p* A. H% z% H
PMD 自定义能力强,用来自定义项目BUG规则非常好用; Q M/ Y! ? _ h
Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。9 T" H7 U4 K5 R- i3 S. A. E+ o5 q
SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
" u' x; @+ C1 X" D* @0 @- c
( ~ V+ `; K8 i' @6 T0 w5 }" l% m' p 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多 . S( U4 t1 [4 ~% p9 ?" S$ v# U3 X
" T- s3 G. e# H, x( n! |1 z
责任编辑: ) m" ?" ? R9 I$ w
, C. _9 j, f. `6 @
: Q0 X3 A+ B4 |" ]9 F. m
. z( b0 O% p# T7 |0 f# `6 N' x
|