Android代碼規(guī)范,降低bug率

寫在開頭:本文的靈感來自loading大神的文章
http://www.androidchina.net/6552.html

diygreen大神的文章
http://www.reibang.com/p/0a984f999592#

集眾家之所長克饶,哈哈。

首先談?wù)劥a規(guī)范的重要性:團隊中每個人閱讀代碼都很容易眼滤,減少很多溝通,維護成本( 代碼閱讀的次數(shù)遠遠大于變更的次數(shù))庭敦,并且心情非常愉悅匿情。有人肯定覺得愉悅有點夸張,舉個栗子: 有一些代碼信殊,如果不是由于與工作內(nèi)容有關(guān)聯(lián)炬称,你是否有種這輩子都不情愿去接觸它的感受。但也有一些代碼涡拘,閱讀下來一氣呵成玲躯,心情舒暢,促使你有種繼續(xù)閱讀下去的沖動(并且你也會有種不想破壞這種統(tǒng)一的想法).

基礎(chǔ)層面越統(tǒng)一鳄乏,效率越高(不僅僅是指統(tǒng)一編碼規(guī)范跷车,還有基本的做事的原則). 舉個栗子: 我們團隊規(guī)定個人周報必須在每周五上班前必須發(fā)出來,否則罰款10元汞窗。之前團隊周報遲發(fā)現(xiàn)象比較突出姓赤,規(guī)則一出赡译,明顯改善(開會缺席情況也一樣得到明顯改 善)仲吏。罰錢是否不太合理?注釋寫多少才算合理蝌焚?與其花大量精力討論這些不痛不癢的問題裹唆,不如及時統(tǒng)一規(guī)范(一般制定的規(guī)范不會差的),嚴格執(zhí)行只洒。后續(xù)針對 問題即使做調(diào)整。關(guān)鍵是統(tǒng)一和嚴格執(zhí)行。

1.能1行解決就不要寫2行(不影響可讀性的情況下)腻异。

2.多余的代碼(比如注釋代碼 or 無實際意義)必須刪除庭惜。

3.codereview代碼評審。
codereview出來的問題一旦得出結(jié)論涝开,就會立馬執(zhí)行循帐。如果有疑義,可以繼續(xù)討論舀武,一直到得出結(jié)論為止拄养。規(guī)范中的內(nèi)容可以改進,但一旦形成規(guī)范就必須嚴格執(zhí)行银舱。

4.單元測試一定要寫, 這是底線(除非這個成本非常大)

5.周四盡量減少發(fā)布, 你可能沒有足夠時間去觀察/驗證,發(fā)布時尤其需要重視.

6.每周五 review當周的問題

7.接下來寫具體的代碼開發(fā)規(guī)范.


一瘪匿、變量聲明、注釋等規(guī)范
1.類名區(qū)分大小寫寻馏。

2.使用注釋將源文件分為明顯的區(qū)塊棋弥,區(qū)塊劃分如下

常量聲明區(qū)
UI控件成員變量聲明區(qū)
普通成員變量聲明區(qū)
內(nèi)部接口聲明區(qū)
初始化相關(guān)方法區(qū)
事件響應(yīng)方法區(qū)
普通邏輯方法區(qū)
重載的邏輯方法區(qū)
發(fā)起異步任務(wù)方法區(qū)
異步任務(wù)回調(diào)方法區(qū)
生命周期回調(diào)方法區(qū)(出去onCreate()方法)
內(nèi)部類聲明區(qū)

3.類成員排列通用規(guī)則

按照發(fā)生的先后順序排列
常量按照使用先后排列
UI控件成員變量按照layout文件中的先后順序排列
普通成員變量按照使用的先后順序排列
方法基本上都按照調(diào)用的先后順序在各自區(qū)塊中排列
相關(guān)功能作為小區(qū)塊放在一起(或者封裝掉)

4.重載方法不分離。當一個類有多個構(gòu)造函數(shù)诚欠,或是多個同名方法嘁锯,這些函數(shù)/方法應(yīng)該按順序出現(xiàn)在一起宪祥,中間不要放進其它函數(shù)/方法。

5.聲名數(shù)組等變量
中括號是類型的一部分:String[] args家乘, 而非 String args[]蝗羊。

6.switch塊必須包括default,即使什么處理都不做

switch (msg.what) {
               case 1:
                   //doSomething
                   break;
               case 2:
                  //doSomething
                   break;  
               default:
                   break;
           }

