|
7 a2 g6 v9 J. X, p+ b2 c. R- [
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
3 E. A4 v0 V4 f
9 O) e$ R: ?0 Q. t7 K 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 ! z% e. P6 j# Z" t6 t+ n/ E$ [# z
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 6 C6 F# E$ O7 }0 P
一、Alibaba Java Coding Guidelines 7 R P" @$ r9 Y2 c: I' _5 a
1、整体介绍:
# L+ Z* T, S/ D; F! \2 ?# J7 D2 ] Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
D$ D0 M% K& x 阿里巴巴规约扫描包括:
7 }) R4 @# V6 H Q; E# N% P
6 a Y* i! I5 f+ y* K4 y4 m OOP规约
1 H/ }& t% D& b 并发处理
! D4 j. l* J7 b3 G8 \ P 控制语句
: @& y- ]/ R. Z0 }$ X- ~ G# c/ N 命名规约) R" ]* \- P5 c
常量定义3 |2 t+ {. |$ ?9 ]( e+ _
注释规范: T @1 f/ S9 C1 A2 h7 N
' \8 X4 V$ w5 j! U6 `: j 2、安装步骤: % p a7 |6 h) e" w, Q4 @. c1 S5 z5 S
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 7 O/ h3 h2 e* ^8 f6 v3 [5 }+ Z0 d
3、使用说明: , q) r* D' @9 H) @$ g
3.1、运行方式: ; j+ `6 V2 _* n* W! O1 x1 ^$ M
(1)可以Tools > 阿里编码规约 > 编码规约扫描 : x$ ?: l. J6 E
 * c' ?) B( {6 B- ]* t9 |2 V1 D
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
/ r8 Q. F7 Z% V, Y q  ; F% i# u" W8 D
3.2、菜单功能: ( V K% t6 j* b: A
0 M- [# t6 W2 `" A# t. C) @1 [- G3 ]
编码规约扫描:开始扫描代码
3 [: x1 e% G' ^! d# I2 n 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
6 R* `$ _: R' D: Q; T7 K- a x 切换语言至英文:中英文切换' d/ m, W% R; s! ^
' D0 E: o7 I' s: u6 I& C
3.3、运行结果:
! P" X& [4 e1 t0 B8 e/ s 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
# ?4 N' H: w* p 
# N- V( k" m! f: S3 Q$ o: T3 x' y 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): + X" S5 C: _) U* M

( u: l( j9 H# m (1)指定区域搜索同一类问题:
/ ]8 g7 K% l# o1 c% ~$ E 当点击③处的按钮时,会弹出如下按钮: 2 B) ~9 _5 Y% f5 J
 * U& ^# t0 J' e+ m# }/ @
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示: 9 B6 \4 c8 A- \) l- O
 4 _4 \" Y1 u3 Z- O6 i
这里我们可以看到,显示了整个Project中的所有该类的问题。 $ A5 X" q \, y q, z. Y) q/ \2 q
(2)预览具体的不规范代码:
6 N3 Z0 w4 i, N 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 : _# O) l0 {$ E6 |

. F& `2 y2 X4 `; L 3.4、工具栏功能介绍: & ^5 i* t* r, w
 9 g) l8 j o; U# j8 i- X5 m
+ t0 r! z+ v6 u$ U) G Rerun Inspection:重新运行一次扫描7 o/ m! H) Z' A6 D9 X; X% d, d0 ~
Close:关闭真个AJCG面板
& a* C9 N4 q: R! l3 ?8 G' { Expand All:展开结果的树状结构,整个结果是树状结构的。
4 [* |" \+ l' d- m9 \' K6 d Collapse All:收起结果的树状结构
: z" T7 t ~* P" i Go Pre Problem:选择上一个问题
) B& k% S3 b1 I& r7 | Go Next Problem:选择下一个问题) t$ R ?( I7 B5 ?# d
Help:帮助5 @% z- C6 M. \/ v9 X
Group by Serverity:(不知道如何描述)& M1 L+ G1 r" D" I
Group by derectory:按目录分组/按类名分组间切换/ Y* o, ] i; k3 |4 _7 H0 z
Filter resoled items:过滤掉已经解决的项% y; X; n+ E% L& i
Autoscroll to Source:自动滚动到源码9 l* _1 p" V# G' @/ V
Export:导出,可以导出为XML和HTML两种格式
* o) S* ^- s- h* s- R2 [; ] Edit Settings:编辑设置
: p- y# _1 @. T) ^& b$ M% }/ c" d6 U7 b/ R. c0 Z& e1 {
二、CheckStyle:
& F) W: z- g4 b( v4 D" ~: k \# P 1、整体介绍:
, g0 Q M" t6 H2 J4 w2 }; N2 H* f CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
# J3 q) o8 w; w+ E. } Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
; F7 C. r3 g# w) e5 Z) Y8 } 2、安装步骤:
. _( a2 Q! w6 l) u4 _6 U; { 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 5 h6 R0 ]; c! B+ n
3、使用说明: 0 w# t; G0 g3 k" R8 y; I

' `+ U) |8 a( w. y+ D$ H" _ 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ) O! D4 e. o( q7 b
三、PMD ; s9 A0 Y% f8 T% y, m0 q/ D
1、整体介绍:
4 K2 F2 [; s t. a5 M) p8 w& ^0 B: \ PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: E( l3 \9 D& J* ~) U- K: i6 b
# w! u7 F" d* H) \7 H" ~5 t( J 潜在的bug:空的try/catch/finally/switch语句
) h& }, G& E. ?# Z' Y5 @ | 未使用的代码(Dead code):未使用的变量、参数、私有方法等
, m' G+ T6 b' n% p& P0 L 可选的代码:String/StringBuffer的滥用 I( ~7 S( D4 Y1 }8 e
复杂的表达式:不必须的if语句、可被while替代的for循环
' {: C& k: P3 g0 |5 _' w 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
2 q! v& q! {+ Q& |' ]- k 循环体创建新对象:尽量不要在循环体内实例化新对象' c+ U1 z4 u% @9 y" \# t0 l) j
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
% ?8 b( l) C- h' F }% l1 P! m( q5 |0 r
2、安装步骤: 3 O+ W- X E8 z- s
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 % x/ J3 Z0 h. C' W
3、使用说明: * X2 B; `" ^' X
" [! Y: W4 H( q0 K# A 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html
1 a+ q4 h* }! |, o' C5 L# z* |2 H' p9 S7 g
3.1、运行方式:
' y$ R5 s# w* J (1)从Tools菜单中启动: / v4 _3 S, X$ S' U( N* T
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
% [6 `5 s9 u: G4 u( s1 S2 Q; o4 I; t
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。, d! ]* c/ h" x- a3 X
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。, f& k2 e! @, \& v
, y/ m; U. ]6 _7 y (2)从右键菜单中启动:
0 n+ s* u i; b6 S( Q* u4 K 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
S# w0 u7 E# i; D8 i 3.2、运行结果: 2 ^+ w+ Q/ r& f5 V
 * M5 q$ i# @% p& V
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
# o t( n. B- L0 `9 A 3.3、配置检测规则:
% m1 r9 t% ]- R; f4 O 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: 5 C3 r( j) U1 K' D' s
 7 G% o7 y# b- |! W( p; G2 T
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 5 R- |) M7 _- G9 j
点击“Options”选项卡,在其中可以配置一些检测规则选项:
) j4 y( \# i! h+ E& a 
- b! t* R6 q8 s! j! m 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
. I4 u7 r+ V, r8 p6 r. p 四、FindBugs: 0 t& f4 k# t- Z5 y( b8 \
1、整体介绍:
1 V+ i" T2 Z9 z FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考
7 k' \7 k7 o7 {) V6 }1 C& P: e3 Y 2、安装步骤: ) p1 u$ @/ ]5 S
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 5 I' A' o, P% {5 @" @% N
3、使用说明:
5 w: S* J! R" N' F9 { FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project 3 f, y5 u- r9 N1 `
 ; f9 w1 w! q& |1 o. b
分析完之后就会出现结果面板
0 R9 N1 W8 O5 G; I" B  ( A R3 I4 h4 B) I" }
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 $ A1 B0 ?" v% h, i9 ~$ ?3 N
7 W3 E' d; g) e- x/ i$ z
4、附:常见的错误信息
8 S1 K: J9 s6 Z1 {' I' h 4.1、Bad practice 代码坏习惯:
/ ^3 _' \) V4 R, L: k" i* c9 S% u
& w# x" e2 L2 }$ x/ y 图片
) A, |2 M; @8 w3 x 4.2、Dodgy code 糟糕的代码:
6 h3 C/ O5 X" j8 P
0 ^: d8 _8 H- ~9 y) N; l6 @3 H 4.3、Internationalization 代码国际化相关:
m# ]6 {, m( ~- ^# L1 N; Y4 U 4.4、Performance 代码性能相关:
6 Q9 I5 q( `9 c& t* d. S& s$ C( u( ^ Y2 c0 e5 A4 B
4.5、Experimental: 9 ]7 \- u; b% n. f. R
" Q* i$ h# `8 t" A0 \ 4.6、Malicious code vulnerability 恶意破坏代码相关: " r7 I! {. N; Q1 a. P
; i! c9 x7 y& F! r3 g6 D. h+ X, U
4.7、Multithreaded correctness 多线程代码正确性相关: % j* m$ M4 z$ O: z1 M! q" k
4.8、Correctness 代码正确性相关:
; n+ R+ Y7 X: r6 |! l$ \* x
) G6 q9 L% J7 [+ G 五、SonarLint: ) y! @4 X1 B2 G" I9 r( _& Y
1、整体介绍:
. ^% ^' \4 }3 q2 m sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 1 v' K8 B, B3 h( {0 ?$ l- s/ a
2、安装步骤:
( V. V4 G4 U- \9 }+ u 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 5 \; S5 @! H6 D4 X; ~& y7 v
3、使用说明:
3 l2 `$ g$ o* ?) K# X1 w' \
; L7 K3 ]7 B3 `( U E9 \ 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 : ?" s u( F1 j6 r
: s* J0 n/ M& X! _. m- t/ k5 V" K/ l
4、配置 SonarLint 服务端: 8 n d( [: e3 P
4.1、配置 Sonar 服务器:
- x8 O+ Y9 f0 s6 h sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: 8 G& t4 D+ L9 H" X& e- V
! r# _5 e9 P5 Q% w+ Q( Z b8 w) e
点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
" _) X' J4 Z0 [( ^5 t' l3 |
) ]4 F. Q7 d' G7 M6 w9 K# i 4.2、具体 Sonar工程配置: # v$ N* ]# a# ?/ f
配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: ) P8 S6 ~; q6 x# I' W, W0 h
/ J( W: N9 S4 P" C/ ~ 4.3、使用 SonarLint 检查: 7 ]; z$ Y% T% f' r
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 $ l- W8 O* k t
}& G6 _6 N+ b5 Z# {9 y 总结 : K; }' j# ~) c! i/ ]
5 z/ ]( U0 @/ X2 s% u 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了' [. P" o5 |" g) L; W+ G
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
0 y3 k( T1 p: n5 f5 Q N0 J# i PMD 自定义能力强,用来自定义项目BUG规则非常好用
5 B, j6 W5 ^( S9 _/ T5 k; K Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。/ X$ Y$ O- q! y! ]" y3 D% g. C
SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景+ L, B1 d% F2 d0 ]$ u I H# B
" h( ]% J# x6 f" J8 s4 T: g 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多 e& M# o) L# l$ `2 [
1 T v/ t& {: q3 e4 v# @+ \ 责任编辑:
h7 r1 E4 S$ U% n% y% S7 w( x" ~* u$ h7 [. e
' m+ M0 L! ?5 h/ I \! t9 M! }% Y5 i5 b! R, w
3 \8 A# T) d2 l. w+ j+ {: ]6 m |