|
4 X& K# F4 s6 k# ^3 k) n* { 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
1 U( W; p, H, }# e4 o8 S0 N! W! y1 B6 I2 |0 w
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。
@6 ^! S* B, m2 ] 工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 . [* U# w T `2 x4 m$ ^' F
一、Alibaba Java Coding Guidelines
" Q9 Z9 b2 g0 S: u1 q3 `5 U7 P 1、整体介绍:
& G/ C3 J- d( ?8 N; e) J# {% w Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
; ]! J, Z# l" b A 阿里巴巴规约扫描包括:
- s" r% f: o- J4 ]; u( ` E% Z
6 N2 p* ^* a* q1 a OOP规约
1 p2 t3 H3 M/ H5 O3 @ h 并发处理$ O* |& F. ?$ i' T3 c' S r& N1 u
控制语句. @5 x5 L& D( q( Z t8 F M
命名规约1 M7 Q( U3 L$ N
常量定义' s7 b4 [/ \2 j9 X6 J
注释规范& \) Z k! q4 e9 d, m! q
) O+ z/ l2 v- y: R) h3 c5 y* ` 2、安装步骤:
. I9 V1 H. F6 B$ T* S1 X File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
/ V5 B( m C5 [. I, i; D6 B 3、使用说明: ' `0 u6 o# Y q1 m- S- ^9 C
3.1、运行方式:
: F- R3 @5 T) V) B (1)可以Tools > 阿里编码规约 > 编码规约扫描
6 v& Q& Y: h3 m0 {# Q  0 S1 J% d8 e/ I
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
: J1 [$ E. i! _9 j% T6 Y8 H 
# c o3 u3 C% `$ X% j+ y. [ 3.2、菜单功能:
& k1 X0 F% @( H0 ^7 W$ }! R) M# N/ f
编码规约扫描:开始扫描代码
- ~# B$ W! o+ V! q y2 @ 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能$ v- N8 Q/ z# @
切换语言至英文:中英文切换
' s, e1 |, B1 r3 b7 m& b
1 V$ i0 ?- ^ z5 |* M, v 3.3、运行结果:
; N' ^3 P/ z9 T2 X& R- T: g 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。 " G# U; u. Z* G, d1 Q+ {
 & h2 \( v: x3 Q0 |
选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): 3 I6 J$ \ X1 n. Q3 t0 n: [& _

7 L" w3 J) ~' R+ g1 q; } (1)指定区域搜索同一类问题: 7 n8 N$ }. l. g# V: ?# R! i
当点击③处的按钮时,会弹出如下按钮:
y# z0 U7 I4 \( [2 s7 Q0 l  2 a4 ~! X( y- y% ~9 \
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
L9 X( L* z) a K. a: T3 d9 { 
5 F! I& _) ]6 y8 Y, }! ~. `/ e* } 这里我们可以看到,显示了整个Project中的所有该类的问题。 5 @' v2 ^5 @# J$ V! ], f
(2)预览具体的不规范代码:
; \- A; M$ {. e. R( S. r- _' E 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 1 F# M9 C3 M1 u# G

" L1 \) g9 W. Y1 u 3.4、工具栏功能介绍:
8 N9 G5 G' O& N2 |& b, N4 L 
- ?( V3 ^- ?- g
6 k" r, t+ P3 o* ~0 S2 d+ ? Rerun Inspection:重新运行一次扫描: R. E$ l8 k4 r
Close:关闭真个AJCG面板
1 k8 v0 j0 o. O1 R/ H8 \* t Expand All:展开结果的树状结构,整个结果是树状结构的。
& ~$ p' {" ]! @+ G3 x2 U C Collapse All:收起结果的树状结构7 G6 y1 a( y9 F3 a- L
Go Pre Problem:选择上一个问题
2 P" ]& M* g% ^% q Go Next Problem:选择下一个问题
/ j \9 y) ^: J" t: [ Help:帮助% ]0 D8 C7 x8 \: m: J& s9 [7 M
Group by Serverity:(不知道如何描述)' G! k* a. s: {8 H
Group by derectory:按目录分组/按类名分组间切换
$ O: B6 b/ i; H0 p Filter resoled items:过滤掉已经解决的项% n8 U9 \; h% k* R9 ]7 h
Autoscroll to Source:自动滚动到源码5 }" \' o( N1 H! m1 z
Export:导出,可以导出为XML和HTML两种格式
# t3 ^$ n G# m1 P Edit Settings:编辑设置
( I2 k3 c, m" e5 ?0 f2 g, z7 b6 B* }
二、CheckStyle: 6 e- F9 C+ E0 _
1、整体介绍:
& K# T) [' V2 I |& B/ z" L CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
0 v! E) D1 z9 S$ t Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
; P8 R/ W; R5 d) P 2、安装步骤: + b5 V7 ]2 X. U9 `3 ~9 r
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
4 F0 d; G: a) p+ M- n9 M: X; J 3、使用说明:
) | `# B7 s. t* x  " O& l1 k$ @4 {
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ' ^& T% d- r. z3 C
三、PMD 2 m7 F6 e: l. y/ ~$ j T/ G
1、整体介绍: ' `$ c7 W3 N2 @4 ^( A3 p
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
; ~6 @" J# p6 e! J" h# R
+ @* u0 K+ [* |2 z 潜在的bug:空的try/catch/finally/switch语句' e. g% R+ \5 S0 x; N
未使用的代码(Dead code):未使用的变量、参数、私有方法等6 M5 V) u8 A5 |( _ q4 N
可选的代码:String/StringBuffer的滥用
4 T) I' d/ G. i: {5 E& u" D 复杂的表达式:不必须的if语句、可被while替代的for循环. m2 E2 z4 ]$ ~& }. c" s$ F1 s' Q- f
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs" x" q% E; E; R! ~) }% P' y
循环体创建新对象:尽量不要在循环体内实例化新对象+ K4 o7 j5 s: s2 L+ s. G7 C
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
& W+ N$ x1 G# h$ H } z- j3 {0 h, W7 h+ C, D
2、安装步骤: ! v7 z6 A6 a) B: s1 d
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
) ~ B( C: {: d2 a+ p) L6 M( N J8 J 3、使用说明: 1 E0 ~- U8 q J0 b; v
2 P# L3 u) i/ A2 D+ ?) w 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html9 W( G: A3 v& W, D. r
/ k7 i/ m; o% u6 \& m# [
3.1、运行方式:
1 D& b) n; H* W2 I9 K (1)从Tools菜单中启动:
& j: n$ @ k5 w3 ^( e; {& |3 K( @ 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 ) X& r2 V/ A0 B' g3 G! ^
' S( B" h( R0 C% w- k Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。# T' [! }4 t. q1 h& @
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。1 y$ I: E7 W1 O% s) [. A# P
; a& Y& J3 X7 |2 A- g! i" V (2)从右键菜单中启动: + f' z9 O: F5 M' O( f! B6 ^8 O, _' i8 m
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
" n5 F J+ c7 K/ R* E. E 3.2、运行结果:
; A- y& X5 M. {7 q! `  4 x2 a) A& p; y9 ^. ~! X
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 : d, p7 ]& t" X# z* O( E* b6 W; Y
3.3、配置检测规则:
9 E* A- E% f/ f; ]- u 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: / k, ]" z' J+ I; V5 @" J0 x
 9 \1 V! h7 u2 w; a' z
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 7 Z3 R n z& ?! O$ S2 x; d& B3 e g
点击“Options”选项卡,在其中可以配置一些检测规则选项:
% o9 K* A {$ ]& h. F: C 
M/ W- N% J( @$ K 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
$ ?/ m w& P; M 四、FindBugs: ( `1 |7 a* ]3 M, J7 X+ ]8 w( A
1、整体介绍: 3 Y; d/ e; H1 n" k$ R
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考
, S+ q0 s9 [1 |) b7 j! K 2、安装步骤:
9 Z6 P3 @+ C* [0 _( V P2 T7 X3 ~ 通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 ! Q2 Y3 g* L: G6 u# @8 G* x
3、使用说明: 7 }$ ?) O' v3 j9 ]. }- j# }
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project % t0 y1 @7 q& F
 / z ~0 i4 R8 h/ u- W
分析完之后就会出现结果面板
) d: a4 J8 h ]5 F6 W4 O  @+ n1 `7 A4 w- W0 M
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 6 z6 U6 N9 ~4 ^
# a- [+ H* N) } ]2 N2 `( E
4、附:常见的错误信息
1 x! ]" Q& P1 p8 `" a0 R9 ` 4.1、Bad practice 代码坏习惯:
) [5 z- B8 H5 K/ E( X' K) a$ V7 I, [6 V7 N# q
图片 & C1 A- C8 a( G
4.2、Dodgy code 糟糕的代码:
5 E; L4 T) I, Z* w6 e% \
0 L" u/ V+ ~" r$ z9 @6 _ 4.3、Internationalization 代码国际化相关: + F! r8 [+ n/ |
4.4、Performance 代码性能相关:
$ Z- D6 I# }3 [6 @& s
+ W' C+ x4 z0 N 4.5、Experimental:
: K6 j$ h* b. W/ Y9 G7 S* v+ g) @1 q4 N5 f
4.6、Malicious code vulnerability 恶意破坏代码相关:
4 Z& V" E5 ^; ~$ f4 D( w- e9 v$ k$ Q& T' V9 ]' ]
4.7、Multithreaded correctness 多线程代码正确性相关: , `5 I5 o( X% D1 H/ x# `3 J: i" m9 b
4.8、Correctness 代码正确性相关: 0 U; K1 q0 F! L* C! R1 q) h0 E
1 ]. r! R* d9 z) i) O 五、SonarLint: : H+ C* G" L3 n+ X+ b0 ^2 G
1、整体介绍:
8 S% e) F" d7 i5 o sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 : y f. l. J8 a; i3 X8 T8 ? u8 u
2、安装步骤:
) N. E+ g$ j* G; G( t! g 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 2 C2 H' z, W# G
3、使用说明:
3 j+ b- p5 C0 s( G3 @" U2 m3 |
; x$ {2 p H- \* g- x3 } 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 ) K! w/ r c+ {8 p5 A
# o$ J" I' K9 i7 j 4、配置 SonarLint 服务端: . K4 A0 f+ V2 b9 r- p
4.1、配置 Sonar 服务器:
3 M- H' y: u+ w0 c sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: / s& y3 O0 }" `# c
3 J2 \5 I+ n/ I2 S9 U5 e9 p
点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码 : s" g/ h/ g+ F1 ~+ V' S
8 L+ S, \4 o- y! {7 h) M2 G( U
4.2、具体 Sonar工程配置:
. P# O/ [9 B' f 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
0 ^. q6 e0 Y' p. w8 ~3 r4 r4 |/ H! k3 C: `2 F9 I
4.3、使用 SonarLint 检查: # ]) P3 y( [- N
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 # J8 w( o3 }% I! ?# l" N% T( _
- d, C' m- S8 m8 A
总结 ' ? |7 n" U, L- ^, z" F) `# d
4 w; U! E; v. x3 J9 j# I 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了/ b! U+ D" z8 ?6 m; B) G+ i
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:, \4 U7 f: B# X
PMD 自定义能力强,用来自定义项目BUG规则非常好用
% J: g' X; m6 G1 x& g Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
: S! q* m/ c/ y$ I7 y! Y SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
5 H+ v2 p9 H+ t1 b' k
- u4 ~# a/ p5 W9 \ 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
% j4 c9 L# |5 p5 s, K4 k! k( [) S T
责任编辑: 0 c8 k5 ?* M. z% y( @ g
# W8 h- x z8 j1 ~
; `8 ]5 Y. P. I! s7 e7 P
# B! ?' M6 `, F. {& N7 l2 K7 U* f7 ?3 P" w; ^
|