|
) U1 U9 E0 f0 w- F. F 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! 7 D' r6 L# ^5 c2 u; Z$ ^1 S
/ E+ O: T+ A6 Q; n x" i0 V 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 , L( O6 b9 W- W+ k( i
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
6 [' v8 s9 b7 P5 Z5 k 一、Alibaba Java Coding Guidelines ' M& ?) g% }2 y7 r% M" L" ^5 `
1、整体介绍: 9 b6 L: [" b h2 p" i4 t$ t
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
3 j+ c. v4 ~( a6 a+ D- c 阿里巴巴规约扫描包括:
* r2 N2 W; u* g* N4 ?& _3 J& }6 g4 d P8 z& f' ?
OOP规约
! T1 l+ ]# x/ M9 O) P 并发处理
# k& p; a& E6 N+ B4 S' | 控制语句
4 [4 ?3 K6 m5 _9 K' w, t4 ]8 N 命名规约4 s |5 n5 h- ~) E) y* ]
常量定义
1 _) e3 G! I6 v* A) @6 d" ` 注释规范
8 {2 r: S) w, d' o
, e6 w3 S% e" g1 G2 M: j& V 2、安装步骤: 8 {4 d+ H2 D+ V( U5 p+ {
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 " b# t! R5 n Q7 g1 \
3、使用说明:
6 H+ ?* [; p u" i) I' } 3.1、运行方式: 6 t: i) [3 O4 M0 k/ l
(1)可以Tools > 阿里编码规约 > 编码规约扫描
4 p' _. o; m; C1 [3 F1 q5 ?* ^ 
* A# T; @! g8 |+ d7 J (2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: 1 ~& _; k; n8 x* k2 e

" R' X) ]# N3 q$ {- x# V 3.2、菜单功能:
( \1 b$ E# v" o$ F. }. X- ?9 N
+ `' S @2 ]# E4 }4 y( T 编码规约扫描:开始扫描代码
7 F$ B6 u$ N- Z2 b% h% P7 z/ e 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能* f" W% Z$ c1 R2 l, Q, e
切换语言至英文:中英文切换/ F) w4 M" W0 c6 I
5 S: \$ U" i+ P
3.3、运行结果:
, v6 ?, g; _/ i' G+ E' V 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
+ N8 f' V( U$ M 
8 U/ A' ]: J! W& t2 ^, U 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
$ s d$ M# A* F* Z- d 
9 u* m! j1 ~6 y% ^& h (1)指定区域搜索同一类问题: 1 e. K9 }3 u; {2 A
当点击③处的按钮时,会弹出如下按钮: & o0 O, \* C, v

- H1 [) _& r( c 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
/ }9 p- x7 v, ?. K5 O1 ` 
5 G, P* z V" O7 b H* u3 y$ a. N 这里我们可以看到,显示了整个Project中的所有该类的问题。 ( \1 c& H6 J/ {0 g
(2)预览具体的不规范代码: 9 J1 d7 H8 d) Y6 c2 z3 u3 v
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 . C) {; E$ K: l) z8 ?. c- U, c; V
 . `0 R* d9 t8 M# b0 [4 |
3.4、工具栏功能介绍:
& l( H$ Q( L0 R3 v* p 
$ _) x a# _& L* I
/ {6 S+ ~. ]0 l" m5 ] Rerun Inspection:重新运行一次扫描
& b! V# M7 o }# X! @. d( g Close:关闭真个AJCG面板+ [8 m4 Y0 Q+ @2 k! H! x! k
Expand All:展开结果的树状结构,整个结果是树状结构的。
7 G2 ^- U2 Y; B0 p6 m7 x7 x Collapse All:收起结果的树状结构
6 R" z4 ] Z4 y. J! X% K Go Pre Problem:选择上一个问题
- q* A; F! g9 ~6 [- |. F/ }0 z# L Go Next Problem:选择下一个问题7 p2 T: F" ^& G" S- j8 b4 R; I# W
Help:帮助
4 N2 J. z4 G/ J1 U Group by Serverity:(不知道如何描述)4 o+ N% ?% S! t( z& f7 X# h
Group by derectory:按目录分组/按类名分组间切换
% d& i2 A3 `7 Y Filter resoled items:过滤掉已经解决的项; ^' U) I9 |$ o6 t3 b$ m. v
Autoscroll to Source:自动滚动到源码 k1 s7 @: _( z7 u7 K) b
Export:导出,可以导出为XML和HTML两种格式
) L7 u8 I. C& X! V" h6 O Edit Settings:编辑设置
" f2 i. R; E4 R' \" w0 q
2 L; k9 ~4 |- V$ G2 Y0 Y! A 二、CheckStyle:
" n' J; E Y( V0 h$ f8 F2 w 1、整体介绍:
! b" |' H2 }1 r% e' J/ i CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。 5 F3 J' I( U& j! T8 _
Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 - X0 Y5 V0 U! A* ~0 L* ?
2、安装步骤: & ?4 S5 q% |" K" V/ U% s1 R- q5 ^
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 ; p! e& M5 V- ?7 P, k1 M
3、使用说明: ' G8 _7 l( ^( H! t, L/ |/ }9 A( z
 4 p2 r2 d6 P: l o
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 * M) n; b& J; g
三、PMD " Y/ V) _0 i4 i! o/ f# s, [, y) k
1、整体介绍: $ |- S2 ]7 D) O( g/ B8 _1 \+ Z
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
. } Y( y9 L# t; v2 R# a, M& N5 D+ ]1 g
潜在的bug:空的try/catch/finally/switch语句
' q) `2 `9 ^1 a" a' [% @ 未使用的代码(Dead code):未使用的变量、参数、私有方法等7 H6 e$ S! n. a, q! D4 Y) j
可选的代码:String/StringBuffer的滥用1 c. J; N8 `9 i$ p( P9 Y# C
复杂的表达式:不必须的if语句、可被while替代的for循环
5 w5 X* E$ d! N% X 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
( t4 Z @% D, d3 p4 y1 O1 k 循环体创建新对象:尽量不要在循环体内实例化新对象
, f: ^. r3 E3 W; y4 b 资源关闭:Connect,Result,Statement等使用之后确保关闭掉* i. A6 Z* _' ~" `' C5 H
; Y e9 `5 H# _+ C4 j- Y 2、安装步骤:
% n& x- ^' _; h, w, U" v 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 1 Q P: w" b7 d$ `" ~
3、使用说明: 4 T2 Q5 D+ C, z3 n
4 F4 U! q N1 c& R7 L
参考文章:http://wjhsh.net/andy-songwei-p-11830812.html
$ z) f0 u, N* m" C6 J$ J9 e' J0 \6 z
3.1、运行方式:
; H( u$ Q0 t2 ^& Y* l (1)从Tools菜单中启动: & J( D( J' N! e: R% T4 n+ m
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 * Z8 w7 ^2 Y% L: a
# K3 N9 L0 z G8 Q% p Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
9 d5 n& ?; E. d+ o: l9 }% q Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。5 J% x& ~, ?- z) m5 t! I
6 N+ }# M Y* P4 s$ T
(2)从右键菜单中启动:
7 h% N" h: Z/ }) M% D7 w5 F 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
' R- A. V, J0 Z/ a4 K 3.2、运行结果:
2 U* @! e( F, c/ @5 s9 {8 y 
_& `4 \' n) X8 @7 J 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 4 X# r1 p9 @$ e8 P+ }' X( m% }
3.3、配置检测规则:
, c+ H. S2 N8 p5 N 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: 8 D5 H7 j4 [; T9 W

6 L, E, j3 |- y 在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
$ D" E! P6 P4 F1 Y( H 点击“Options”选项卡,在其中可以配置一些检测规则选项:
0 q, x5 ^( b4 W- O2 l w- d 
# J* F' x; R$ C' d- [4 _6 O 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 9 X8 c+ e- s/ g8 t8 S
四、FindBugs: - e- f1 E. ~+ f% q3 t
1、整体介绍: - ^: ^- n& z% }% u
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 / x( A9 a- E& x* c
2、安装步骤: 3 q$ {0 w2 H$ C9 [1 I1 T6 ^ Q# G; l t
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可
% o/ c' n8 o0 E' ~ 3、使用说明:
# m1 U D3 v1 F( ? FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
! G5 U. j1 C. m: [3 K I 
2 l j9 ^% u4 w6 P% U 分析完之后就会出现结果面板
! N. ^8 R; m( T" G* ~ 
& F7 t' a# f k9 H 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行
, |- i% {7 m C5 @3 P X4 O! K) M
. T+ p: U5 g d( ~# [$ M0 m 4、附:常见的错误信息 $ Y: F1 z$ t& H. ^, T7 F. \
4.1、Bad practice 代码坏习惯:
. j# a* v7 \- D& x3 x' i! d8 U( U; K5 _! L* ?5 |9 G
图片
* Q& J, h( R3 w ? 4.2、Dodgy code 糟糕的代码: " z2 n1 Z& x/ a; w
. Q5 f" z2 L* x2 D& P 4.3、Internationalization 代码国际化相关:
( d. l* c: w+ u8 g) @9 j, y 4.4、Performance 代码性能相关: $ h* ^, F6 f4 f* l0 B
/ B: w* G3 v. i2 m) U; J
4.5、Experimental: ; o2 g: Y0 }0 {! @$ \
* P2 S- p) Q, \$ g7 h0 T. ~4 [* r 4.6、Malicious code vulnerability 恶意破坏代码相关: 7 R; C7 i! Z+ k% T
+ z$ s* K2 @8 A! a7 L 4.7、Multithreaded correctness 多线程代码正确性相关:
) N& \, E6 ]/ z" V: d8 v 4.8、Correctness 代码正确性相关:
5 Y5 T- H5 b; F( {2 O* B4 z+ r3 }' \$ j
五、SonarLint:
4 M' K6 n% ~# a' B) g" p+ g% H 1、整体介绍:
4 N; p/ T+ v- l6 F, L sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
! L5 A8 f% { c 2、安装步骤: % ^$ k! }2 M& n6 q1 z: ~8 L; ?: B# C
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
, x' o& N0 j) B$ g4 }! X 3、使用说明:
. D; }7 b5 |. o8 k% |/ p I
; p }$ O1 }$ I% F: A# @ 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
) T5 ^$ w/ Z3 O8 G. W6 O7 m
; T- j; Z" f+ _, d2 W; j, i, C8 | 4、配置 SonarLint 服务端: " l1 J! Q% ]' [# B# X% S
4.1、配置 Sonar 服务器:
8 B1 c+ X$ Y, n1 d& U1 r4 E sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
& `5 ?* A! w, r, ~' Y
1 U( P9 h S0 d: Q# } 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
/ y5 {& N9 c( c' s# H ~0 h4 `
4.2、具体 Sonar工程配置:
. R, s& Z2 s8 W: ~6 U3 r. M 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: ; ~2 i* u& S% X1 k
9 C; P2 Q% E6 h 4.3、使用 SonarLint 检查:
, x* z5 @+ y' ~0 S" ?2 G6 T 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查
6 M. Z* J& P% ]- Q5 A2 Q+ \' J# B2 w
总结
) j) \7 ~% V3 Z9 ~, t$ v" B6 U, `6 P' f2 h6 y) G. I! T$ Q' D* ^6 G
检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了# u8 a4 w Q; h9 F9 C2 B- A- Z# w
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
% N0 h3 g) L- Z PMD 自定义能力强,用来自定义项目BUG规则非常好用0 [6 |0 p. d5 b# O
Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
0 w" i3 ~+ W" O# Y SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
% X6 { E+ D. F: e3 `( _
) g# K$ _/ O" J& u 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多 5 \1 O7 B$ g' U2 }" q& E; l
# F) P9 d) L c9 a& l8 R
责任编辑: , P! x) {8 l$ ^6 G5 f3 ~8 [$ @
# u% f3 c. a2 ?0 P% @7 O4 D( r2 R4 ^$ ], x- ^
4 J6 {' E; ~+ M+ @
) ~! r& p$ e- O8 {* [ w" { |