|
+ L! a) f8 h- t' p% E* F 原标题:腾憬文化科技香港科技事业部 | 五款IDEA 插件,堪称代码质量检查利器! # N* [9 M& z4 B" E5 }* L
- e) ?5 \- M. q/ m
随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,比如通过代码审查,从而降低错误风险,但是,代码审查难度大,代码缺陷、漏洞不易发现,且审查工作随着代码量增加而增加,审查效率低。 " q, o7 a' d: u; e' |8 v7 M
工欲善其事,必先利其器,因此,这篇文章给大家介绍几种检查代码质量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint,让你在关注代码质量的同时,减少 code review 的工作量,提高 code review 的效率,并通过代码质量分析去反向提升我们的代码编写能力 % h' P+ [8 @% l0 E1 D3 k: ?
一、Alibaba Java Coding Guidelines E: y' @$ ?! M- k$ n. y
1、整体介绍:
4 o4 U* m6 x7 V7 R7 w3 U Alibaba Java Coding Guidelines 专注于Java代码规范,目的是让开发者更加方便、快速规范代码格式。该插件在扫描代码后,将不符合规约的代码按 Blocker、Critical、Major 三个等级显示出来,并且大部分可以自动修复,它还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
" X% o0 j6 p+ }" b% d 阿里巴巴规约扫描包括: / y& ~+ }6 ~! T4 t$ @
: {, w/ v8 P s1 q6 F! V
OOP规约' ?+ H. u' B7 g. \8 ], T; @
并发处理+ Y% o: Y" E( O8 z# G: O% i
控制语句% k1 ~6 _ c4 K! }# k
命名规约
0 X/ g% h7 ` C ]& @3 `) O" E5 J; s 常量定义7 U7 K" o. ]( Q( I0 g' f8 Y! w
注释规范, F& }$ `, C: g
' H. F$ b# k8 X! A, k- A8 _$ U" A
2、安装步骤: & L+ `, a# I# u
File > Settings > Plugins > Marketplace 搜索 “Alibaba Java Coding Guidelines”,按照提示进行安装,然后重启即可。 " d9 B: ~# M' o8 V, [9 ]* t
3、使用说明:
( Q, y+ A* m0 C2 b& Q* W 3.1、运行方式: " w6 L7 d5 h$ q5 o
(1)可以Tools > 阿里编码规约 > 编码规约扫描
_, U" P1 [3 j1 E/ W4 L( ~  & E/ X; J+ P3 i
(2)在编辑界面或者项目区域点击右键,在右键菜单中选择“编码规约扫描”即可:
6 t% Q& Z; q- {; l7 M6 \ 
/ }; D$ h; [5 u. v( z( ~6 A 3.2、菜单功能:
7 u/ n# x: f Z
$ N" s! a& _( M: }: _4 q+ O- _ 编码规约扫描:开始扫描代码
( a: U% w( A P! o; c 打开/关闭实时检测功能:实时检测代码,一般机器性能比较好的话可以开启这项功能# r7 d( T4 n; {
切换语言至英文:中英文切换9 O' C) l+ z x; U# y# B3 E
5 F% J% ^5 b- w# V
3.3、运行结果: $ M5 H% x! {/ ~# I
扫描完成后显示结果如下,我们可以看到扫描结果主要分为 Blocker(阻挡者)、Critical(严重问题)、Major(主要的)三个大类,它们表示的是问题的严重程度,严重程度由高到低为:Blocker > Critical > Major,至于每一类中都会包含什么样的问题,图中的内容已经说明了一切。 - F# s! t% k4 O2 q# Y8 u* X

. z, Z; ]) x5 _6 [5 Y% x: @) G8 ^ 选中其中的一个问题项目,会出现如下内容(如果当前鼠标点击的是最终项,右边区域显示的是其它的内容,后面会再讲到):
: [6 ]( N: a& Q8 m3 |5 c  l4 o2 S' ^) @; r
(1)指定区域搜索同一类问题:
! p% V2 A0 z% K( ^8 p' E/ \$ C 当点击③处的按钮时,会弹出如下按钮: 5 Z2 d! y- C( U' b9 I9 Y) U

2 @) w, { c: H1 z& F4 L 这里选择扫描区域,来扫描鼠标选中的同类问题。如果按照默认选择,那么运行后的结果就如下图所示:
, o* d% B# _- l% u8 \$ Y 
5 @5 j) r. u( A0 n& o5 ]9 h 这里我们可以看到,显示了整个Project中的所有该类的问题。
0 [9 ~+ E! w! D. V+ V. Z: c (2)预览具体的不规范代码:
0 |4 T; g$ A! T( G# m& u 如果点击的是最终的问题点或者问题所在的类文件,那显示的就是如下界面,预览该处不规范的代码。 / W1 n2 W' n* Q# A7 {6 ^6 i

5 C6 b$ I2 t0 I! Z3 N$ Y. X 3.4、工具栏功能介绍:
: q" t+ G& d, r; }5 e. ~: S, N  ' m# H! s K4 J, A1 D) Y) ?
1 z Z: `" w" u1 a; k1 a' l
Rerun Inspection:重新运行一次扫描
2 V$ E) ^& q, M+ p& @ Close:关闭真个AJCG面板& x' M0 e! I4 ~+ X
Expand All:展开结果的树状结构,整个结果是树状结构的。. q: p: c$ C6 B1 Q8 O3 E2 f
Collapse All:收起结果的树状结构+ d6 I1 |$ l/ F0 X4 D$ `) p" \
Go Pre Problem:选择上一个问题
2 W7 F4 i" {" d5 W3 x Go Next Problem:选择下一个问题9 @# V0 Z9 d; y! | \8 @& S
Help:帮助" q, Y I2 q5 u+ Z1 [& l6 P
Group by Serverity:(不知道如何描述)% {9 _; g; \3 Z3 S0 r3 Y
Group by derectory:按目录分组/按类名分组间切换1 e$ g. S7 x7 g1 X
Filter resoled items:过滤掉已经解决的项1 u- m; ^8 Z- O& g8 a8 Z& v
Autoscroll to Source:自动滚动到源码
% X; Z9 D& ^; W8 Y, q% S Export:导出,可以导出为XML和HTML两种格式7 U7 I& W, I, |& q" J+ T" A
Edit Settings:编辑设置
4 E! [7 O- L* G. I+ h; [( K
; o+ }; \0 [3 u* _+ K5 ?% v& Y 二、CheckStyle:
- }3 E# n+ Y/ ~, ^# o 1、整体介绍:
. |4 E( |, B' E0 U, y CheckStyle 侧重检查编码格式和代码风格规范,如命名规范、Javadoc注释规范、空格规范、size度量(如过长的方法)、重复代码、多余Imports等,从而有效约束开发人员更好地遵循代码编写规范。Checkstyle主要是文法层面的代码编写规范的分析,对bug几乎没什么发现能力。
5 R9 ]7 e* S) N# c5 n4 Z3 j Checkstyle插件中默认内置有2个执行代码检查的配置文件(Sun Checks 和 Sun Checks),但是这两个文件检查的非常详细严格,即使优秀的开源项目也会检查出来有非常多的错误告信息,所以需要导入我们自定义的配置文件。
4 ^4 M' `/ R- I- S# @- d# b 2、安装步骤: 6 K" Y$ a% Q; b0 k3 @( K# s# ]
通过 File > Settings > Plugins > Marketplace 搜索 “CheckStyle”,按照提示进行安装,然后重启即可。 ) n1 x* x7 [( v% C2 r6 o
3、使用说明: 9 Y6 y. a# i: e# d' i$ e
 ( P! _6 Z$ o' C9 v) f9 d; `4 Z6 l
可以看到基本都是一些缩进啥的编码规范,可以不用太关注 ) I4 |8 m4 \ K. n; _4 s
三、PMD
3 t4 J0 Q* _6 v6 |# U+ l' p, ~8 Q% j 1、整体介绍: . s! i8 ?, a: O- F0 F7 Z! X4 O
PMD侧重面向安全编码规则,且具备一定的数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则,PMD可以直接使用的规则包括以下内容:
$ ~6 Q. o% S. R) O
+ C& X1 }; m& W3 G& w+ I8 }. Y 潜在的bug:空的try/catch/finally/switch语句
: @( H$ t6 z; `- K/ o1 N! A! a 未使用的代码(Dead code):未使用的变量、参数、私有方法等
f5 @5 d6 a1 v3 T 可选的代码:String/StringBuffer的滥用
5 w! F1 I" q# j4 a" n+ R/ W. e5 t 复杂的表达式:不必须的if语句、可被while替代的for循环5 t7 Z0 d' d6 o( K* P% J
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs- v* _8 s) }# p, N' s0 [$ B- c4 s
循环体创建新对象:尽量不要在循环体内实例化新对象
( h: f" U }6 H7 }/ F5 Q7 z5 h 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
9 r+ z5 a$ A7 j2 Y I4 ]
: A$ }) U/ B! E7 q; t( P+ `8 f! x 2、安装步骤: # t) O# t. J1 T- F+ V
通过 File > Settings > Plugins > Marketplace 搜索 “PMDPlugin”,按照提示进行安装,然后重启即可
6 k8 B, w' t8 g) I8 D0 {( [5 N! r 3、使用说明: 3 U3 B" P' Y; M. q+ R2 Y8 W
' y$ r# s0 ^: u: i4 E; v2 d; V; E 参考文章:http://wjhsh.net/andy-songwei-p-11830812.html4 z+ u* ~/ `9 }& B: v. d
% J6 C9 ?6 m0 y( H 3.1、运行方式:
2 t& ]$ a7 `8 ~6 m1 D; Y* \ (1)从Tools菜单中启动:
7 a- f7 y3 u4 r7 T5 v3 } 通过 Tools > Run PMD 可以看到如下的界面,如果通过该方式启动,扫描的范围就是整个项目中的文件了。
" Q. _6 q5 L, o9 D H& z' O: v3 f" B$ D8 Y+ @# v
Pre Defined:预定义的规则,也就是插件自带的检测规则。后面展开的列表中列出了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。+ O/ U1 s$ p( C1 k
Custom Rules:自定义的检测规则,PMD允许用户根据需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。
3 ]- L) o4 ^. \0 A2 `) t+ M, {
- y" K% R& m2 O) q( c8 q; l0 U$ S (2)从右键菜单中启动: ; _6 J: K7 r$ P; g' W8 |% P7 d
在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,如果通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。 # c; G1 i( r# u+ h7 {" O! y3 H
3.2、运行结果:
2 x. e8 L+ t& e3 d0 t& N% N  ( k9 O9 q8 j& L# n8 g( g
运行后会出现如上所示的面板,左边工具栏,鼠标停留在上面会提示其功能;右边显示了检测结果,当点击具体某一问题项时,会跳转到对应的源码中。 3 v1 H: s8 m. T+ g
3.3、配置检测规则: 7 {% ^2 {1 }0 n2 H
通过 File > Settings > Other Settings > PMD 可以打开检测规则的设置界面: ) b7 N, A" l- t
 & E8 O, p$ H: }, F! o
在 “RuleSets(规则设置)” 界面可以管理自定义的检测规则。因为在实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。 9 O9 S$ j$ P8 C5 H# h/ c2 y; z
点击“Options”选项卡,在其中可以配置一些检测规则选项:
$ C: K$ p4 @8 b$ d) e) G  % b# Z7 j8 D4 M8 Q( l2 t
其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。 : s W7 S8 W" }; Z( p
四、FindBugs: : o7 G7 a! a9 [
1、整体介绍:
) S8 f- g7 F0 u D FindBugs 侧重于发现代码中存在的bug,如运行时错误检测(空指针检查、未合理关闭资源、字符串相同判断错(==,而不是equals)等),它可以简单高效全面地帮助我们发现程序代码中存在的bug以及潜在隐患,针对各种问题,它提供了简单的修改意见供我们参考 . K$ {& |0 h& w
2、安装步骤: ) O: o4 R$ W3 W3 i) g
通过 File > Settings > Plugins > Marketplace 搜索 “FindBugs”,按照提示进行安装,然后重启即可 ) ]- Z! e1 ^; E/ J3 E8 C# s
3、使用说明:
' L. G: x8 U& b! A* J Q FindBugs 可以分析单个文件、包下面的所有文件、整个module下的文件、整个project下的文件,右键想要分析的文件名/包名/module名/project 4 R6 B* D6 F9 e1 Y+ m H# j# G6 U

0 W0 c2 T2 o* }% x7 @4 u 分析完之后就会出现结果面板
6 H% I# G( S1 N$ |  . u5 V( O1 ]) x; H- H/ W- \9 \
点击对应的item在右边会定位到具体的代码,这是根据提示进行处理修改就行
8 n( J0 }0 w1 {1 \7 W
: i/ C: O, E; y) c* F: q6 s 4、附:常见的错误信息
5 i2 ^& E- A+ g _9 U( N, q5 E8 f 4.1、Bad practice 代码坏习惯: 1 z, N1 z s4 t' A8 Z7 C
* Y8 L6 B5 O( n& I# e 图片
9 J( f( N) l& a6 X 4.2、Dodgy code 糟糕的代码:
/ V2 i4 e! U, h" d# a! g6 ] O
/ m9 L: w0 g% z 4.3、Internationalization 代码国际化相关:
# N2 C: S6 }: k' H* } 4.4、Performance 代码性能相关: # N1 Z' T+ q! A
, s4 i8 ~- m) P; \ 4.5、Experimental:
6 T! Z9 E8 i! k* U: F1 q$ F& e* Z) k4 _7 y9 R
4.6、Malicious code vulnerability 恶意破坏代码相关: * r/ ~' s) u( w
; @5 ~( d* U6 ^9 ~
4.7、Multithreaded correctness 多线程代码正确性相关:
0 u! Z$ R) z: P( X; c1 T/ X5 j; }- \ 4.8、Correctness 代码正确性相关: # D. p) q: o, o0 D Y/ L i E) A
$ Y7 R1 u/ F& i7 W5 U) r
五、SonarLint: 7 O% x& G% t1 h) H1 z, N4 c+ i: L/ {
1、整体介绍: 8 y9 Z* e3 g4 _. a( r
sonar 比 Findbugs 高了一个层级,它不仅关注常规静态BUG,还关注到了如代码质量、包与包、类与类之间的依赖情况,代码耦合情况,类、方法、文件的复杂度,代码中是否包含大量复制粘贴的代码,关注的是项目代码整体的健康情况。sonar 有两种使用方式:插件和客户端,sonar 的插件名称为 sonarLint。
% j# y. g5 I+ j% E6 T- X 2、安装步骤: 6 ?5 \! a. p( U6 R
通过 File > Settings > Plugins > Marketplace 搜索 “SonarLint”,按照提示进行安装,然后重启即可 3 P- U' g) }9 ?3 y% e
3、使用说明:
7 `. D5 z2 b3 u y) N9 h, E' V6 c# H. a
右键项目或者文件进行如上图所示操作,执行之后可以看到如下信息,如果代码中有不合理的地方会在report中显示,同时点击错误的地方在右边会给出建议的修改供参考。
/ c8 \6 Q B* y' M* v, O+ B& z% X: [$ C
4、配置 SonarLint 服务端:
' ^: }8 j& v% s" ^ 4.1、配置 Sonar 服务器:
9 X" r: ~) D, e8 o1 v sonarLint 插件的使用场景是自用自审,但 sonar 也提供了平台版本,使用场景则是他审,sonar 平台的搭建就不在这篇文章介绍了,感兴趣的读者可以自己上网查看,我们这里主要介绍如何在 sonarLint 插件中配置关联 sonar 平台服务器的工程,进行本地检查: % T3 `9 y! s) V6 X0 F$ d [
3 v' E$ ^$ H. h. s* f' U: h 点击新增按钮,输入Configuration Name,配置sonarlint 服务器的地址,然后下拉框选择 Login/Password,输入 sonarlint服务器的账号密码
6 z$ H. a+ q! M8 m- V5 e) y4 X# I& Y/ G$ v) k( {
4.2、具体 Sonar工程配置:
3 M" ^$ C* L& O4 ? 配置完服务器之后,需要针对具体工程进行配置,点击 connection下拉框,选择上面配置好的服务器连接,然后点击 Search in list,找到对应的工程:
6 O/ m" t* T" p! E) K' @% A: O+ Q0 R
& i6 Q% \6 O: I 4.3、使用 SonarLint 检查:
, [$ X; b# B' ?$ e* s; @ 配置完上面两步之后,接下来就可以选择要进行检查的类或者目录进行 sonarlint 检查了(跟第3点的使用方式一致),同时,在 commit 代码的时候,勾选 “Perform Sonarlint analysis”,会针对你要提交的代码进行sonarlint检查
8 U5 p9 g. g m# h, ]# f
* r* p8 M6 I! ? 总结
. T3 C' b) l8 S9 h
) h4 f( Y! V1 h3 } 检查代码规范的话,直接使用 Alibaba Java Coding Guidelines 就可以了& h1 J' V, T) x
找 BUG 的话,使用 PMD、Findbugs、SonarLint 相互补充:
: a" x1 | J+ o7 _ PMD 自定义能力强,用来自定义项目BUG规则非常好用
) O% r0 i6 S( ~3 f" i+ `* o Findbugs 找 BUG 能力很强,我们拿找到的BUG给新员工培训也很好。
* [1 m9 ` ~* _ ~+ r$ x3 Q SonarLint 规则丰富,比 Findbugs 能覆盖到更全的场景
4 V$ l) ^; H6 z, n) @. Z! b, u' m
文章由重庆腾憬文化科技有限公司新闻事业部整理,仅用于学习交流,版权归原作者所有,如有问题,请及时与我们联系,我们将第一时间做出处理。返回搜狐,查看更多
3 U E6 h4 i' J8 j1 T9 T) ^! r. J2 [, H/ Q$ ]' g
责任编辑:
4 i. v: f9 E( D( L4 {
t" U# Z5 K/ L' N) x+ U8 _+ A4 _6 `! w3 B5 i+ g
4 u; ?/ k8 q0 q. J
; ^# o5 d5 A; _7 | |