參考:《app研發錄》
代碼是程式員的第二張臉。每一個程式員在嘲諷别人的代碼的同時,有沒有想過自己的代碼也會成為别人的談資呢?
制定規範不需要太多的理論知識,隻要記住兩點就夠了:盡量簡單,多寫注釋。
Android命名規範
命名規範有以下幾點需要注意:
-
命名不能反人類
例如:PersonActivityAddCustomer.java
所有的Activity全部是上述這種“子產品名+Activity+頁面名”的命名方式
-
要望文而知義,清晰準确
比如說登入頁面的登入按鈕,命名時就不要想button1這樣随心所欲,要類似于login_button(資源檔案)或btnLogin(java代碼中的按鈕執行個體)這樣命名。
- 此外,,遇到MyGridView之類的命名,就可以把建立檔案的同學拖出去打80大闆了,而且要肚皮朝上的那種打法。
具體的規則:
-
java類檔案命名的規則
Activity的命名:以Activity作為字尾。比如說PersonActivity
Adapter的命名:以Adapter作為字尾。比如說PersonAdapter
Entity的命名:大多以Entity作為字尾。比如說PersonEntity。值得注意的是,user是全局變量,不算實體,不受限制。
-
資源檔案命名規範
頁面布局檔案。注意都是小寫。person子產品下的AddCustomerActivity–>act_person_addcustomer.xml
ListView中的item布局檔案。以item_作為固定字首,清單項的名稱作為字尾。例如:某個頁面下有一個使用者清單,空間名為lvUserList–>item_lvuserlist.xml
Dialog布局檔案。以dlg_作為固定字首,Dialog的功能名作為字尾。例如:dlg_hint.xml
-
drawable目錄下檔案命名–大部分圖檔、xml檔案,用于selector
對于隻在一個頁面使用的資源,就以該頁面的名稱作為字首
對于隻在一個子產品下的多個頁面使用的資源,就以該子產品的名稱作為字首。
對于在各個子產品、各個頁面都有可能使用的資源,比如說上導航、下導航,以common作為字首
-
Java類中控件對象的命名
控件類縮寫+控件的邏輯名稱(首字母大寫),比如登入按鈕,就可以命名為btnLogin
-
Layout中控件的命名
btnLogin –> btn_login
-
string.xml中常量的命名
layout中的控件使用,以該常量所在activity名做字首,後面接控件名稱,在後面自由發揮。登入頁面的按鈕上顯示的文字–>loginActivity_btnLogin_text.
java代碼中使用,可能activity中也可能工具類Utils中,規則和上面一樣。如果涉及和公共子產品控件相關,就以common_作為字尾
strings.xml:可以按照子產品拆分成多個strings檔案
values
–>strings_module_a.xml
–>strings_module_b.xml
編譯打包時會自動将同類檔案進行合并。
好處:各個子產品維護各自的strings.xml。但常量命名時一定要以子產品名作為字首,不然容易産生重命名的情況,進而編譯出錯。
-
常量
包含字母和下劃線,單詞之間用下劃線_隔開,字母全部大寫
android編碼規範
- 要分門别類存放各種類
-
Layout中的常量,要在資源strings.xml中定義
要将“評論”這個常量定義在strings.xml中:
<resources> <string name="tvPersonCenter">評論</string> </resources>
然後在Layout布局檔案中@string/調用
Activity中的設定的一些變量,不能寫死,要定義在strings.xml中,然後從着資源檔案中取值
- Layout中所有控件的字型大小,都定義在dimens.xml中,它相當于網站的CSS樣式表
<?xml version="1.0" encoding="utf-8"?> <resouces> <!--定義字型--> <dimen name="font_size_tiny">10sp</dimen> <dimen name="font_size_samll">12sp</dimen> <dimen name="font_size_normal">140sp</dimen> <dimen name="font_size_normal_high">16sp</dimen> <dimen name="font_size_larger">18sp</dimen> <dimen name="font_size_larger_high">20sp</dimen> <dimen name="font_size_xlarger">22sp</dimen> <!--邊距--> <dimen name="offset_2dp">2dp</dimen> <dimen name="offset_4dp">4dp</dimen> <dimen name="offset_6dp">6dp</dimen> </resouces>
使用方法:
對于所有控件的Margin偏移量,也需要統一規格,如上面的dimens.xml中定義,有若幹尺寸事先定義好供選擇
好處:稍微修改一下dimens.xml中的定義,就可以批量修改樣式
做得更徹底,使用style來統一控件風格。如有必要,請用之
- 在activity中,定義新的生命周期,進而将onCreate方法拆分為一下3部分
- initVariables:初始化變量(包括Intent上的資料和Activity内部使用的變量)。
- initView:加載layout布局檔案,初始化控件。
- loadData:調用MobieAPI
-
堅持使用fastJson自定義實體來作為MobileAPI的資料載體
像JSONObject、JSONArray、HashMap<~,Objiect>、ArrayList<~,Objiect>這些不能序列化的實體,都禁止使用。除非它們僅僅是為了實作某個算法,在方法類部臨時使用。實體自動化工具EntityGenerator。
- 頁面之間傳值,堅持使用Intent攜帶序列化實體資料的方式。禁止為了省事使用全局變量進行傳值的方式。
- Activity中不要嵌套内部類,盡量獨立出來,該放哪兒放哪兒
- Adaper中的編碼規範如下
- 所有的Adaper,都放在adapter這個包中。
- Adapter綁定的資料,一律為ArrayList<自定義可序列化實體>
- 在Adapter中建立合适與清單自身的ViewHolder實體類。統一命名為ViewHolder
- 實體不要在不同子產品間共享,但是可以在同一子產品下的不同頁面間共享。比如說,不要在美食子產品和酒店子產品共用一個實體,但是在美食子產品的清單頁和詳情頁,可以共用同意個實體。
-
為節省記憶體,請使用ArrayList<自定以實體類>,而不是HashMap.
ArrayList雖然慢一點,每次查找一個元素,都是o(n),而HashMap則o(l),但是ArrayList在記憶體的使用上要少于HashMap.對于android手機,尤其是配置很低的手機,我們開發App政策是盡量不占太多記憶體,是以請選擇ArrayList<自定以實體類>。
- 圖檔的處理,請統一使用第三方元件ImageLoader或Fresco來進行異步加載。
- 什麼時候使用SharedPerferences?對于簡單的配置資訊,設定頁面的各種開關,這些都是要儲存在SharedPerferences中的。對于複雜的對象,比如說User類,比如說城市基礎資料,這些資料還是要存儲到本地檔案中。
- 盡量使用ApplicationContext代替Context,否則會引起記憶體洩漏。當然也不是任何地方ApplicationContext都可以代替Context。
- 資料類型轉換一定要進行校驗
- 使用常量代替枚舉。衆所周知,枚舉的每個值隻能是一個整數,而沒有toString這樣的方法,是以不如在類中定義一個字元串常量友善。