Java自動(dòng)化代碼規(guī)范檢測及快速修復(fù)

OS: Mac OS
IDE:Android | Eclipse
構(gòu)建工具: Gradle

前言

每個(gè)團(tuán)隊(duì)中不同的程序員的技能熟練度和自我約束未必大致相當(dāng),如果沒有一定的規(guī)范對(duì)每個(gè)人進(jìn)行約束,那么在團(tuán)隊(duì)合作之中難免會(huì)出現(xiàn)一些沒必要的麻煩。而且像這種基礎(chǔ)無聊的東西也沒必要通過人工進(jìn)行 review,而且能做 review 的人級(jí)別只能是項(xiàng)目中職位最高的,所以這是一種資源浪費(fèi),職位低了,又不好說,說了人家說不定還不樂意,覺得你挑戰(zhàn)他的權(quán)威,說多了都是淚。
所以最好的方法就是在開發(fā)過程中依賴編譯器自動(dòng)檢測,然后在運(yùn)行的時(shí)候進(jìn)行全局的代碼檢查,不能通過代碼規(guī)范的話就直接安裝失敗。失敗的case會(huì)提供詳細(xì)的解釋,且提供快速修復(fù)功能。

CheckStyle就是一個(gè)用以制定并且檢查規(guī)范的庫 or 插件。
下面我們使用 Android Studio 安裝 Checkstyle 插件,

安裝 CheckStyle

  1. 打開Android Studio -> Preferences -> Plugins -> 搜索 CheckStyle ->點(diǎn)擊安裝,安裝完保存并且選擇重啟 AS
  2. 重啟后就可以在 Android Studio 底部工具欄看到CheckStyle工具了
  3. 打開 CheckStyle 面板,選擇一個(gè)規(guī)范,這里我們選擇 Google Checks,即為 Google 的規(guī)范,詳見下圖


    圖片.png
  4. 打開某一個(gè) java 類,然后在 點(diǎn)擊 CheckStyle 面板左上角的綠色三角箭頭,即可執(zhí)行代碼檢測,詳見下圖


    Snip20180525_17.png

這樣我們就安裝好了 CheckStyle 并且初步能使用了,突然想來句全劇終,哈哈。

定制自己的代碼規(guī)范

從上圖中我們可以看到 GoogleCheck 的規(guī)范中關(guān)于行前縮進(jìn)是2的倍數(shù),而AS 默認(rèn)還有大多數(shù)我們?cè)?Github 上看到的庫的行前縮進(jìn)都是4個(gè)空格的倍數(shù),所以這里我們把規(guī)范改一改會(huì)合適點(diǎn),CheckStyle當(dāng)然支持自定義規(guī)范了,步驟如下

  1. 首先我們?nèi)ハ螺d一份GoogleCheck,在此基礎(chǔ)上進(jìn)行修改
  2. 將下載完的 xml 文件拷貝到項(xiàng)目中,我是放在rootPath/config/google_checks.xml
  3. 打開google_checks.xml,找到Indentation,將子節(jié)點(diǎn)<property name="basicOffset" value="2"/>中的 value 值改為4
  4. Android Studio -> Preferences -> Other Settings -> CheckStyle -> 點(diǎn)擊 Configure File 底部的 + 按鈕添加我們放在工程中的 google_checks.xml文件,并且保存設(shè)置,結(jié)果如下圖
    Snip20180525_18.png
  5. 重新打開Android Studio 底部工具欄的 CheckStyle 面板,選中MangoCheck,并且執(zhí)行,可以看到已經(jīng)沒有報(bào)縮進(jìn)4個(gè)空格不符合規(guī)范的警告了,如下圖所示
    Snip20180525_20.png

通過上面的步驟,我們已經(jīng)學(xué)會(huì)了如何制定我們自己的代碼規(guī)范,并且集成到開發(fā)工具中了,如果想要了解更多的規(guī)范設(shè)置,可以看 CheckStyle 的文檔,文檔每個(gè)屬性都提供了實(shí)例。

實(shí)時(shí)檢測代碼規(guī)范

通過上兩節(jié)的內(nèi)容,我們已經(jīng)學(xué)會(huì)了如何使用 CheckStyle對(duì)代碼進(jìn)行自定義的規(guī)范檢查,但每次都要手動(dòng)進(jìn)行檢查是在多余和無聊,那么我們?nèi)绾芜M(jìn)行實(shí)時(shí)的代碼檢查呢?本節(jié)將對(duì)此進(jìn)行介紹

  1. 打開 Android Studio -> Preferences -> Editor -> Code Style -> 點(diǎn)擊 Scheme右側(cè)按鈕 -> Import Scheme -> CheckStyle Configuration,選中我們的 google_checks.xml,點(diǎn)擊保存,后會(huì)告訴我們我們導(dǎo)入的配置名字為 Default Copy 詳見下圖
    Snip20180525_22.png
