原文:http://android.jobbole.com/83659/
編碼規范對于程序員尤為重要,可以有效的幫助我們進行code review,提高代碼的可讀性,讓其他人更快更徹底的理解代碼。
一個軟件的生命周期中,80%的花費都在于維護以及新功能的迭代,很多的時候都需要閱讀代碼,讀自己以前寫的代碼,讀別人寫的代碼,這樣規范的代碼優勢就顯示出來了,符合規范的代碼可以讓人簡單快速的理解理解代碼的意圖。
代碼規范先從命名規范開始,Android的命名規范主要涉及:Java源代碼,xml文件,圖片資源。
包名
首先說下Android包名的命名規則。
Andorid的包名一般采用域名的反轉,單詞全小寫。域名為www.example.com
的包名為com.example,省略www。
包名的開始是一個頂級域名,比如com,cn,org等,包名使用.做為分隔符。第二位一般是二級域名,也可以根據不同機構各自的命名。后面的命名可以用部門,項目等進行區分(也可以沒有),例如:
com.example.project
在項目內可以根據功能不同,按照模塊劃分不同的包名,com.example.project.user
就是表示用戶模塊。
也可以根據層級的不同而劃分不同的包名,比如:com.example.prokect.activity
,就是Acitivity相關的包。
當然也可以在不同層級里面再按照模塊劃分包名,比如:com.example.project.activity.user
,表示和用戶有關的****Activity****。
總結,包名一般是以反轉域名開始,后面跟有項目名稱(縮寫,也可以沒有)。
后面可以采用的區分包名方式:
- 按照模塊 com.example.project.user
- 按照層級區分 com.example.project.activity
- 層級下也可以在區分模塊 com.example.project.activity.user
類和接口
類名是一個或多個單詞組成,采用大駝峰命名,盡量要使類名簡潔且利于描述,例如:SignInActivity,類名規則如下:
- 大駝峰命名
- 簡潔而富有表達性
- 盡量不使用縮寫(廣泛使用的單詞除外,比如URL,XML…)
- 多單詞中采用 名詞+動詞的方式命名: LocationManage
對于縮寫單詞要全部大寫比如:XMLManage
一個類如果繼承了Android的組件,需在使用該組件的名稱作為后綴,這樣容易區分該類的作用,比如: SgnInActivity,UserInfoFragment,FileUploadService…
接口一般使用****I****開頭,采用大駝峰命名規則,比如:IPullToRefresh。
變量
Android變量分為三種:成員變量,靜態變量和常量。
成員變量
成員變量采用小駝峰命名規則,第一單詞的首字母小寫,其后的首字母大寫。變量名一般不使用_和$開頭。例如:
private Intent cropIntent;
變量名應簡短且易于描述,選用規則盡量簡單,易于記憶和聯想。
盡量避免單個字符的變量名,除非是用于一次性的臨時變量,臨時的整形變量一般命名為 i,j,k,m,n。字符型的變量一般使用c,d,e。
對于View
變量的命名規則,如果View
是一個單詞的,采用第一個單詞小寫的方式+對應View的描述進行,例如:
private View viewUserInfo;
如果是兩個單詞組成的View,比如:TextView,一般采用縮寫的方式,例如:
private TextView tvUserName;一般情況下Button縮寫為:btn。
靜態變量
為了可以很方便的區分靜態變量,靜態變量的命名一般采用小寫的s開頭,后面單詞的命名規則和成員變量保持一致,例如:
private static Map<String, String> sCacheStrings;
常量
常量命名規則一般是所有的單詞都是大寫,中間使用_(下劃線)分割,例如:
private static final float SCALE_RATE = 1.25f;
代碼中不允許出現單獨的字符串或數字常量,比如xx.equals("1") ,單獨的字符串或數字不利于后期的維護。如果需要使用數據或字符,請按照他們的含義封裝成靜態常量,或者使用枚舉,for語句除外。
方法
方法命名規則采用小駝峰命名法例如:onCreate(),onRun(),方法名一般采用動詞或者動名詞。一般使用的方法名前綴。
- getXX()返回某個值的方法
- initXX() 初始化相關方法,比如初始化布局:initView()
- checkXX()和isXX() 方法為boolean值的時候使用is或者check為前綴
- saveXX() 保存數據
- clearXX()和removeXX() 清除數據
- updateXX() 更新數據
- processXX() 對數據進行處理
- dispalyXX() 顯示某某信息
- draswXX() 繪制數據或者效果
另外對于方法的其他一些規范:
- 方法的參數盡可能不超過4個,需要更多的參數的時候可以采用class的方法
- 方法參數中盡量少使用boolean,使用boolean傳參不利于代碼的閱讀
- 方法盡量不超過15行,方法過長,說明當前方法業務邏輯過于復雜,需要進行方法拆分一個方法只做一件事,
- 如果一個方法返回的是一個錯誤碼,可以使用異常
- 不使用try catch 處理業務邏輯
- 盡可能不實用null,替代為異常或者使用空的變量,比如Collections.emptyList()
Layout
Layout的命名規則需要和使用他們的組件對應,方便查找和維護,比如我們在創建一個用戶信息的UserInfoActivity,對應的Layout的命名就應該是activity_user_info.xml
。
對應Andorid組件的Layout 命名規則:
- Activity -> activity_user_info.xml
- Fragment -> fragment_sign_up.xml
- Dialog -> dialog_change_password.xml
- AdapterView Item -> item_user.xml
- Layout只是一部分 -> partial_stats_bar.xml
string和color
項目中使用的string,和color的值原則上都是必須放在strings.xml
和colors.xml
中,不要放在Java代碼中,這樣的好處是可復用,提高維護性,減少非必要的代碼。
xml
的資源命名,字母全部小寫,多個單詞之間使用_(下劃線)分割.比如:
example
建議color的命名中體現其ARGB
值,比如:
feb749這樣的寫法對于代碼提示更加的友好,有利于對照標注圖查找顏色值。
id命名
layout中使用的id 的單詞要全部小寫,單詞之間使用下劃線分割,使用名詞或者名詞詞組,應該通過id的命名可以直接理解當前的View 要實現的功能.
例如:
@+id/tv_user_name_show
id命名的第一個單詞使用View的縮寫,如果View只是一個單詞,縮寫就是當前單詞。一般Button的縮寫為:****btn****。
Drawable命名
Drawable的命名規則根據使用的控件來命名,控件的縮寫在前面,后面使用表示其功能的一個或者多個單詞,中間使用使用_下劃線分割。
- ****Action bar****使用ab_ ,比如:ab_stacked.png
- ****Button**** 使用btn_
- ****Dialgo**** 使用dialog_
- ****Divide**** 使用 divider_
- ****Icon**** 使用 ic_
- ****Menu**** 使用menu_
- ****Notification****使用 notification_
- ****Tabs**** 使用tab_
Drawable是有多個狀態的,在命名中體現出狀態的不同:
- ****Normal**** 對應_normal結尾,比如btn_order_normal.9.png
- ****Pressed**** 對應_pressed 結尾
- ****Focused**** 對應_focused 結尾
- ****Disabled**** 對應_disabled結尾
- ****Selected**** 對應_selected結尾
其他資源文件的命名需要遵守Android的規范即可,比如arrays.xml數組文件,dimens.xml分辨的配置,style.xml樣式的配置,資源文件的ID命名規則都是才是字母小寫,使用下劃線分割的原則。
參考:https://github.com/ribot/android-guidelines/blob/master/project_and_code_guidelines.mdhttp://source.android.com/source/code-style.htmlhttps://google.github.io/styleguide/javaguide.html