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