Snip20180525_23.png
  1. 我們將名字改成 MangoCheck,點(diǎn)擊保存,如下圖所示


    Snip20180525_24.png
  2. 打開我們的 Java 文件,可以看到在 AS 右側(cè)工具欄會(huì)看到幾個(gè)警告,光標(biāo)移動(dòng)上去之后就會(huì)出現(xiàn)格式錯(cuò)誤的說明,這就表明了我們現(xiàn)在可以實(shí)時(shí)檢測代碼規(guī)范了,詳見下圖


    Snip20180525_25.png
  3. 還記得我們?cè)趺锤袷交a嗎?沒錯(cuò),通過上面步驟的設(shè)置之后我們現(xiàn)在可以通過快捷鍵格式化代碼成我們規(guī)定的樣子了,在 Mac OS上快捷鍵是CMD + Alt + L,當(dāng)然這只能對(duì)縮進(jìn)和換行進(jìn)行格式化,像命名不符合規(guī)范之類的是做不到的。

警告經(jīng)常被忽略,只有錯(cuò)誤才醒目

相信我們?nèi)粘i_發(fā)中,不少小伙伴對(duì)于編譯器的警告都是不去處理的吧,所以我們要把警告變成錯(cuò)誤!

  1. 打開 google_checks.xml,將severity改成error,詳見下圖

    Snip20180525_27.png

  2. 我們?cè)诨氐轿覀兊?Java 文件中,可以看到拋出異常了,詳見下圖,紅色就顯得醒目了吧?


    Snip20180525_28.png

格式不符合規(guī)范就不給安裝

通過上面幾個(gè)小節(jié),我們已經(jīng)完成了格式實(shí)時(shí)檢測和快速修復(fù)了,而且我們還修改了格式報(bào)錯(cuò)的級(jí)別,變成 error,但其實(shí)這并不影響我們把有問題的代碼執(zhí)行并且安裝,所以這還是不夠的,接下來本節(jié)介紹一下如何讓格式不符合規(guī)范的代碼無法運(yùn)行。

  1. 將 google_checks.xml 中的severity改成error

  2. 配合Gradle,我們對(duì)app 下面的 build.gradle 進(jìn)行改造,代碼如下

apply plugin: 'checkstyle'
... 
task myCheckstyle(type: Checkstyle) {
    source 'src/main/java'
    ignoreFailures false //是否忽略失敗,默認(rèn)就是false,如果設(shè)置為 true,則就算有失敗也可以成功安裝
    include '**/*.java'
    classpath = files()
}

//必須指定 check 文件,和工具版本,工具版本記得用最高版本,否則可能無法解析某些 token
checkstyle {
    configFile rootProject.file('config/google_checks.xml')
    toolVersion = '8.10'
}

//check是一個(gè) Task,程序build 和 run 的時(shí)候會(huì)執(zhí)行該任務(wù),我們讓它依賴我們的 checkStyle Task,
//配合上面設(shè)置的報(bào)錯(cuò)級(jí)別為 error,即可實(shí)現(xiàn)有格式不符合規(guī)范就不給安裝的目的
check.dependsOn('myCheckstyle')
  1. 運(yùn)行程序,可以看到拋出錯(cuò)誤異常了,如下圖,并且告訴我們它把異常信息放在了工程的 build 目錄下


    圖片.png
  1. 如果出現(xiàn)異常,我們可以通過打開 build 下面那個(gè) html 去查看,更加省事的就是打開Android Studio 底部工具欄的 CheckStyle面板,運(yùn)行就是了。

如果有小伙伴不聽話咋辦

通過上面的幾個(gè)小節(jié),我們終于實(shí)現(xiàn)了不符合規(guī)范就不給運(yùn)行的目的,但是,但是如果有些 大佬 就是不遵循我們的協(xié)議咋辦?那么就給 svn、git 設(shè)置 pre_commit 的腳本吧,一旦發(fā)現(xiàn)提交的代碼不符合規(guī)范,就 refuse 便是。這里后面再展開,暫時(shí)沒時(shí)間去搞這個(gè)。


CheckStyle 和 Gradle 的配合使用是很強(qiáng)大的,上面的幾個(gè)小節(jié)只是列了一個(gè)完整的流程,其實(shí)還有很多細(xì)節(jié)可以私人訂制,有興趣的小伙伴可以自行上 Gradle 官網(wǎng)CheckStyle官網(wǎng)學(xué)習(xí)。

另外 阿里巴巴也提供了一個(gè)強(qiáng)大的Java 開發(fā)手冊(cè)及插件,感興趣的小伙伴可以去學(xué)習(xí)一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    wgl0419閱讀 6,575評(píng)論 1 9
  • 上周在微博上看到被安利的電視劇《荼蘼》,一看到說是《我可能不會(huì)愛你》的編劇的作品,瞬間就覺得非看不可了。而且豆瓣評(píng)...
    Jelly妮閱讀 467評(píng)論 0 2
  • 我喜歡站在任何一個(gè)地方,某一個(gè)角落,站著或蹲著,靜靜看一棵樹,在春,夏,秋,冬,重慶這個(gè)能把四個(gè)季節(jié)完美區(qū)分開的城...
    百匠閱讀 187評(píng)論 0 0
  • 一個(gè)函數(shù) , 使用外面的變量 , 就是閉包 .這個(gè)函數(shù)和變量共同叫做閉包 .閉包就是作用域的特殊使用方式
    饑人谷_hak閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容