|
& @7 Q8 ?$ Z' v2 l' b; H 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器!
! D. T+ Z8 X; H9 A& s
+ n2 H7 m7 \. M& d, f- k! {( ~# z* D 随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 , d( z, F3 W5 o0 x% a2 p
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 " g v' h( [9 n$ }/ n
一、Alibaba Java Coding Guidelines
h3 Q. a8 `2 _3 t' Y8 X) b+ ?0 \ 1、整体介绍:
' f. a5 n2 i6 V! r. ]$ X' {1 M Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 ' m) T# ~1 w, i
阿里巴巴规约扫描包括:
- x P, T8 p, w% {4 h3 r
0 J1 O9 c5 d( Q& `: L/ N0 t OOP规约; v; ?$ ~* }7 s k
并发处理
* r$ @8 F& B0 ]6 E1 ` 控制语句/ j3 g. L/ h3 E! J7 f' w
命名规约
/ W/ h- L, c1 ?- _9 O# }4 { 常量定义1 W4 K$ `2 w& c) K/ D5 i" f$ @
注释规范
: @2 H8 l! g+ @3 _+ c" B
( k7 H1 d+ L6 g4 { 2、安装步骤:
$ U" r5 z# _% s. W s File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
1 v( {* ^( L; d* i5 d5 N. t4 g% G 3、使用说明:
! z: u: X& z a 3.1、运行方式:
- W! u: `$ ^1 z$ ] (1)可以Tools > 阿里编码规约 > 编码规约扫描 9 `( d1 [/ S. n, ]

. l" [1 d0 C h: K (2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: + D8 \# |4 q; Q d' b

; H: T5 i/ U9 n: `& E2 Z 3.2、菜单功能:
\1 T3 r! T- Z. t, T/ _9 B' ~3 ?' N0 N3 ^7 ]: p/ L* W2 a( K, l
编码规约扫描:开始扫描代码
3 x/ L9 F+ z% E: {8 I+ N: d6 p' o 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
3 u3 m9 {! ]* b# }& k( l 切换语言至英文:中英文切换+ K6 y' b! W; M' R0 w
5 J; b6 I4 s! M
3.3、运行结果:
/ O( M2 C8 @& }$ m- H C4 D+ ^ 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。 $ ^, b0 T+ d- w
 3 x2 t. m2 t# H6 J
选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到): 9 R6 l) N" C$ R3 e' ]4 `

6 Z R% B2 D6 h4 M: U$ p3 U (1)指定区域搜索同一类问题: 9 S8 }, ]/ [. h: V9 i
当点击③处的按钮时,会弹出如下按钮:
- ^; w) M, }: ], Q0 Y4 N 
6 Y, w" l* J! r E+ d 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
+ W% ?% y3 B5 w, Y 
# @; R7 f, @' `7 e' c( {# J 这里我们可以看到,显示了整个Project中的所有该类的问题。
4 p, R$ ]/ T f: f- U5 v- a (2)预览具体的不规范代码: , k$ u% _. b. r: c7 V* K( Q& }
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
$ A; W% o- J: \& j) b# u 
! O+ B8 ^3 d* Q: h" h0 k2 | 3.4、工具栏功能介绍: 4 N- J: ~% x+ [
 * g$ H" w! ]: @; T; U! Y9 ^
