|
7 P- W4 Q7 a: V
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
( g6 N( X8 n/ u0 n' r2 A/ U* P! \" D+ S. l: L' ~
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 . R$ u, w; ?$ m
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
9 ?, s6 a/ {6 |; s9 `: V: ~ 一、Alibaba Java Coding Guidelines
1 K- h2 B. @! `% |) {. e 1、整体介绍:
& e. f/ l: }7 D: a, G Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
) K( y5 v( t+ f4 g 阿里巴巴规约扫描包括: ) q7 W7 ^+ ? i: t
1 Y6 {0 `2 a9 b; N' ^" p, T OOP规约9 c8 g9 |4 M6 S' c5 p! l7 A5 Z/ A
并发处理% d% l/ R$ j8 F8 S
控制语句0 B1 {/ {* X) g o) m
命名规约7 Z/ M; l0 M1 B
常量定义% y' i8 U6 J$ v: n
注释规范
- ?' h" Z* b0 U" a
- G) ]% ~1 T, \9 ] 2、安装步骤:
& F1 l9 w5 l( M9 `/ J) j) N( C File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 6 ~# o/ `0 W3 a. Z& ~1 x# w7 t: m
3、使用说明:
9 _( V8 ^8 y) A( z7 p5 Z1 S9 b8 Y 3.1、运行方式:
8 f$ O+ |" j. V% b4 f( r (1)可以Tools > 阿里编码规约 > 编码规约扫描 9 @5 Y9 i" ?$ g/ f T. N q

0 \0 r/ h, B0 S3 Z (2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: 3 D7 f2 C; U! c( Y/ `- w7 y

" S8 o1 F4 i( W% X, L# | 3.2、菜单功能: & }+ h5 z9 _8 [- T" e5 X
$ c5 L0 ^5 t7 E4 V
编码规约扫描:开始扫描代码6 H! e3 q9 C" X: Z
打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
$ H' }5 r: S# U) o9 U7 }. r- ^ 切换语言至英文:中英文切换
, s0 |, u9 V$ G+ s7 M$ y8 n
! m4 d" ~7 ?/ L: I E: o# @/ H* Q, { 3.3、运行结果: ) u0 `" M1 N7 U C) ?7 T
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。 8 }6 t* L+ F4 E, `' A' x! d3 v, e

4 h! W, r! ? r 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): 7 K: f. ]2 A% l1 A8 n0 ^8 W
 8 I, D" t! w& l
(1)指定区域搜索同一类问题: . k3 F2 k( l! k2 _3 e7 T" Z# k
当点击③处的按钮时,会弹出如下按钮: 9 B! g$ _/ ^* a

! o0 T* W V$ ^, _# R2 ?4 H# [ 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
+ M- z# U" u( B) @  " V4 L& r, o- @6 y) |) x. R
这里我们可以看到,显示了整个Project中的所有该类的问题。
! j: D2 g. U6 m: o8 U$ Q (2)预览具体的不规范代码: " d4 Q" U! w6 D! z: d5 F
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 * M4 m4 Z, b+ a, G

5 r8 D. |' w6 w; T" F# Y9 `2 m6 } 3.4、工具栏功能介绍:
9 S" B: e: _# Y- J1 L9 e- r 
0 x; a5 {( l+ z d; V
# |9 V. [5 Z/ v6 u4 v- g Rerun Inspection:重新运行一次扫描
, p' e3 x/ [" D8 F Close:关闭真个AJCG面板
6 u. n9 Y T2 a8 K5 b( m Expand All:展开结果的树状结构,整个结果是树状结构的。2 w* c* q4 Y- D9 b! m' v
Collapse All:收起结果的树状结构
Q! J0 |+ P$ c! {0 [ Go Pre Problem:选择上一个问题
9 B* i# d* [( t2 ~! s Go Next Problem:选择下一个问题
' b* L& A" d" P- ? Help:帮助
& i- y4 _; H, u" n9 ?, ^8 h Group by Serverity:(不知道如何描述)
: G4 A8 J$ h+ o0 [/ T/ [0 | Group by derectory:按目录分组/按类名分组间切换" |% h; @/ r% w) g8 Q# u% T4 \: _
Filter resoled items:过滤掉已经解决的项
3 x3 c n/ ^2 X2 U, `' a: } Autoscroll to Source:自动滚动到源码+ w! |2 h# H( U" o) n; N
Export:导出,可以导出为XML和HTML两种格式
) T0 g. } U* n, Z* F9 K Edit Settings:编辑设置, \" w4 g; b" K1 T& C& x/ c& h: K
& T- r$ S z+ U6 m
二、CheckStyle:
0 A2 B! h7 d0 v3 m$ S. O0 Q; W 1、整体介绍: 2 N& A1 [$ R4 E% c7 a/ Z$ |5 n' X
CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。 : p$ G# Q1 @! c& |$ C' S+ \" N
Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
9 }" [0 C* z Y% I2 w! l 2、安装步骤:
! e9 ?" {+ `' B* F( T 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
4 ?: a' B) U" l/ D% K1 w8 h 3、使用说明:
6 }5 ]( U/ b9 w$ ~& Y 
+ t- B& x9 u& z% A 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 # V' Y$ Q' J6 j- l3 l# N
三、PMD
) e2 K" G8 q' ?- L# `5 C 1、整体介绍:
6 b% F# a) d1 g7 a5 } PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
* W. F+ d G5 z% e1 I0 k# m. R) G8 r+ {4 {8 b/ K
潜在的bug:空的try/catch/finally/switch语句/ q* z# p7 { i0 F b) Z1 d
未使用的代码(Dead code):未使用的变量、参数、私有方法等: j$ V8 `' d6 Y9 j4 i# Y
可选的代码:String/StringBuffer的滥用
- B" z7 \0 g* I; v$ m0 T 复杂的表达式:不必须的if语句、可被while替代的for循环
9 B) p! ?% }( E 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs' |& s* c7 b$ B- M2 |4 m2 {
循环体创建新对象:尽量不要在循环体内实例化新对象/ @5 Y1 n, u, w; J
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
+ y6 h) b* i6 o
! D' G) m5 O* P; P 2、安装步骤:
% e3 V L/ q+ s 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可 0 P' f' z( w; u q6 y, v
3、使用说明:
! h W a$ P' F; o5 d& R: C% J( a1 i' a- v# F
参考文章:http://wjhsh.net/andy-songwei-p-11830812.html0 h: A! y) T+ o; M) E
; V" I% Z5 U, K 3.1、运行方式:
w; v/ M2 t: L$ s- M (1)从Tools菜单中启动: % p6 B$ k) }7 u! {* G
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
- }: e" A- b6 z/ _0 b, e6 W. d# {
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
/ _5 t' D/ M! \. ^! s* o Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。6 E4 [9 c6 g. ^' G) h
; ~4 o1 L0 y. k4 r6 `. N
(2)从右键菜单中启动: ! y- b& ~& X9 p" q0 L
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
- t: B- S [( `6 v6 | 3.2、运行结果:
4 O0 b; P( J. Z; |6 e) P 
- Z. v$ u7 k! @5 R5 C 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 ( W( I$ B$ v3 {1 M+ R4 h+ A( W8 }
3.3、配置检测规则:
4 r) I( K0 p: \% V9 R2 S 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
9 A: z# d4 n1 o$ W F% x* c; m 
4 y O* X! t S$ W: K+ O3 D2 j) P) t 在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
! c6 A5 C) P8 O3 J* `7 O* p0 N 点击“Options”选项卡,在其中可以配置一些检测规则选项: " G b/ d* h' F; j- J( E* H" g
 * T# ?& D/ Z z$ L2 t4 C
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
# C7 ~* Z; z, T u! D: M+ T O1 p 四、FindBugs:
" ~( u% p5 `: c" C3 K2 i 1、整体介绍:
; ~7 C7 D6 d8 h2 _. \1 ]' W FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 2 W ~ _$ E6 X5 e! q: W2 J. r
2、安装步骤:
* g! O8 V0 { a 通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 7 ?; f: a U- U, }( s; M3 d
3、使用说明:
. W- G% N7 j# G* S FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project
& p5 \! I1 R# `0 e 
: [8 |/ A4 N5 D. g) c: S N 分析完之后就会出现结果面板 , L7 t+ m r; F2 c' O& Q; c
 0 S# F- a# o7 S1 I9 x0 F/ H; g8 }4 @
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 8 ~6 Z, I/ @* v* F& X* V
" l* X9 a, y, ?8 \6 \3 ~
4、附:常见的错误信息
3 ?2 d% |+ s: v5 ^ 4.1、Bad practice 代码坏习惯: * o2 U; n+ \" y$ x7 R) I% V
( y/ z6 E* `6 G( t* V; w 图片 9 B2 j6 ^$ o7 [) A/ ^- E5 r
4.2、Dodgy code 糟糕的代码:
* Q' X+ y! H4 j+ O7 H! t; c- B- [7 m1 R! _2 o& l# k6 x5 L
4.3、Internationalization 代码国际化相关: ! i+ `' Q- Y6 T& ~6 K) z9 |, [
4.4、Performance 代码性能相关: * q2 H7 T& Z. J3 V- E) j: h
! I7 X- s) ~# q 4.5、Experimental: 6 o% q* a) n6 W; i" a
1 o3 X" Y) M) ~5 d4 m6 h+ I, | 4.6、Malicious code vulnerability 恶意破坏代码相关:
$ \% P; G3 p- R7 {; Y
# N. O3 C% X2 c, b' }. u l& Q6 n 4.7、Multithreaded correctness 多线程代码正确性相关:
) k5 o m9 v9 f- r2 [: V8 f 4.8、Correctness 代码正确性相关: $ m% ?6 J4 R5 y, P- S
! _8 P( D* ~* D7 a% N' G/ Y
五、SonarLint:
/ S/ N% s- S L" t) D6 q 1、整体介绍: 8 F& R) J. s- C! {
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 - m! D, z$ h7 y
2、安装步骤: + m/ o* m/ @5 |% ]. F
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 4 M! t5 g* s7 E: I7 m/ m8 P
3、使用说明: ; j# h f4 o* H7 }6 p' J% `
6 O# K, l0 w/ S" x( u$ _; J 右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 . ^1 o" d4 B9 R! g# t
- T0 n K! ]0 U% L9 Z* t
4、配置 SonarLint 服务端: 8 P! z& U) w! R% B2 R0 P
4.1、配置 Sonar 服务器:
' U6 j% C' e) p! D sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
/ l4 j5 m* U# y; F: T# m
& y' q2 ~8 ^8 G+ {. N 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码 ; z2 M5 x9 h* Q
$ {4 c F. o% t) q! Y9 n
4.2、具体 Sonar工程配置:
" e1 B3 A, L: D c7 f- i' }; j 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
! ?% ]" K1 ]8 c" l; l, n3 g- C4 h1 T2 G8 n! q3 @, F
4.3、使用 SonarLint 检查:
* d: R. v9 c, V8 \5 _ 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 " q3 U, q+ n* W" z0 L& d
. O. P( B. ?8 @! R 总结
; s q7 p9 H9 Y7 `7 [* n& f# {$ _7 {/ f1 h) Y
检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
' K9 ?( g- t, S0 a8 F) }) m! S8 I! n% y 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:4 y' A; W0 ~$ o/ L g0 K |. N
PMD 自定义能力强,用来自定义项目BUG规则非常好用
2 t8 C+ j, f4 w8 ^0 A x Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。: d" j- s6 i7 @5 m; x: G" O. z" R' C
SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
/ w' E. d8 b8 m
) i) w! H* F6 q9 b 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多 . b( {3 a0 ~" Y( |: K7 v
|" I& D2 R; |
责任编辑: 9 o+ s' Z9 B2 D1 y
, m) U2 _7 i% g8 R
* q! X- ^2 E; N! B( q
: i! Z0 R* y$ M+ e: ` [/ k5 T0 {4 ?
|