圖解 Android Studio 技巧 | 玩轉(zhuǎn) TODO 及自定義 TODO
轉(zhuǎn)載:Android進(jìn)階之旅
在開(kāi)始之前,我們先來(lái)看看開(kāi)發(fā)過(guò)程中,面對(duì)以前寫(xiě)的代碼常會(huì)碰到的問(wèn)題:
這塊代碼好幾次用到了,應(yīng)該抽出去;
這個(gè)算法可以換個(gè)更高效的寫(xiě)法;
這段邏輯繞來(lái)繞去,其實(shí)可以換個(gè)思路。
……
相信許多人都遇到過(guò)這些情況,那么,此時(shí)我們?cè)撛趺醋瞿兀?/p>
呵,這還用問(wèn)?
重復(fù)代碼? 順手就抽出去了;
算法效率堪憂(yōu)? 你倒是優(yōu)化啊;
邏輯不清晰? 還不趕緊重構(gòu),等啥。
如果你是這么想的,我覺(jué)得你肯定是沒(méi)體驗(yàn)過(guò)牽一發(fā)而動(dòng)全身的感覺(jué)(除非有足夠完善的單元測(cè)試),因?yàn)檫@么做不僅容易引發(fā)不可預(yù)知的 bug,同時(shí)很有可能導(dǎo)致項(xiàng)目 delay。
要知道,大多數(shù)公司的開(kāi)發(fā)周期都很緊,我們應(yīng)該沿著主線(xiàn)任務(wù)推進(jìn),先保證新的需求實(shí)現(xiàn)了,主要功能能夠 work 并自測(cè)通過(guò)了,時(shí)間富余的情況下再去想著優(yōu)化或者重構(gòu)代碼。
你表示不服:說(shuō)的倒好,時(shí)間富余再去優(yōu)化。那要沒(méi)有富余時(shí)間呢,就不優(yōu)化了?不能這么說(shuō),如果按照我說(shuō)的先實(shí)現(xiàn)新需求、自測(cè),再優(yōu)化的步驟,你沒(méi)有富余時(shí)間去優(yōu)化,說(shuō)明啥?說(shuō)明開(kāi)發(fā)時(shí)間正好夠我們新增需求,那你要是在開(kāi)發(fā)過(guò)程中提前去干了優(yōu)化的事,那需求還能做完嗎?
所以我們要搞清楚,對(duì)于這些問(wèn)題,應(yīng)該先標(biāo)記著,等主線(xiàn)任務(wù)開(kāi)發(fā)完了,再去優(yōu)化。而不是擼起袖子就整,整不好就沒(méi)法收尾,甚至引發(fā)其它問(wèn)題,我是認(rèn)真的(有經(jīng)驗(yàn)的過(guò)來(lái)人自然懂)。
這里提到的標(biāo)記著以后再做,就涉及到我們今天要說(shuō)的 TODO 的概念。說(shuō)了半天還沒(méi)開(kāi)始,且息怒,之所以先鋪墊,是想讓一些沒(méi)有接觸過(guò)、或者剛接觸實(shí)際開(kāi)發(fā)項(xiàng)目的同學(xué),明白為什么要像下文那么做。
一
TODO 簡(jiǎn)介
大家應(yīng)該都用過(guò)記事或備忘軟件,或者是番茄記事之類(lèi)的,一般這種軟件都有一個(gè)功能叫 “TODO List”,也就是待做清單。
我們?cè)谌粘I钪校?jīng)常想起來(lái)要做一件事,但手頭正忙來(lái)不及做,就會(huì)先記在 “TODO List” 中,等忙完手頭的事或有時(shí)間了就去做。
開(kāi)發(fā)中也是這樣,遇到像上面那些問(wèn)題,我們應(yīng)該先記下來(lái):
重復(fù)代碼? 先標(biāo)記上,回頭抽出去;
算法效率堪憂(yōu)? 先標(biāo)記上,回頭優(yōu)化;
邏輯不清晰? 先標(biāo)記上,回頭重構(gòu)。
這里說(shuō)的標(biāo)記,并不是在記事軟件上記下來(lái):標(biāo)注上要做什么,在哪個(gè)類(lèi)哪一行,這太扯了。而是利用 Android Studio 提供的 TODO 功能來(lái)實(shí)現(xiàn)這一需求。
二
Android Studio TODO 用法
在 Android Studio 中,支持通過(guò) TODO 在代碼中插入標(biāo)記,其本質(zhì)上就是特殊的注釋。只不過(guò) TODO 注釋能夠在 Android Studio 提供的 TODO 視圖窗口中查看并快速定位。
1. 添加 TODO
很簡(jiǎn)單,直接上圖:
當(dāng)然,你也可以在方法內(nèi)部對(duì)某一行代碼添加 TODO。
2. 查看 TODO
在 Android Studio 右下角中有一個(gè) TODO tab,點(diǎn)擊即可打開(kāi) TODO 視圖,來(lái)查看項(xiàng)目中標(biāo)記的 TODO:
如果沒(méi)有 TODO tab,你可以通過(guò)左上角的菜單打開(kāi),View -> Tool windows -> TODO:
3. 完成并刪除 TODO
完成 TODO 標(biāo)記的事件后,就可以刪除該 TODO 注釋。 理想狀態(tài)下,我們應(yīng)該在每一版本發(fā)版前,完成所有 TODO,以保持 TODO 視圖中沒(méi)有遺留的事項(xiàng),注意是理想狀態(tài)…
三
Android Studio FIXME 用法
除了 TODO 標(biāo)記,我們還可以使用 Android Studio 提供的 FIXME 來(lái)標(biāo)記一些待修復(fù)的問(wèn)題,F(xiàn)IXME 與 TODO 在本質(zhì)上沒(méi)有任何區(qū)別,只是不同的標(biāo)記罷了。區(qū)別于 TODO 標(biāo)記,F(xiàn)IXME 可以認(rèn)為是偏向于標(biāo)記存在問(wèn)題的 TODO 事項(xiàng)。
一句話(huà)弄清二者區(qū)別: TODO 是總稱(chēng),F(xiàn)IXME 是細(xì)分。
1. 添加 FIXME
其用法同 TODO,添加時(shí)如下:
然后同樣在 TODO 視圖中可以看到:
2. 篩選 FIXME
當(dāng)項(xiàng)目中 TODO 和 FIXME 較多且混在一起時(shí),找起來(lái)可就比較費(fèi)盡了,此時(shí)我們可以使用 “過(guò)濾” 功能來(lái)區(qū)分開(kāi) TODO 和 FIXME。
首先,添加過(guò)濾 FIXME 的條件,點(diǎn)擊 TODO 窗口左側(cè)的漏斗,選擇 Edit Filters,按照?qǐng)D示添加 FIXME 過(guò)濾條件:
添加完畢后,再次點(diǎn)擊漏斗,選擇剛才添加的 FIXME 過(guò)濾條件,在 TODO 視圖中將只會(huì)看到 FIXME 標(biāo)記的 TDOO 事項(xiàng):
最后,就是解決 FIXME 并刪除了,不再贅述。
四
自定義 TODO
一般我們習(xí)慣于直接用 TODO 來(lái)標(biāo)記所有待辦事項(xiàng),但上面說(shuō)了 TODO 是總稱(chēng),比較廣義,當(dāng)項(xiàng)目中有大量 TODO 時(shí),你就會(huì)發(fā)現(xiàn)無(wú)法快速定位要找的 TODO,或者無(wú)法區(qū)分該 TODO 到底屬于哪種類(lèi)型(雖然可以添加描述,但這個(gè)描述的作用太弱了,無(wú)法篩選)。
比如,在開(kāi)發(fā)過(guò)程中,我們經(jīng)常發(fā)現(xiàn)一些遺留代碼可以重構(gòu),此時(shí)我們不可能立即著手去做,應(yīng)該通過(guò) TODO 去標(biāo)記:
// TODO: 2017/5/1 待重構(gòu)
但是,這樣的 TODO 不容易識(shí)別,也無(wú)法篩選,后期只能通過(guò)附加的描述 “待重構(gòu)” 去辨識(shí),效率太低。此時(shí),按照 FIXME 是 TODO 的細(xì)分的邏輯,我們不禁會(huì)問(wèn):
是不是可以自定義一個(gè)細(xì)分 TODO ,來(lái)標(biāo)記重構(gòu)呢?
答案是肯定的。
1. 自定義 TODO: REFACTOR
其實(shí),TODO 的本質(zhì)就是滿(mǎn)足特定正則的注釋?zhuān)@樣說(shuō)就好理解了。
通過(guò)右上角的菜單, File -> Settings -> Editor -> TODO 打開(kāi) TODO 設(shè)置面板,點(diǎn)擊右上方的 "+" 添加一個(gè)正則,如圖:
在 Pattern 中輸入正則表達(dá)式 \brefactor\b.*,然后選擇一個(gè) Icon(可選),點(diǎn)擊 OK 關(guān)閉添加面板,再次點(diǎn)擊 OK 應(yīng)用并關(guān)閉設(shè)置面板。
添加完 REFACTOR 類(lèi)型的 TODO 之后,你迫不及待想試試,但發(fā)現(xiàn)不管怎樣系統(tǒng)都沒(méi)有智能提示以補(bǔ)全代碼,心想我在坑你。其實(shí)不然,要知道 TODO 標(biāo)記 和 智能提示 是兩碼事。
你添加了一個(gè)自定義的 TODO 正則,系統(tǒng)匹配后將其視為 TODO,在代碼中高亮并顯示在 TODO 視圖中;而智能提示和自動(dòng)補(bǔ)齊是 代碼模版 的功能。不是一回事,能理解吧?
你在代碼中純手敲一個(gè) REFACTOR 的 TODO 也不是不可以,系統(tǒng)能識(shí)別,只不過(guò)這樣效率太低了。
// TODO: 2017/5/1 待重構(gòu)
下面,跟隨我一起添加一個(gè) REFACTOR 的代碼模版吧。
2. 添加 REFACTOR 代碼模版
通過(guò)右上角的菜單, File -> Settings -> Editor -> Live Templates 打開(kāi)代碼模版設(shè)置頁(yè)面,找到 AndroidComments 并展開(kāi),你會(huì)發(fā)現(xiàn)熟悉的 fixme 和 todo,我們就仿著它們添加我們的代碼模版。不了解的同學(xué)可以點(diǎn)擊右下角 Help 簡(jiǎn)單學(xué)習(xí)下,不影響理解后面的教程。
首先,點(diǎn)中 AndroidComments,點(diǎn)擊右上角 ”+“,選擇 Live Template :
然后,在下方出現(xiàn)的面板中填上對(duì)應(yīng)內(nèi)容,分別是:縮寫(xiě)、描述、模版文本。
縮寫(xiě):我們?cè)诖a中敲對(duì)應(yīng)縮寫(xiě),就會(huì)出現(xiàn)智能提示;
描述:智能提示時(shí)的描述;
模版文本:縮寫(xiě)對(duì)應(yīng)的補(bǔ)齊后的文本(不局限于代碼),在這可以聲明變量;
此處我填寫(xiě)內(nèi)容如下:
如圖,在 模版文本 中,我使用 data 聲明了日期變量,使用 todo 聲明了描述代辦的變量,變量是用來(lái)占位的。那這兩個(gè)變量到底如何賦值呢?
注意右側(cè)的 Edit variables,即編輯變量。點(diǎn)擊該按鈕,打開(kāi) “Edit Template Variables” 面板。表格中,四列分別對(duì)應(yīng)為:變量名稱(chēng)、表達(dá)式、默認(rèn)值、如果已定義則跳過(guò)。
具體的使用方法,同樣可點(diǎn)擊右下角的 Help 看一下,這不是本文的重點(diǎn)。看看我最后設(shè)置的值:
此處,我將 date 變量的表達(dá)式設(shè)為 date(),系統(tǒng)將會(huì)使用當(dāng)前日期來(lái)填補(bǔ)該變量的占位,并勾選 “跳過(guò)” 選項(xiàng),表示有值的話(huà)就不再自己編輯。
同時(shí),對(duì)于 todo 變量,是用來(lái)添加描述的,無(wú)法使用固定表達(dá)式賦值,所以我選擇了賦予默認(rèn)值 “待重構(gòu)”,并且沒(méi)有勾選 “ 跳過(guò)”。這樣的話(huà),系統(tǒng)會(huì)默認(rèn)為我賦值 “待重構(gòu)”,但我的光標(biāo)還會(huì)定在那兒:我可以選擇繼續(xù)編輯,或者回車(chē)使用默認(rèn)值。這塊不好理解的話(huà)一會(huì)看后面的 gif 動(dòng)圖,就明白了。
編輯變量后,點(diǎn)擊 OK 返回上一頁(yè),最后還需要定義該模版運(yùn)用的上下文,也就是在哪些地方可以通過(guò)縮寫(xiě)調(diào)出代碼模版。
在界面下方,有一段文本:No applicable contexs yet. 后面跟著一個(gè) Define,點(diǎn)擊就會(huì)彈出模版運(yùn)用上下文的列表。我們一般是在 Java 代碼中添加 REFACTOR TODO,所以全選 Java,當(dāng)然你也可以按需選擇。
最后,最后,最后勾選右側(cè)的 Refactor according to style,表示自動(dòng)格式化代碼(調(diào)整對(duì)齊、縮進(jìn)等),最終效果是這樣的:
點(diǎn)擊右下角 OK,運(yùn)用該模版并退出。
3. 在代碼中使用 REFACTOR TODO
至此,萬(wàn)事俱備,只欠東風(fēng)。在需要添加重構(gòu)標(biāo)識(shí)的地方,輸入 refactor,輸入過(guò)程中,智能提示就出來(lái)了,回車(chē)確認(rèn)即可。
下面看演示,我輸入慢點(diǎn),注意看上面提到的 默認(rèn)值和跳過(guò) 選項(xiàng),在代碼補(bǔ)齊時(shí)對(duì) 日期和描述 的影響:
區(qū)別于之前的 todo 和 fixme,自動(dòng)補(bǔ)齊時(shí)加上了默認(rèn)描述 ”待重構(gòu)”,你可以繼續(xù)輸入覆蓋,或者直接回車(chē)確認(rèn)。
和 TODO、FIXME 一樣,代碼高亮并出現(xiàn)在 TODO 視圖中:
同樣,你可以像過(guò)濾 FIXME 一樣來(lái)過(guò)濾 REFACTOR,不再貼圖演示。
五
總 結(jié)
我們從系統(tǒng) TODO 開(kāi)始,分析了 FIXME 與 TODO 的關(guān)系,進(jìn)而想出自定義 TODO,即 REFACTOR。而自定義的 REFACTOR 除了要遵循 TODO 規(guī)則外,為了便于使用,我們需要添加 Live Template 以支持智能提示。
本人會(huì)繼續(xù)收集更多干貨