本文主要介紹以下內(nèi)容:
(1)CheckStyle詳細(xì)使用
(2)如何定制專屬CheckStyle檢查規(guī)則
(3)如何定制專屬CodeStyle
(4)如何有效的FormatCode
一骏庸、CheckStyle 使用
? ? ? ?CheckStyle 可以通過插件和gradle腳本兩種方式來實(shí)現(xiàn)昏翰,對(duì)于gradle腳本而言篮昧,只需要配置好CheckStyle 的gradle腳本譬重,運(yùn)行g(shù)radle task 即可輸出掃描結(jié)果(html/xml兩種格式),因此,本文將重點(diǎn)介紹CheckStyle-IDE插件使用籽御。
CheckStyle插件使用步驟如下:
(1)安裝CheckStyle-IDE插件
(2)添加檢查規(guī)則文件
(3)CheckStyle-IDE 插件使用
? ? ? ?在AS上打開CheckStyle 插件操作面板,面板內(nèi)容如下圖所示惰匙,主要包括:檢查規(guī)則選擇(自帶一個(gè)默認(rèn)規(guī)則)技掏、掃描范圍選擇 (current file、Module项鬼、project哑梳、files Chaged (這個(gè)很重要))、刷新等操作
(4)CheckStyle掃描結(jié)果
(5)根據(jù)CheckStyle掃描結(jié)果對(duì)應(yīng)修改
? ? ? 重復(fù)(3)~(5)修改完即可
CheckStyle gradle腳本配置如下:
CheckStyle腳本配置主要包括:CheckStyle 版本绘盟、配置檢查規(guī)則文件鸠真、設(shè)定CheckStyle檢查范圍、CheckStyle掃描結(jié)果輸出方式等等龄毡。
備注 :記得添加 classpath 'com.puppycrawl.tools:checkstyle:7.1.2' (不添加吠卷,高版本gradle 會(huì)有問題)
二、如何定制專屬CheckStyle檢查規(guī)則
? ? ? ?CheckStyle不管是插件方式還是腳本方式沦零,使用都是相當(dāng)方便快捷的祭隔,而難點(diǎn)在于如何定制專屬于我們項(xiàng)目的CheckStyle檢查規(guī)則。
定制CheckStyle規(guī)則大致思路:
通過對(duì)Google 提供的checkStyle檢查規(guī)則修改完善路操,打造出屬于自己的檢查規(guī)則
地址:Google checkStyle 檢查規(guī)則
(1)全面解析CheckStyle 檢查規(guī)則
? ? ? ? CheckStyle檢查規(guī)則是基于XML配置文件的疾渴,主要通過XML文件中的module對(duì)檢查規(guī)則進(jìn)行配置。在XML文件中屯仗,被指定的module搞坝,都將被對(duì)應(yīng)規(guī)則檢查;
? ? ? ?具體對(duì)應(yīng)檢查項(xiàng)及規(guī)則可以參考:CheckStyle 官網(wǎng)
(2)全面解析檢查規(guī)則文件checkStyle.xml
在XML中主要由module 魁袜、property桩撮、message等節(jié)點(diǎn)構(gòu)成:
最好舉個(gè)例子說明
(1)module節(jié)點(diǎn)
module 主要是指檢查項(xiàng)敦第,如MethodName (檢查方法命名)
module中有兩個(gè)比較重要的節(jié)點(diǎn),它們分別是Checker(checkStyle配置文件的根節(jié)點(diǎn)店量,必須存在)申尼、TreeWalker(樹遍歷器),TreeWalker會(huì)自動(dòng)去檢查指定范圍內(nèi)的每一個(gè)java源文件垫桂,TreeWalker內(nèi)部會(huì)定義很多module。
module的根節(jié)點(diǎn)是Checker粟按,一定要有诬滩;
(2)property節(jié)點(diǎn)
對(duì)應(yīng)module 檢查項(xiàng)中具體檢查屬性,如果使用默認(rèn)值灭将,property節(jié)點(diǎn)可以省略疼鸟;
(3)message節(jié)點(diǎn)
checkStyle檢查出來,是否打印出message消息庙曙,message節(jié)點(diǎn)可以省略
(3)如何添加過濾能力
? ? ? ?根據(jù)(1)~(2)空镜,定制好了屬于自己的CheckStyle檢查規(guī)則,然后使用CheckStyle-IDE進(jìn)行掃描后捌朴,發(fā)現(xiàn)協(xié)議文件(通過平臺(tái)工具將jce協(xié)議文件轉(zhuǎn)化成java代碼)被檢查出來很多問題吴攒,那怎么才能讓CheckStyle 不對(duì)這部分代碼進(jìn)行規(guī)則檢查了。
解決辦法:
在定制好的checkStyle.xml文件中砂蔽,添加一個(gè)名為SuppressionFilter的moudle洼怔,在過濾規(guī)則文件suppressions.xml中添加相應(yīng)的過濾規(guī)則。
在checkStyle.xml 中添加 SuppressionFilter
suppressions.xml 為過濾規(guī)則相關(guān)文件:
目前可添加的過濾能力有:
(1)對(duì)某個(gè)java文件左驾,過濾某項(xiàng)或多項(xiàng)規(guī)則檢查
(2)對(duì)某個(gè)java文件镣隶,過濾所有文件檢查
(3)對(duì)某個(gè)包下的所有java文件,過濾某項(xiàng)或多項(xiàng)規(guī)則檢查
(4)對(duì)某個(gè)包下的所有java文件诡右,過濾所有文件檢查
? ? ?對(duì)協(xié)議包進(jìn)行過濾檢查是相當(dāng)有用的
? ? ? ?是否還能將過濾能力加強(qiáng)了安岂,如對(duì)某個(gè)java文件中的某段代碼進(jìn)行某個(gè)規(guī)則過濾了 ?
解決辦法肯定有的帆吻,目前通過suppressions.xml文件確實(shí)無能為力了域那,但是我們卻可以通過注解方式來達(dá)到上述目的。
使用@SuppressWarningFilter注解來過濾某些檢查項(xiàng):
1)在checkStyle.xml規(guī)則文件中添加 @SuppressWarningFilter注解能力
2)實(shí)例
局部變量命名違反規(guī)則猜煮,不能使用單個(gè)字母進(jìn)行命名
3)使用@SuppressWarningFilter注解后
? ? ? ?使用@SuppressWarningFilter("checkstyle:LocalVariableName")注解后琉雳,CheckStyle下次掃描時(shí),會(huì)將其過濾友瘤。
(4)沒事多看看CheckStyle 源碼
? ? ? ?有人可能抱怨到翠肘,Google 的checkStyle.xml規(guī)則太多,對(duì)照CheckStyle官網(wǎng)說明有時(shí)也找半天辫秧,看的也不是很明白束倍,那有沒有什么辦法可以了解更快更全了?
? ? ? 有,那就直接看CheckStyle 的源碼即可绪妹,地址:Github CheckStyle源碼 地址甥桂。
如,現(xiàn)在想查找CheckStyle 關(guān)于縮進(jìn)(Indentation)的規(guī)則邮旷,直接上在上述地址搜索框搜索:Indetation :
checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheck.java
Indentation(注釋很詳細(xì)):
? ? ? 是不是一目了然黄选,沒事多看看源碼,肯定沒錯(cuò)的婶肩。
三办陷、如何定制專屬CodeStyle
為什么要定制codeStyle了?
一是保證與checkStyle.xml中規(guī)則保持一致性律歼;
二是保證項(xiàng)目組成員使用同樣一份codeStyle 民镜,風(fēng)格一致性 ;
最終輸出自定義Code Style 文件:radio_code_style.xml
Code style 導(dǎo)入導(dǎo)出 :
3.1 Code Style-java 配置
CodeStyle java 主要包括以下幾個(gè)部分:
(1)Tabs and Indents (Tab 和縮進(jìn))
? ? ? ? ?Tab和縮進(jìn)使用默認(rèn)就可以
(2)Spaces (空格)
? ? ? ? Spaces 主要包括圓括號(hào)险毁、操作符 制圈、關(guān)鍵字、大括號(hào)等左右空格問題畔况,使用默認(rèn)配置即可鲸鹦。
(3)Wrapping and Braces (大括號(hào)及其包裹內(nèi)容)
? ? ? 支持自動(dòng)換行(超過line_max =200 ,后面將會(huì)介紹)跷跪;
? ? ?if亥鬓,while 等關(guān)鍵字自動(dòng)帶上大括號(hào) (format時(shí)進(jìn)行);
? ? ?builder模式 "."號(hào)自動(dòng)對(duì)齊 等等配置
(4)Blank Lines
? ? ? ?使用默認(rèn)配置
(5)Java Doc 默認(rèn)
(6)Imports
根據(jù)需要域庇,調(diào)整Imports 順序
(7)Arrangement 排序規(guī)則 (默認(rèn))
(8)Code Generation
在Field 前面添加 m前綴 嵌戈,在 static field 前面添加s前綴
另外,我們還可以在CodeStyle中配置 Line_max
? ? ? ?每行不超過200字符
? ? ? ?一眼看過去听皿,里面配置項(xiàng)很多熟呛,對(duì)應(yīng)的含義也不是很明白,那就去看看官方code_style_java文檔尉姨。
如:Wrapping options選項(xiàng) 含義
3.2 其他比較實(shí)用的設(shè)置(不在Code Style 范圍內(nèi))
(1)Overly long method (方法過長(zhǎng))
默認(rèn)情況:Severty(嚴(yán)重程度)為Waning庵朝,默認(rèn)行數(shù)限制30
可以修改提示對(duì)應(yīng)的Severty級(jí)別和行數(shù) ,與Check Style 保持一致
(2)自動(dòng)換行
(3)自動(dòng)清除 unused import
在開發(fā)過程當(dāng)中又厉,經(jīng)常碰到無用的Import需要清理或者新增類需要添加Import九府,這時(shí)候要么遺忘刪除,導(dǎo)致產(chǎn)生無用的代碼行覆致,或者需要使用快捷鍵新增拱镐,非常不方便尖坤,Android Studio自身就提供自動(dòng)處理功能塞耕。
四、如何有效的Format Code
? ? ? 在前面第二宣羊、三部分 我們已經(jīng)完成了CheckStyle檢查規(guī)則和CodeStyle的定制,考慮到之前組內(nèi)同事使用了不同的codeStyle.xml汰蜘,所以在修改CheckStyle掃描問題前仇冯,需要對(duì)項(xiàng)目代碼進(jìn)行整體format(使用新的codeStyle.xml),萬能的AS提供了這種能力族操,即Reformat code苛坚。
Reformat code 功能如下圖所示:
(1)Options 優(yōu)化項(xiàng) (默認(rèn)都沒有選擇)
主要包括 imports 、rearrange色难、VCS 等優(yōu)化
(2)Filters 功能
? ? ? 主要包括泼舱,范圍和文件類型
(3)reformat code (current file)
(4)VCS 前配置自動(dòng)執(zhí)行 (暫時(shí)不需要,我們需要Code 前)
(5)指出Reformat code 的Scope 范圍選擇功能
? 自定義Scope
? ? ? ?為什么需要自定義Scope 范圍了莱预,如有些文件,協(xié)議類 (不在Check Style 掃描檢查范圍內(nèi))项滑,不需要再對(duì)其Reformat code依沮。
? ? ?但是必須指出的是,對(duì)整個(gè)項(xiàng)目Reformat Code 次數(shù)并不多枪狂,因此不需要對(duì)其進(jìn)行范圍設(shè)置危喉。
? ? ?因此,對(duì)整個(gè)項(xiàng)目進(jìn)行format的時(shí)候州疾,選擇 Scope = Projects Files 辜限,然后回滾一下 協(xié)議包下面的修改即可。
至此严蓖,關(guān)于CheckStyle 的相關(guān)內(nèi)容解析完了薄嫡,如有錯(cuò)誤地方或不足之處,歡迎指出颗胡,謝謝^_^!