|
! [, n, a* v" I! J! j% Y
原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! " K% W# y4 L1 \9 Y9 Q
, c9 ~$ F2 x; C5 L! `$ ?
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 % P) w1 ~1 E, m3 e
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力
! h9 e/ r7 s! C0 [( R+ a3 C" W# c2 _ 一、Alibaba Java Coding Guidelines
; M# j8 n9 u( B: L1 `# G 1、整体介绍: . M) Y, @$ @2 _3 \+ m6 ~
Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。 0 C( D4 ]4 _1 S* B% f) X- w
阿里巴巴规约扫描包括: 3 p5 C7 ]3 N2 b+ D+ ?# {1 \) t
. i! Z+ L/ T6 L1 Y1 a OOP规约
2 Y. T8 p5 B9 z4 W2 u. d- r 并发处理( ]/ l: R( _. p) }; Q5 K9 F5 N
控制语句; n' L& L x4 M5 E0 p5 W+ M3 t, u
命名规约, \* W1 v6 c) E# q: g9 E* q; e
常量定义/ Q! Y1 k" d; Z6 x/ J$ b6 l
注释规范1 m E+ N4 Y+ c1 e% d3 i" k" m
( I6 i: m4 `: ? 2、安装步骤:
& V: ~" r" {; b' @7 ^ File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 5 v0 C& O4 |6 @( ?6 O
3、使用说明:
9 a! x. M J$ a% e6 j 3.1、运行方式:
. H* r: k. W; d (1)可以Tools > 阿里编码规约 > 编码规约扫描 5 h6 X' M+ l! X6 t x

0 l9 Y5 k8 K0 _7 F& X& Z0 N. b (2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可: * I! B6 B# B1 t T5 ^$ h

) s6 S" a$ H% n: Z 3.2、菜单功能:
- A7 d9 I+ X5 M! S M' O* I
% T* q/ `' m: C7 f0 x/ z$ r; w 编码规约扫描:开始扫描代码
" P' @9 m3 ~. R& c& d% o 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能
, G& J* Q1 N* k- \4 y 切换语言至英文:中英文切换
; z3 m% k( T7 L7 s+ E: n6 W1 Y
% t, `6 l) [1 D1 c 3.3、运行结果:
% a8 k3 I( C: T0 b1 l: m; \2 u 扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。
8 k- c0 E+ e- F8 t; ^5 G 
: X7 T: U9 ~: v- i$ X 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
/ J$ w2 }0 c/ X 
1 V2 @' ^6 ^6 F7 G8 x& E* r) z0 V8 l (1)指定区域搜索同一类问题: 0 f# F1 p3 i- i' K- H. U
当点击③处的按钮时,会弹出如下按钮:
( U# F3 D6 @' Q I9 s 
! g- w/ U0 I" m 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
# M2 Y }: [$ O U 
- V N& |7 B. [/ q7 ` 这里我们可以看到,显示了整个Project中的所有该类的问题。
! O; j& j U w$ y, P d& { (2)预览具体的不规范代码: . Y/ D7 m3 B3 \; t6 o
如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 " H) o- D1 ]1 R+ ]( R) p% K
 2 |/ C' L) ?4 [/ V+ N/ }8 E ]- a
3.4、工具栏功能介绍:
; p$ v0 M) @* k* s% ~/ T1 o, ^ 
0 x% f3 s l" p* T" O: D; \
: W! R# I; n( X, @8 f1 ^8 a Rerun Inspection:重新运行一次扫描
5 T. @. _. @. w4 n- q" x% B Close:关闭真个AJCG面板
" Q K( A, i# {2 b& |) ~0 [% j Expand All:展开结果的树状结构,整个结果是树状结构的。7 a: f! M. Q3 V) k
Collapse All:收起结果的树状结构
2 ~2 n7 U! F2 l# x( q7 E, { Go Pre Problem:选择上一个问题
! X2 h4 A' k3 D' l! L Go Next Problem:选择下一个问题
+ ~6 D, r7 L$ x' n' I% C Help:帮助
' W' r& u6 j9 D1 _! J8 @ Group by Serverity:(不知道如何描述)
- p3 `0 y% F9 l. S/ Y( d4 y Group by derectory:按目录分组/按类名分组间切换3 j" t: O0 \0 M$ ?5 W
Filter resoled items:过滤掉已经解决的项
( F! j& H9 C: ?0 \, Y5 m, Z Autoscroll to Source:自动滚动到源码& D4 V0 c/ `4 U
Export:导出,可以导出为XML和HTML两种格式
; D7 V/ e C' z: L/ g5 s; {4 {6 a Edit Settings:编辑设置) k! H% b4 M9 @
; @$ ?# M2 M3 v 二、CheckStyle:
. z$ X4 l) s6 a6 O 1、整体介绍:
, v3 l- o6 h! \+ X7 Q9 }" Q5 G" ] CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
5 }! E& c- \0 C' b8 L Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
5 f9 P# D1 w: z( v5 j* b 2、安装步骤:
$ r" ?' J. d8 H6 t% o 通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 0 H4 s% J6 ]) O. ?
3、使用说明:
. a/ p' g. A! l s8 k( Y  $ X9 V4 x. u: z( e* F$ C
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 : U; ?: \& G( C7 Z$ ^
三、PMD
# ?3 M. D% a* e$ k' t5 e 1、整体介绍: 9 z; o* F: p. }" W
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容: i3 O0 t: v: R; \
+ v9 ]8 E- p3 U0 o; I, ?
潜在的bug:空的try/catch/finally/switch语句' s) t8 K# r7 D- K3 i
未使用的代码(Dead code):未使用的变量、参数、私有方法等" ?, `+ K. `% x
可选的代码:String/StringBuffer的滥用
* k8 F1 A" U+ C' E 复杂的表达式:不必须的if语句、可被while替代的for循环
! M1 x) y1 O, q; @6 X 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs4 y; z& w# H, U. h
循环体创建新对象:尽量不要在循环体内实例化新对象& J1 c% @( V$ c3 H$ b6 k: X: o
资源关闭:Connect,Result,Statement等使用之后确保关闭掉9 U3 u5 R8 r- f7 d. y* k/ U* z
3 |$ W, H `/ p& x1 j7 q/ O
2、安装步骤:
2 C5 v; h) E8 T$ G" F0 U. Q, S 通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
2 U; ~3 C6 c3 n, j; ~, y1 t 3、使用说明: 4 g" m( Z2 c1 E9 D
; {; A! k- ^0 z+ S1 Y: \ 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html
. p! K% O- u5 X' L J7 F/ i9 ?% H/ \* F F% |. `- q8 z
3.1、运行方式:
9 q* V0 p+ R( X1 | (1)从Tools菜单中启动: . O6 ^, k5 q! A3 R% t, B: r! ~
通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。 , ^ }8 w$ l% S2 ~
: n m/ b' U4 W- V9 F/ t' O
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。
# i" E% n3 o$ q5 H6 Z1 }5 Y Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
9 p. ] h, V- T8 Y1 {4 \! K* a% X. g: F8 A" t
(2)从右键菜单中启动:
$ q$ s" ^8 m5 D) m' ? 在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 $ R# ^6 ]' ]& {7 G- ?* J' ]$ {9 r
3.2、运行结果:
w6 d8 [4 s8 }( h# C& a# Z m! U  , q+ Y- I( Y: C8 u- I
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。
; f" F0 h2 I7 C 3.3、配置检测规则: g# Z: b! u3 Y' s/ \' H
通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面:
: }: l1 `+ T6 S6 q1 x  , x4 n% ?1 I( p$ V
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。
3 s) z6 [; C0 v$ B t# Y7 P 点击“Options”选项卡,在其中可以配置一些检测规则选项: % {" C; {8 ^. ^( I& ^( J
 2 N- z4 f. _1 S8 K# O
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。
+ W* O. z0 r f5 r( s 四、FindBugs:
8 {7 n F" P5 E" |$ Q9 Q8 ] 1、整体介绍: G* g) ?3 ~' Q ]1 \
FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 2 ]% @2 f- q# t4 L: o0 w' ~" R) x
2、安装步骤: : G" x( H1 r9 j
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可
9 A5 J5 w/ e5 p8 P( l 3、使用说明:
* C- q& U* y0 T. y FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project " A+ f# o3 ~4 O2 O3 s

0 u1 |. B' C" S Z2 a 分析完之后就会出现结果面板 + g z( Q6 g7 _% Z

1 v& G ^! ^4 O& o7 _ 点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行 + e1 V8 J( P5 |0 Y
5 C7 J1 L* y* e; @3 M 4、附:常见的错误信息
( a% E- X* n. H2 N5 L5 c: X. f3 r" R 4.1、Bad practice 代码坏习惯: , v: Q$ p2 X7 s; z
/ f) |5 R( a2 r* I+ n% H, Z 图片
& k' z2 }- g5 i3 V) {$ S 4.2、Dodgy code 糟糕的代码:
0 X/ D1 h2 z8 h8 a/ P$ h' i) |2 u9 s$ n
4.3、Internationalization 代码国际化相关:
5 @7 d( `( q; a( l5 b- ` 4.4、Performance 代码性能相关: 3 L# D4 B6 w( V4 y7 F1 D
. o; y/ ^1 d: e; h 4.5、Experimental: ( D2 K0 s* u$ W# x' u% Q; A
- X5 ]3 v( p' |, O, w& O
4.6、Malicious code vulnerability 恶意破坏代码相关:
( y) k+ q# s ]/ I: L! ?1 r+ A" @- ]3 C, U9 i( R
4.7、Multithreaded correctness 多线程代码正确性相关:
: l2 q% I) {) T- H K* B3 f" S 4.8、Correctness 代码正确性相关:
$ j7 p; q4 r. f- H
+ {$ P% u, m; p. J 五、SonarLint:
1 E1 J) G) F/ ? 1、整体介绍: y: Y# U$ E: Q" j1 {
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
5 q# c! Y4 u2 k C4 t6 T# G' {1 c 2、安装步骤: 0 }% f( C6 ^% H8 h' K
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可
0 |% X; C( @6 l' k( P2 \ 3、使用说明: ! r3 |- N& ~$ R! S# m" Q* g, {
) d4 G- D% W f% p3 }
右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
! H1 Y4 y* V! C7 s! p; w& y1 @, R- \' S+ b
4、配置 SonarLint 服务端:
- `4 _) v1 `% p6 _( N0 ?5 f 4.1、配置 Sonar 服务器:
- D1 ]8 @4 X' { M# s( _3 g sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查:
9 j9 \- o% B [% K# M& B
8 K: D& D/ L" q 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码 ' \$ B3 D% s2 e, A- g. u2 t
4 G+ V: s3 F+ h7 E/ y3 i; x
4.2、具体 Sonar工程配置: $ U$ Z0 M: C0 D4 @7 A8 l
配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
) s, K- l; S; p1 p& T. b* V2 D/ }& x9 s. V3 d- b9 ?$ l
4.3、使用 SonarLint 检查: $ I6 l: j) S9 {! o5 O
配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查 : I7 q; g5 ?- \* ~( l
7 W( _" w3 L. w$ |' r. ^& n- Y* c 总结
# P0 O5 G( M5 o4 [! }% n4 {9 D5 e5 r& D R) m3 T
检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了
7 A3 d. d5 I8 ` 找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
. }* Q6 ^3 L1 g) K( C: e9 t, G PMD 自定义能力强,用来自定义项目BUG规则非常好用- }2 S! O, I/ z5 U
Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
* z5 J5 F+ s% N/ q: U* Q( U SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
2 [5 r, V' }4 ]1 Y& {
0 \& {3 D7 L, U/ m& t" _# ~ 文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
! h6 k- S, w7 l, O L- P+ v( S8 m$ }5 E' Y3 ]. y1 {! M
责任编辑:
8 _$ a7 @3 K! N+ ?; U
7 f1 x, z5 y/ i) N: B! s) X; l' k3 i# f) ^" V) ]7 u2 r
$ [8 C- n( n6 r1 Z. T
! O: |9 [; T% |9 N) x7 b5 @2 z |