7.代碼注釋仁锯,成員變量耀找、類對象、layout對象业崖、方法等統(tǒng)一采用以下樣式

/**
 * 
 */

方法內(nèi)部的每一行的代碼注釋用一下樣式:

//代碼行的注釋

二野芒、命名規(guī)范
1.包名
采用反域名規(guī)則,一級包名為com双炕,二級包名為公司名或者個人名狞悲,三級包名為項目名,四級包名為具體模塊名(也可以省略二級包名)妇斤,舉個栗子:com.ssb.shangshaban.activity
2.類名
采用大駝峰法摇锋,盡量避免縮寫,除非該縮寫是眾所周知的站超, 比如HTML,URL荸恕,如果類名稱中包含單詞縮寫,則單詞縮寫的每個字母均應(yīng)大寫死相,舉個栗子:

WelcomeActivity.java
LogUtil.java
MyDBHelper.java

3.方法名
采用小駝峰法融求,方法名一般都是動詞或者動詞短語,舉個栗子:

initData()
getUserData()
save()

4.常量名
全部字母大寫算撮,用下劃線分隔單詞生宛,常量通常是static final的,舉個栗子:

static final int NUMBER = 5;
static final ImmutableListNAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

5.非常量字段名(略微復(fù)雜)肮柜,直接舉個栗子:

public class MyClass {  
        public static final int SOME_CONSTANT = 42;  //常量大寫
        public int pField;  //公有非靜態(tài)字段p開頭
        private static MyClass sSingleton;  //非公有靜態(tài)字段s開頭
        public static int gField; //公有靜態(tài)字段g開頭
        int mPackagePrivate;  //非公有非靜態(tài)m開頭
        private int mPrivate;  //非公有非靜態(tài)m開頭
        protected int mProtected; //非公有非靜態(tài)m開頭
        
 }

也有例外陷舅,如果項目中使用ButterKnife,則不添加m前綴素挽,以小駝峰風(fēng)格命名蔑赘。

例如,請使用 mCustomerStrFirst 和 mCustomerStrLast预明,而不要使用mFirstCustomerStr和mLastCustomerStr缩赛。
量詞列表:量詞后綴說明
First 一組變量中的第一個
Last 一組變量中的最后一個
Next 一組變量中的下一個變量
Prev 一組變量中的上一個
Cur 一組變量中的當前變量。


6.參數(shù)名
采用小駝峰法

7.資源文件命名
7.1資源布局文件:
全部小寫撰糠,采用下劃線命名法

  1. contentview 命名
    必須以全部單詞小寫酥馍,單詞間以下劃線分割,使用名詞或名詞詞組阅酪。
    所有Activity或Fragment的contentView必須與其類名對應(yīng)旨袒,對應(yīng)規(guī)則為:
    將所有字母都轉(zhuǎn)為小寫汁针,將類型和功能調(diào)換(也就是后綴變前綴)。
例如:activity_main.xml
  1. Dialog命名:dialog_描述.xml
例如:dialog_hint.xml
  1. PopupWindow命名:ppw_描述.xml
例如:ppw_info.xml
  1. 列表項命名:item_描述.xml
例如:item_city.xml
  1. 包含項命名:模塊_(位置)描述.xml
例如:activity_main_head.xml砚尽、activity_main_bottom.xml

注意:通用的包含項命名采用:項目名稱縮寫_描述.xml

例如:xxxx_title.xml

7.2資源文件
全部小寫施无,采用下劃線命名法,加前綴區(qū)分
命名模式:可加后綴 small 表示小圖, big 表示大圖必孤,邏輯名稱可由多個單詞加下劃線組成猾骡,采用以下規(guī)則:
用途
模塊名
邏輯名稱
用途模塊名顏色
用途邏輯名稱
用途
顏色
說明:用途也指控件類型(具體見UI控件縮寫表)
例如:
btn_main_home.png 按鍵
divider_maket_white.png 分割線
ic_edit.png 圖標
bg_main.png 背景
btn_red.png 紅色按鍵
btn_red_big.png 紅色大按鍵
ic_head_small.png 小頭像
bg_input.png 輸入框背景
divider_white.png 白色分割線
如果有多種形態(tài)如按鈕等除外如 btn_xx.xml(selector)

