- \* i- |" T5 f6 Q 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! ! T' |! Y6 A2 ]+ I
; Q$ D2 [3 A5 N! }2 U
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 4 l' h p1 p& r* R- o+ o$ H
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 # F1 y, t8 e9 t+ Z# }) B
一、Alibaba Java Coding Guidelines
0 B5 V% x% l: m# k% Y% F 1、整体介绍:
) T# I1 `3 g l$ F% ?7 ]; H Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
3 Z; Z4 ]: Z4 D% G4 j 阿里巴巴规约扫描包括: 4 E: \6 [% _5 x ^$ \! ^+ [0 C
4 H' P# c5 Z; I2 `
OOP规约
% m6 @. A5 ]7 B. M 并发处理
+ ]) y* ?0 [+ `: J4 H 控制语句* n/ R" q" _$ K# K1 N4 V& _& S
命名规约3 l! b! b }5 k
常量定义* I, J/ B" S" G
注释规范
' b3 b8 z* i: B- O# I
4 [ d$ D) V9 y# Z% ^ 2、安装步骤: ) r( F. X' X3 C
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。
1 B! [, a- w% T 3、使用说明: ; d$ S; f0 D9 X- D
3.1、运行方式: 6 g; z; u! ~/ O# p
(1)可以Tools > 阿里编码规约 > 编码规约扫描
. s( r/ ?* e; j! P $ M% X0 j+ Z. r( e6 [
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
$ j3 W8 L7 x' G8 F4 R
. i4 O- y N, y: Y' [ 3.2、菜单功能: 1 o9 F& u$ Z D f0 |' M9 L
3 X8 y) ~' Q! T( A% ] 编码规约扫描:开始扫描代码1 J" L2 L' P/ B' T6 V# C
打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
. K5 {! M G- V' S 切换语言至英文:中英文切换
9 a9 a0 E8 c$ \! c) y5 A: u
' R1 G1 [6 p. p- a: X$ ~ 3.3、运行结果:
% w* g5 O# j6 l: }3 V" L 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
8 p" c$ U3 ?0 r% D . T4 t& Q/ w' y! V6 E
选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
+ W; }, p6 h3 N, |0 g ) f% _! ^; r$ v6 ~) `, ?& p' E: s
(1)指定区域搜索同一类问题:
: i& o3 H* R5 p1 B8 d 当点击③处的按钮时,会弹出如下按钮: . I5 `) Z& | g% O
7 T5 U7 w0 A& z9 ?1 ?/ D" \* n
这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示: 5 h3 }% P! ~6 F3 m3 ?- U: o
% T0 b& T; `# u4 a. d 这里我们可以看到,显示了整个Project中的所有该类的问题。
' q( N y6 ?% m3 e* ? (2)预览具体的不规范代码:
* S! R/ Q. V% ^ 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。
7 |& v' w6 U" x6 Z% p 7 V6 y# A0 T- P& O. v
3.4、工具栏功能介绍:
3 e2 `* b% U% w2 r ) R+ v B: O5 q" `. r5 I/ e( M
; T) z# I5 i/ d5 x5 |" a
Rerun Inspection:重新运行一次扫描
. @9 s [+ a" c. H Close:关闭真个AJCG面板% H* C+ h! v2 _. G; B. h7 j3 j. S
Expand All:展开结果的树状结构,整个结果是树状结构的。# I& S; N+ x8 g& [/ j8 q: h
Collapse All:收起结果的树状结构
% N* H$ r7 D+ H5 c6 [# c Go Pre Problem:选择上一个问题
6 D! _& f/ P6 |% \ r5 ?2 C Go Next Problem:选择下一个问题
) D3 I% `/ s) e7 S0 u. E Help:帮助$ v% w5 f; _) Z) k
Group by Serverity:(不知道如何描述)
R1 j- {' r5 h* b0 B Group by derectory:按目录分组/按类名分组间切换
9 J& [1 q7 w4 N/ H Filter resoled items:过滤掉已经解决的项
. w; Q$ m' @" U, @+ f Autoscroll to Source:自动滚动到源码2 q8 i' J9 `4 f3 k/ _+ v3 a
Export:导出,可以导出为XML和HTML两种格式
2 _" j. f- l+ A o6 M( G9 _) v Edit Settings:编辑设置
/ l! Q& V* D& G+ g3 V0 `+ B/ T# _4 S5 p" T+ ?" U3 S% j
二、CheckStyle: 8 V2 y8 q* J4 g& i0 B) y& K
1、整体介绍:
6 K8 _& n5 t6 U0 i9 O7 C9 i: @ CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。 # |& d3 {& G" N) K
Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。 ) k& a! R4 K0 x
2、安装步骤: : @* Y2 d- I. u) p8 C
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 1 N- Q2 q) q( _; c" F5 D
3、使用说明: . f4 q0 q5 P4 I$ l' Q! [5 Z
G/ J1 x/ e Z( c' g) P& |* f
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ; e* B. X& k& q" u
三、PMD * P3 f5 p1 `( H; W+ n! |6 g: I
1、整体介绍: " U. p( o# e/ r
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: 3 W8 c+ z9 J% B9 }! F; U
0 R% l3 Q, q. u& B 潜在的bug:空的try/catch/finally/switch语句2 p+ }- n: m6 \+ I
未使用的代码(Dead code):未使用的变量、参数、私有方法等; y* x+ d, b# V' O1 P6 s+ a
可选的代码:String/StringBuffer的滥用
. F4 \4 ^. O0 h, w. o4 Z 复杂的表达式:不必须的if语句、可被while替代的for循环
* E" e8 p6 _# v 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
# |8 L p+ c Q# B& I; B 循环体创建新对象:尽量不要在循环体内实例化新对象
. f/ ^" }5 R0 o. `! l* g5 e2 w6 \% c 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
8 O* Z: `5 V' X5 ]" C% Q2 e% c1 Q i" C
2、安装步骤:
$ g# w5 \) J9 b4 Y4 i' B4 j+ m 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
* [( S; _0 H0 d- g @ 3、使用说明:
9 b& H( @5 s1 B: F& D4 {/ k0 L7 @$ g9 r
参考文章:http://wjhsh.net/andy-songwei-p-11830812.html
+ n2 P# }0 k# O9 S, F l
+ A7 P, _. T# q0 a6 U 3.1、运行方式:
* ^! }. T4 z0 A, f- Z- Z( I (1)从Tools菜单中启动: / [! l5 _" ~6 S* Z- v, y: J8 v9 R
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 ; B8 q& l! m/ T5 R) b l
7 S0 b P$ r. A3 D+ M3 s6 Y
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
& X* n$ b9 _+ `% ?/ X2 g; f4 W Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
2 [3 P$ v0 \! Z; e% [/ m) f# X
3 b( ]9 [1 n/ V) G( E0 | (2)从右键菜单中启动: 1 _ D' m M: _& W
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。
, E3 p& c1 f9 l7 u, O _9 g 3.2、运行结果: 4 Z2 ?) x- ?4 x: B9 n7 f: j: x
. t8 _$ ^& k5 |4 K7 F 运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
- }1 t) a. e2 H 3.3、配置检测规则:
- h3 _2 Q- `! z% W( k 通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
0 Y) I5 }; f2 D# L i$ j
1 [4 j7 W. s* ^2 l5 l7 r+ \ 在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
' S/ q$ h$ c! D Y8 \0 k 点击“Options”选项卡,在其中可以配置一些检测规则选项:
! y& c# W4 u" q3 O) K
6 N% H2 _: s3 h 其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
$ q) R4 ~: O/ N/ s. p 四、FindBugs:
: S3 d" e) I8 ~( F, n, o% g# Z 1、整体介绍: 1 Q5 S' C$ {- o. r. F5 E* W7 t
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 / c4 `( z7 d0 q) A# c+ G' k
2、安装步骤: v! U- ]7 m% N- F4 l# q' [
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 ; I. a2 i5 N& y( ]
3、使用说明:
( F0 u9 ~# C3 L" f# w: |4 E6 z: g5 z FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project 8 _& v: K e. X) b1 i' w
4 f$ f% W* f+ g
分析完之后就会出现结果面板 8 [0 w, o' C/ h7 v" W. ~4 V7 }
, P) j* I3 R. P7 G7 a8 ? 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行
( d8 X, N0 h7 c: t. K: Q4 J: E! y, g3 k. m4 V. P
4、附:常见的错误信息
+ d) u& j: v- ^7 Z z* P 4.1、Bad practice 代码坏习惯:
. D; D" l9 W5 q# s" ]1 J5 d) ~9 n9 y9 c
图片
2 H4 e5 }+ M/ N" r6 C. t. n/ A 4.2、Dodgy code 糟糕的代码:
T2 C) M' O# K# M/ v% l/ K1 o1 ~& [0 `2 {5 i: @( ]: U
4.3、Internationalization 代码国际化相关:
. g! @& l; ?0 U3 p" V3 \ 4.4、Performance 代码性能相关: : }$ t4 W( x( N( ]; V5 `+ G5 X
5 {5 h9 G3 C2 H0 N1 E; N
4.5、Experimental:
5 {/ B5 [" j3 [6 R5 K0 [1 Y
- K. m u& L/ }" x 4.6、Malicious code vulnerability 恶意破坏代码相关: & T( ?! h$ k. e) f3 v
3 c I2 R0 }# \2 o4 o9 \0 `# s& z8 ?
4.7、Multithreaded correctness 多线程代码正确性相关:
% I' o: I* E5 D; C 4.8、Correctness 代码正确性相关: , Q& c% C& `- Q2 Y \: k; h) h( D
( H# U6 F8 v6 k& h4 H 五、SonarLint:
# j) k/ q K! Z1 H6 O 1、整体介绍: & m5 N* a- C# M& O! t
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。 9 i! X% R, W+ `
2、安装步骤:
2 {! }$ c/ [0 T$ o6 Z- J7 ^ M* T2 f 通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
! h* ]! g1 g+ Q) a" S 3、使用说明:
+ i, J/ R: o4 O- ] }: P$ F% j3 ~9 E6 L. ~5 W
右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。 ' g" v* i8 ?5 o, n# o$ {
9 O# ~0 Z0 S+ x 4、配置 SonarLint 服务端:
* l; s: v! \9 ^( H3 M 4.1、配置 Sonar 服务器:
C1 w2 z- q, |9 l sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
0 H( c3 t- T3 C3 F1 B: l I& K' p6 W4 R' |8 t: K5 ^
点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
$ [ d l3 F& ~# c8 R# v
6 b: c0 M. _8 X; F8 t, H$ J 4.2、具体 Sonar工程配置: 1 S- L" S: @, N" K
配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
! y5 \. J/ Y8 J. X c) H4 V/ f7 ]9 ^ t
4.3、使用 SonarLint 检查: - j$ s5 c4 q5 o( ]) G0 i" k
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 . _) p" Q+ k% [+ w @' K) \
! y0 H4 ]' E* D% [9 j% x2 l 总结 4 z" i' e. f/ ?! S
& h0 |& ^7 ]/ r
检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了 {1 I! m4 S" T7 |
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
' x2 E3 m0 k7 v( { PMD 自定义能力强,用来自定义项目BUG规则非常好用8 \5 [/ t/ G5 G
Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
5 e& E+ Q8 P$ [ w. B4 ^ SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
6 c8 O8 s4 G% q0 x$ d
3 Y: S7 ?* x% k8 L 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
( K+ @/ V; P3 z Q) `7 T4 b% @; d: P# z; m! r
责任编辑: # \! E: p% Y5 Z g& S4 \
' | c/ o( I% x; n% B
w% h! ^, p" g% `4 x
, f+ L+ d& [1 E% C- m: e+ u$ q) L
- i _' {# Y4 S7 ` |