7 U2 @" i. d& w/ x Rerun Inspection:重新运行一次扫描
. F7 Q( {. F2 |$ {' `' N) O Close:关闭真个AJCG面板* p; k9 K x3 C
Expand All:展开结果的树状结构,整个结果是树状结构的。3 J4 r' f4 ~( ?& h6 r5 n
Collapse All:收起结果的树状结构; P# z, V/ ^" M. X2 p) H' D9 |
Go Pre Problem:选择上一个问题# n* C- y) h' L4 V' N- j; O, J; P
Go Next Problem:选择下一个问题+ G+ M/ e! G- r
Help:帮助: D; E. ]2 O% t/ h' m- q+ t
Group by Serverity:(不知道如何描述) Y6 A9 z) k- F' V" O; G4 {) d; l
Group by derectory:按目录分组/按类名分组间切换% `" z# t) l- r: s1 f$ R
Filter resoled items:过滤掉已经解决的项. Q" W, Y0 \" M8 g- Z; E
Autoscroll to Source:自动滚动到源码1 U1 `* ~3 T2 V, ]% T1 |2 x
Export:导出,可以导出为XML和HTML两种格式, o( ?& e, ?, A9 q
Edit Settings:编辑设置
# J2 z( L# s9 _. x5 J: W) ?+ k- x6 }, X M
二、CheckStyle:
1 k9 {. N# B# t 1、整体介绍:
# h" k6 s% ~' Q* v% L CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
( K( v6 o# M1 o1 ~) E, P Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 5 o8 d! n& p4 b7 H2 S" J: k
2、安装步骤:
0 H$ }! ^( a f/ `% v" M 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。
/ q$ X3 H/ Y: ~! I6 ^. }" s5 H 3、使用说明:
+ c1 u- M; ]' d6 E _! a+ ] 
2 F2 D0 H1 E1 v- v5 M 可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ! ~; W M2 t& Y j4 Z
三、PMD ) A; k Q" ^$ ^% g: U) l* Y4 \
1、整体介绍: ' J* b1 P; B) _6 N$ Y/ c2 y4 q/ I
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: 0 S4 b0 y. b/ x9 I! }1 \7 ]
/ r! N. ]3 t6 O$ U$ \" u 潜在的bug:空的try/catch/finally/switch语句
: @( Z9 A% J4 e5 v `% D f 未使用的代码(Dead code):未使用的变量、参数、私有方法等
3 v- }! K6 k8 Q* S H% k 可选的代码:String/StringBuffer的滥用
7 q0 x# o* E. U& C* x2 W! ~ 复杂的表达式:不必须的if语句、可被while替代的for循环
' i6 h* i& m/ k' T7 } 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs4 g2 x, }. l# p6 A& z) h' I) y
循环体创建新对象:尽量不要在循环体内实例化新对象
" {3 @7 P/ T u% t, G* v; T% t 资源关闭:Connect,Result,Statement等使用之后确保关闭掉! {+ O: b% a* Y; E% G: c% w1 \
' E* U) } ?( c6 ?. f+ u( E 2、安装步骤:
5 `, K6 r' h7 Y+ t6 ], z 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
) k1 Y4 y! L+ \6 U 3、使用说明:
' X! a! D# ] b% y. g5 L) ^- B9 A. M- J* I0 t
参考文章:http://wjhsh.net/andy-songwei-p-11830812.html$ O4 H! E" i. f8 O) `+ A$ n
$ w7 w5 @4 I3 l
3.1、运行方式:
3 ~6 d$ z3 W7 b- Y (1)从Tools菜单中启动: ; j9 D) Z) |7 p; @! f2 v. U
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 * _8 B9 k5 o, W4 w8 u& L# C: }
6 S' N3 }% s7 N2 L7 Q2 ^7 K Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。. P \; f) X1 w" Z' O; R& y
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。9 ?# P6 ]* Y/ ^0 h5 d S
' I+ h X( {/ `$ M q: y+ p% c( m (2)从右键菜单中启动: 4 K1 j$ t& V% r
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
* t4 M. f! D& K% [, T, o. x 3.2、运行结果:
( G" J* P& f; r" H, c/ a. W- t8 Y3 V 
7 I" A1 H+ T' M1 a, I5 ]* ~ 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 8 d/ L4 m0 D) ^- N+ b4 o! _
3.3、配置检测规则: " o) g, I$ ^; t8 ^1 x/ m* _
通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: 6 f+ p/ x) W: P. M1 j
 , C& j3 d3 {! R; u* ~! |
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 1 E- r) }# ~" e4 ~
点击“Options”选项卡,在其中可以配置一些检测规则选项:
0 \$ c. v: l1 V  # A4 k5 I4 x5 V' {
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 ( x, `! o3 s' G: X% {3 V# L
四、FindBugs: . ~2 U, y! ~- H; R# L
1、整体介绍:
: T1 o& V* f! O- J# R FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考
+ G# h1 n9 ]4 V. z2 z 2、安装步骤:
% s$ }1 q* f% L) X, S# d 通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 & B7 T( [; B2 \- I7 Q8 x& {& A! ]3 C
3、使用说明: / A d; A$ ~! }3 f8 e
FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project - l! t) l; B; k! w( @
 9 C7 S9 `0 e+ U8 ^2 C9 F" c" j& r
分析完之后就会出现结果面板
( ?' i( ~+ d! t, l+ J1 v& h 
2 e# B' i0 q m. t, {* g" V 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 " k) ~3 [: G, \% k2 N
7 `9 m- I( p1 j) ]3 k 4、附:常见的错误信息 ' w# C$ `& x! A* p* X, u( }0 d
4.1、Bad practice 代码坏习惯:
" J% k: E$ w, P m* V7 x, F' `( l
图片 $ I* F0 W) u0 y b
4.2、Dodgy code 糟糕的代码: ' b) ~: Y% a7 L* x X8 w
2 v6 l* V5 b$ R
4.3、Internationalization 代码国际化相关:
; n& G+ m% U+ B/ v: o u' s G$ ^ 4.4、Performance 代码性能相关: 5 y. h1 k" U9 V
; G Q1 U9 y) [9 S+ B
4.5、Experimental:
0 i$ V' p& G4 W5 c% u' m! R3 ?( j9 W( d7 o: Y$ x- s8 ]
4.6、Malicious code vulnerability 恶意破坏代码相关:
8 T* H) \4 o9 P; U) W5 f& @' [* O
4.7、Multithreaded correctness 多线程代码正确性相关: ( c# v& D3 @* C
4.8、Correctness 代码正确性相关:
: E o9 y" k# I- L! v- E
2 H. K1 E6 T7 Q* x- E0 u4 W! @ 五、SonarLint: Q/ S0 O+ v) X( N, [. g) _. ^
1、整体介绍:
/ d! `- q4 z& T sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
( ~- B4 D) E- [5 V 2、安装步骤:
( t5 } i! ^2 B1 Q3 @ 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 : e+ t( [4 E5 E. |0 O
3、使用说明: 8 ^- r* ^; i% p0 e' J! I) L
* d- N0 u, Q/ A, u
右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 # `" [ d# b# ~" R6 r. K
4 Z/ Y; L% _. I9 S- d+ J/ v+ \
4、配置 SonarLint 服务端:
! d/ `0 u5 O! D 4.1、配置 Sonar 服务器: ) O% t3 g6 j( P
sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: 1 `# M* P8 P; y% P8 s3 q7 B
: b6 R/ C/ o; \. K4 z8 @ 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码 2 z5 U7 @9 T" m5 w
' U7 R1 Y$ j" E4 i, E# x
4.2、具体 Sonar工程配置:
' a" z4 _/ J/ }6 k1 X- b 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程: 0 m% H* v7 l# m, o+ s8 {
n* _ B! S' G
4.3、使用 SonarLint 检查:
5 x0 J" w1 K% N/ E" a# B 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 " e. l7 ^- |9 q
5 N4 a9 d/ P4 r 总结
) v, s& t; V( N
9 |' \+ \ s: W# m: ~* A 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了# ]! k3 }( n, q5 D
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
9 u$ q$ g% p+ @' D. S- w" _# ~ PMD 自定义能力强,用来自定义项目BUG规则非常好用
( y6 q* u5 z' j R: N- \3 N, S- r Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
. `( Y& X+ ? G2 W, q5 m SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
( Q) f: H; s, a" O& P4 f; Z( \, R% ]+ r0 J, ^! Y5 N/ z" b5 Z
文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
6 K. ~5 ]# n; D- ?4 j! e! _/ x2 ?: |9 U$ q
责任编辑:
4 C) L) S! } e* S' `7 d' f/ W; x: C7 {+ X# t9 L0 ~1 o4 x8 f" `
/ F7 f2 e" k8 `) ]$ T. G* h
1 t! ^% M+ a+ y) ]; K7 ]: L! I, M0 v9 L
|