名稱 功能
btn_xx 按鈕圖片使用btn_整體效果(selector)
btn_xx_normal 按鈕圖片使用btn_正常情況效果
btn_xx_pressed 按鈕圖片使用btn_點擊時候效果
btn_xx_focused state_focused聚焦效果
btn_xx_disabled state_enabled (false)不可用效果
btn_xx_checked state_checked選中效果
btn_xx_selected state_selected選中效果
btn_xx_hovered state_hovered懸停效果
btn_xx_checkable state_checkable可選效果
btn_xx_activated state_activated激活的
btn_xx_windowfocused state_window_focused
bg_head 背景圖片使用bg_功能說明
def_search_cell 默認圖片使用def
功能說明
ic_more_help 圖標圖片使用ic
功能說明
seg_list_line 具有分隔特征的圖片使用seg
功能說明
sel_ok 選擇圖標使用sel
功能_說明
注意:
使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要規(guī)范敷搪。

7.3動畫文件(anim文件夾下):

  1. 動畫文件(anim文件夾下):
    全部小寫兴想,采用下劃線命名法,加前綴區(qū)分赡勘。
    具體動畫采用以下規(guī)則:
    模塊名_邏輯名稱
    邏輯名稱
    refresh_progress.xml
    market_cart_add.xml
    market_cart_remove.xml
    普通的tween動畫采用如下表格中的命名方式
    // 前面為動畫的類型嫂便,后面為方向

動畫命名例子 規(guī)范寫法
fade_in 淡入
fade_out 淡出
push_down_in 從下方推入
push_down_out 從下方推出
push_left 推向左方
slide_in_from_top 從頭部滑動進入
zoom_enter 變形進入
slide_in 滑動進入
shrink_to_middle 中間縮小

7.4values中name命名
類別 命名 示例
strings strings的name命名使用下劃線命名法,采用以下規(guī)則:
模塊名+邏輯名稱

main_menu_about 主菜單按鍵文字
friend_title 好友模塊標題欄

friend_dialog_del 好友刪除提示

login_check_email 登錄驗證

dialog_title 彈出框標題

button_ok 確認鍵 loading 加載文字

colors colors的name命名使用下劃線命名法闸与,采用以下規(guī)則:
模塊名+邏輯名稱 顏色

friend_info_bg friend_bg transparent gray
styles styles的name命名使用 Camel命名法毙替,采用以下規(guī)則:模塊名+邏輯名稱 main_tabBottom
7.5layout中的id命名
命名模式為:view縮寫_view的邏輯名稱
使用 AndroidStudio 的插件 ButterKnife Zelezny,生成注解非常方便几迄。
如果不使用 ButterKnife Zelezny蔚龙,則建議使用 view 縮寫做后綴冰评,如:username_tv(展示用戶名的TextView)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末映胁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甲雅,更是在濱河造成了極大的恐慌解孙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抛人,死亡現(xiàn)場離奇詭異弛姜,居然都是意外死亡,警方通過查閱死者的電腦和手機妖枚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門廷臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绝页,你說我怎么就攤上這事荠商。” “怎么了续誉?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵莱没,是天一觀的道長。 經(jīng)常有香客問我酷鸦,道長饰躲,這世上最難降的妖魔是什么牙咏? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嘹裂,結(jié)果婚禮上妄壶,老公的妹妹穿的比我還像新娘。我一直安慰自己寄狼,他們只是感情好盯拱,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著例嘱,像睡著了一般狡逢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拼卵,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天奢浑,我揣著相機與錄音,去河邊找鬼腋腮。 笑死雀彼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的即寡。 我是一名探鬼主播徊哑,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聪富!你這毒婦竟也來了莺丑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墩蔓,失蹤者是張志新(化名)和其女友劉穎梢莽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸披,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡昏名,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阵面。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻局。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖样刷,靈堂內(nèi)的尸體忽然破棺而出仑扑,到底是詐尸還是另有隱情,我是刑警寧澤颂斜,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布夫壁,位于F島的核電站,受9級特大地震影響沃疮,放射性物質(zhì)發(fā)生泄漏盒让。R本人自食惡果不足惜梅肤,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邑茄。 院中可真熱鬧姨蝴,春花似錦、人聲如沸肺缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同木。三九已至浮梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彤路,已是汗流浹背秕硝。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洲尊,地道東北人远豺。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像坞嘀,于是被迫代替她去往敵國和親躯护。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容