|
! B3 e! W# `7 ^+ G. U
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! + Q4 s) G- H; |; b( S" X. @7 ?/ z5 ]
' @% p# h z# k( V/ p4 n' q
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 ! m1 \6 E. B6 a8 D8 W6 n. N
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
- g0 m8 t! }0 ?, G* A* W" O$ Y! L 一、Alibaba Java Coding Guidelines ) L v6 }( t1 _4 r; ^! e. N; w: c
1、整体介绍: ! ], F6 p; ~# v" z/ N
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
/ }- g& g; e0 B& W& Z. C 阿里巴巴规约扫描包括: " ^( E3 T" R: ^
8 J4 l u' G& X$ u* S9 D% s OOP规约
' P* X0 W# j, B7 i5 q0 @# [ 并发处理
: h! a# C& j$ D! j/ r 控制语句% _) {. \& E6 `$ ^
命名规约
/ ^& K; O$ L# R9 k9 r0 G4 F' o6 u 常量定义
, J# {2 P6 i( F) n- G 注释规范
8 L: i5 b, f$ o9 Z
* J8 e" d! m3 e" ^1 u4 J 2、安装步骤:
$ b3 L+ ~! t! U( f File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
1 D! z* ~" x5 s1 x) e/ ^; d( h/ g 3、使用说明:
" Y( B3 z- B; ^ 3.1、运行方式:
$ B* C9 ~3 S; z+ H8 Y (1)可以Tools > 阿里编码规约 > 编码规约扫描 \& I" S) W( \% L0 t9 M$ @0 x
 ! z% v( {3 T! e
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
. N0 |) a% l' W# U7 |1 z5 O 
. s% y; [' o. t8 {+ r3 T 3.2、菜单功能:
4 |5 L3 Q, T# q. B
, l+ r& j9 N# Z/ d3 \ 编码规约扫描:开始扫描代码) F/ D! ~" k: ~
打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
+ E. T! I" V4 R8 W 切换语言至英文:中英文切换2 Y0 i1 Y; @# {
" A( L$ o7 K) ~ k, Y! s+ s3 M, o 3.3、运行结果: $ ~7 y2 w5 j$ H u3 E T3 r2 F
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
, e* c1 A" i6 |8 e' M! I) n0 n3 h 
# n' y# M- M+ B) C; ~. P$ p 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): " J& x1 K- M; Y

4 A, x* k3 y+ @* `% l1 h- Z (1)指定区域搜索同一类问题:
% z9 i/ c) }& a/ @( I) b 当点击③处的按钮时,会弹出如下按钮: 8 |. I% B! }3 w" N- B3 d
 5 h: U" n+ x2 F1 l
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示: & Z7 q3 D' [1 m7 w
 # e: Z, u) a6 V( J6 u! Z
这里我们可以看到,显示了整个Project中的所有该类的问题。
8 [6 r% k/ ]1 {9 t: |- ?) _ (2)预览具体的不规范代码: 5 a, ] [1 G, U9 V8 g" X l
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
, }. a; \, J" E 
& \7 y: c+ p m1 a) `) r* P 3.4、工具栏功能介绍:
8 `' F% O5 j& D. d& \7 B' A  ' o5 F: W+ T, u; S% N. v+ m( S ?2 h
- z8 O) {0 @6 r+ F/ R' d* I
Rerun Inspection:重新运行一次扫描9 Z) } Z7 U9 P2 N% h/ `
Close:关闭真个AJCG面板
9 X! t g1 \' E& S Expand All:展开结果的树状结构,整个结果是树状结构的。* k( W) Z' @% r) s
Collapse All:收起结果的树状结构
& ^% Y( P! |7 q- j6 O& t Go Pre Problem:选择上一个问题$ t1 \4 t5 b# q% M- [4 b' G
Go Next Problem:选择下一个问题 i- E, J; `3 R$ G9 c
Help:帮助
, p. s! L3 K4 A9 F5 _9 E Group by Serverity:(不知道如何描述)* {. B" F g4 v6 K" q" D0 A5 ]& O
Group by derectory:按目录分组/按类名分组间切换2 K8 C4 z+ S; h. ^
Filter resoled items:过滤掉已经解决的项$ Z& D8 j) d* b1 n/ V+ T5 Q8 G
Autoscroll to Source:自动滚动到源码
$ M; P* E6 l- \+ N0 H Export:导出,可以导出为XML和HTML两种格式1 E' N- E% v3 M' O' W0 O
Edit Settings:编辑设置; u0 g/ T1 o3 S9 L
- G- K- c& R& I3 O9 K. H+ p 二、CheckStyle:
% R, M g% K* i% b 1、整体介绍:
7 N+ z" m9 r" B- d( C( N0 b CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
- X5 P; X m/ P0 y Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 ) C# J& p8 k) O: K
2、安装步骤:
; T, i7 s7 ~9 H0 A 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
7 Z: \. B" a% d; R8 { 3、使用说明: 6 h9 Z; b9 |, R/ W: f8 @" C4 ^
 {3 ]6 p* r) j, S4 @4 w+ u
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ) ~/ x, O( _" c$ ?% y1 u
三、PMD
: O% t+ I9 M: _ 1、整体介绍: ( g" E2 K9 ^. Y
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
# G' @( l1 }8 ]
+ Z* i# e C' M# u' E; C2 U 潜在的bug:空的try/catch/finally/switch语句# p% x. I" }$ X
未使用的代码(Dead code):未使用的变量、参数、私有方法等$ n& [* H2 ~, E# B6 i J$ Q
可选的代码:String/StringBuffer的滥用$ c: V3 _2 U+ i7 C
复杂的表达式:不必须的if语句、可被while替代的for循环- G1 r6 W7 W5 K$ w; I
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
+ L8 E% F; y* u! v: a 循环体创建新对象:尽量不要在循环体内实例化新对象; |! C- Q0 w# ]5 S
资源关闭:Connect,Result,Statement等使用之后确保关闭掉$ g% ?$ o; D% N) u8 Z7 R. o: _. t
1 c8 ?$ l6 [- _: F 2、安装步骤: 5 X, F9 k! v$ I' X6 h0 z2 j$ A
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 0 l9 ]* Q4 L$ r( C2 i
3、使用说明:
% ]$ f- y5 H* [$ k2 G# V8 L
9 L# I' n, Q s4 h l$ W1 A3 L8 { 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html" R# j7 _ [, Y
5 b g, h4 M& f/ ^ 3.1、运行方式: ` F9 U5 i4 m9 V) V/ [, F
(1)从Tools菜单中启动:
% q# f) y/ c% O: g1 c9 c. T1 ` 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
4 I6 u6 t: |6 G+ P- D4 u G6 ]+ _
: D* @& R* I) F `7 c8 _ Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
) w9 V# ~* d# x2 b; b0 l1 Z, [ Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
% y+ H% R+ H( H3 I C' @% ?
$ y/ J1 ]% @5 T/ O* u- }# D (2)从右键菜单中启动: 7 K& Q; r* G7 e8 q
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 * B) M# R8 {2 z- q& w
3.2、运行结果:
! i& U4 A& W9 }: b; z 
f) r. a5 C0 \ S 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
+ Y8 G8 h3 w- m: N# S 3.3、配置检测规则:
5 e) G* ~/ S4 W: J V, v 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
8 ]2 t8 I; k8 \. j8 b# l  9 |) V9 d/ i) R( {9 s0 a. T
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 ! u# q& h A/ r. A
点击“Options”选项卡,在其中可以配置一些检测规则选项:
2 g% e- F/ g# b9 K/ T) E( \ 
% r- j1 ?' `; [2 B# U5 i 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
; ~) }9 C* E: z a( _9 W3 f4 _% p 四、FindBugs: 8 q1 `3 M5 M2 I4 o$ `8 U
1、整体介绍:
2 G+ j1 y% B" X: Q1 K, V; R1 G' z e FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 * |0 L- F$ k( \" Y5 ]
2、安装步骤: / [; G, D. p& x6 y* S
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 8 [6 t% K8 i/ H( {7 I# d
3、使用说明: " [8 { m7 n2 r; s, A; N6 V
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
/ [+ s# t7 V# m/ }2 |  1 C! ^5 C' J1 z6 K5 L Z* d
分析完之后就会出现结果面板 ; ^6 Q% f& |" n( |3 _* n; i6 e2 A

. S" l- T. _5 n: } 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 h! x2 Y& \% j8 z# a
3 i2 L' Y( `( i5 D* v( m3 x# h 4、附:常见的错误信息
! k8 I0 r {% u4 j4 d. ~* k 4.1、Bad practice 代码坏习惯: . s0 `! F5 l# v2 h) D" Q, W
7 f! p( [/ J) @( [& S 图片
0 l5 L# U* d, G; \ 4.2、Dodgy code 糟糕的代码:
' J$ \! M( h: c3 c$ S7 n/ C( V) {8 q$ ]5 }
4.3、Internationalization 代码国际化相关: ; W" J- r8 \) U& t. a. L- a% f, C& M
4.4、Performance 代码性能相关:
4 e% y5 Z, k) U+ C; o9 q! V0 g2 t1 G: o0 i3 q6 q
4.5、Experimental:
: y# y$ {' w @1 q* X+ M5 t. g4 D$ R6 J$ O: b
4.6、Malicious code vulnerability 恶意破坏代码相关:
0 @$ _( m3 x8 J w3 ]% ]- N! ?) n4 K4 }
4.7、Multithreaded correctness 多线程代码正确性相关:
( L3 I1 z& N- q I( Q 4.8、Correctness 代码正确性相关: / Q7 p7 y* z+ {" |
# M" w0 n4 s+ ^
五、SonarLint:
, d9 `& J4 P) D 1、整体介绍: ' l; a" m, I% j) ~4 d
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
7 }9 x0 l4 k; X0 ^# f7 f 2、安装步骤:
. |. l3 W. _& _- K 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
5 e8 y- t: N6 Q4 I" B1 ?# s 3、使用说明: ' ]3 l d. g: Z% g( b8 J8 s, {
; E5 ?. x1 v- c2 N+ V 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
+ t4 t" u g& U# I: S+ ?% n- L: H Y
4、配置 SonarLint 服务端:
. x% Y9 {# A6 c0 g) E1 J 4.1、配置 Sonar 服务器:
: m0 m! _0 q) W$ i$ F, i sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: * p) @5 A1 F' C9 L) m: k/ n
* c. a' M2 T3 L% t. y) H+ R 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
5 U9 p! S* E1 C, A# q$ w" f) f
# L% M- U4 @* I1 x# |2 b# G 4.2、具体 Sonar工程配置:
( Z" H- m$ w7 t/ P5 z- A$ m' d) y 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
4 k$ N, Y6 Z7 l2 J4 B8 C: i. r, o' M" K7 j; C; e
4.3、使用 SonarLint 检查: 0 ?, g! s2 ]8 w4 d
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查
5 j" c6 c: n4 p1 \
5 V5 q1 v# c5 n" J0 s+ r* E1 u 总结 7 S0 o) ^( f. Z; V& Z4 p
- i& a, x6 Q9 N 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
2 G) w! `. E& }$ e 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
8 w$ O% c0 [ ^6 U! \8 W" l PMD 自定义能力强,用来自定义项目BUG规则非常好用
9 L6 g) ?* ~% \' A Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。; A0 X; c8 C6 l0 \! |
SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
( s5 z; i& o% w9 \$ b# p9 q
# @6 X2 m1 l+ I ]: c% E 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
: R. H% I4 v! j; u$ `3 I7 A0 E: Q+ D0 v- M; [
责任编辑:
# i$ C- o7 S- N* Y% z
6 u- w+ e; I# f6 B6 n! @* j( r( B8 g% ?
+ ^" L5 s# l. M- B- {" x
) R2 D' d G7 {4 k& G1 Z6 u6 ?; B) e! G; `" M1 {1 e
|