Android技術(shù)積累:開(kāi)發(fā)規(guī)范

作者:Keegan小鋼
原文地址:http://keeganlee.me/post/android/20150709

上個(gè)月發(fā)布了Android項(xiàng)目重構(gòu)的三篇系列文章,其中,界面篇中提到了在項(xiàng)目中保持規(guī)范性的重要性,也有簡(jiǎn)單舉了幾個(gè)例子。這篇文章則將其延伸,提供更完整的開(kāi)發(fā)規(guī)范說(shuō)明。

書(shū)寫(xiě)規(guī)范

1.編碼方式統(tǒng)一用UTF-8. Android Studio默認(rèn)已是UTF-8,只要不去改動(dòng)它就可以了。

2.縮進(jìn)統(tǒng)一為4個(gè)空格,將Tab size設(shè)置為4則可以保證tab鍵按4個(gè)空格縮進(jìn)。另外,不要勾選上Use tab character,可以保證切換到不同tab長(zhǎng)度的環(huán)境時(shí)還能繼續(xù)保持統(tǒng)一的4個(gè)空格的縮進(jìn)樣式。

3.花括號(hào)不要單獨(dú)一行,和它前面的代碼同一行。而且,花括號(hào)與前面的代碼之間用一個(gè)空格隔開(kāi)。

public void method() { // Good 

} 

public void method()
{ // Bad
}  

public void method(){ // Bad

} 

4.空格的使用

// Good
if (booleanVariable) {
    // TODO while booleanVariable is true
} else {
    // TODO else
}

// Bad
if(booleanVariable) {
    // TODO while booleanVariable is true
}else {
    // TODO else
}

運(yùn)算符兩邊各用一個(gè)空格隔開(kāi)。

int result = a + b; //Good, = 和 + 兩邊各用一個(gè)空格隔開(kāi)
int result=a+b; //Bad,=和+兩邊沒(méi)用空格隔開(kāi)

方法的每個(gè)參數(shù)之間用一個(gè)空格隔開(kāi)。

public void method(String param1, String param2); // Good,param1后面的逗號(hào)與String之間隔了一個(gè)空格
method(param1, param2); // Good,方法調(diào)用時(shí),param1后面的逗號(hào)與param2之間隔了一個(gè)空格
method(param1,param2); // Bad,沒(méi)有用一個(gè)空格隔開(kāi)

5.空行的使用

將邏輯相關(guān)的代碼段用空行隔開(kāi),以提高可讀性。空行也只空一行,不要空多行。在以下情況需用一個(gè)空行:

  • 兩個(gè)方法之間
  • 方法內(nèi)的兩個(gè)邏輯段之間
  • 方法內(nèi)的局部變量和方法的第一條邏輯語(yǔ)句之間
  • 常量和變量之間

6.當(dāng)一個(gè)表達(dá)式無(wú)法容納在一行內(nèi)時(shí),可換行顯示,另起的新行用8個(gè)空格縮進(jìn)。

someMethod(longExpression1, longExpression2, longExpression3,  
        longExpression4, longExpression5);

7.一行聲明一個(gè)變量,不要一行聲明多個(gè)變量,這樣有利于寫(xiě)注釋。

private String param1; // 參數(shù)1
private String param2; // 參數(shù)2

8.行寬設(shè)置為100,設(shè)置格式化時(shí)自動(dòng)斷行到行寬位置。

9.使用快捷鍵進(jìn)行代碼自動(dòng)格式化。

  • Windows:CTRL+ALT+L
  • Mac:OPTION+COMMAND+L

10.一個(gè)方法最多不要超過(guò)40行代碼。

11.范圍型的常量用枚舉類(lèi)定義,而不要直接用整型或字符,這樣可以減少范圍值的有效性檢查。

// 用枚舉類(lèi)定義,Good
public enum CouponType {
    // 現(xiàn)金券
    @SerializedName("1")
    CASH,

    // 抵用券
    @SerializedName("2")
    DEBIT,

    // 折扣券
    @SerializedName("3")
    DISCOUNT
}

// 用整型定義,Bad
public static final int TYPE_CASH = 1; // 現(xiàn)金券
public static final int TYPE_DEBIT = 2; // 抵扣券
public static final int TYPE_DISCOUNT = 3; // 折扣券

12.文字大小的單位統(tǒng)一用sp,元素大小的單位統(tǒng)一用dp

13.應(yīng)用中的字符串統(tǒng)一在strings.xml中定義,然后在代碼和布局文件中引用。

14.顏色值統(tǒng)一在colors.xml中定義,然后在代碼和布局文件中引用。另外,不要在代碼和布局文件中引用系統(tǒng)的顏色,除了透明。

命名規(guī)范

1.包命名

域名反寫(xiě)+項(xiàng)目名稱(chēng)+模塊名稱(chēng),全部單詞用小寫(xiě)字母。

例如,我的KAndroid項(xiàng)目的Model模塊包名如下:

me.keeganlee.kandroid.model

2.類(lèi)和接口命名

使用大駝峰規(guī)則,用名詞或名詞詞組命名,每個(gè)單詞的首字母大寫(xiě)。以下為幾種常用類(lèi)的命名:

  • activity類(lèi),命名以Activity為后綴,如:LoginActivity
  • fragment類(lèi),命名以Fragment為后綴,如:ShareDialogFragment
  • service類(lèi),命名以Service為后綴,如:DownloadService
  • adapter類(lèi),命名以Adapter為后綴,如:CouponListAdapter
  • 工具類(lèi),命名以Util為后綴,如:EncryptUtil
  • 模型類(lèi),命名以BO為后綴,如:CouponBO
  • 接口實(shí)現(xiàn)類(lèi),命名以Impl為后綴,如:ApiImpl

3.方法命名

使用小駝峰規(guī)則,用動(dòng)詞命名,第一個(gè)單詞的首字母小寫(xiě),其他單詞的首字母大寫(xiě)。以下為幾種常用方法的命名:

  • 初始化方法,命名以init開(kāi)頭,例:initView
  • 按鈕點(diǎn)擊方法,命名以to開(kāi)頭,例:toLogin
  • 設(shè)置方法,命名以set開(kāi)頭,例:setData
  • 具有返回值的獲取方法,命名以get開(kāi)頭,例:getData
  • 通過(guò)異步加載數(shù)據(jù)的方法,命名以load開(kāi)頭,例:loadData
  • 布爾型的判斷方法,命名以ishas,或具有邏輯意義的單詞如equals,例:isEmpty

4.控件縮寫(xiě)

5.常量命名

全部為大寫(xiě)單詞,單詞之間用下劃線分開(kāi)。

public final static int PAGE_SIZE = 20;

6.變量命名

{范圍描述+}意義描述+類(lèi)型描述的組合,用駝峰式,首字母小寫(xiě)。

private TextView headerTitleTxt; // 標(biāo)題欄的標(biāo)題
private Button loginBtn; // 登錄按鈕
private CouponBO couponBO; // 券實(shí)例

7.控件id命名

控件縮寫(xiě)_{范圍_}意義,范圍可選,只在有明確定義的范圍內(nèi)才需要加上。

<!-- 這是標(biāo)題欄的標(biāo)題 -->
<TextView
    android:id="@+id/txt_header_title"
    ... />

<!-- 這是登錄按鈕 -->
<Button
    android:id="@+id/btn_login"
    ... />

8.layout命名

組件類(lèi)型_{范圍_}功能,范圍可選,只在有明確定義的范圍內(nèi)才需要加上。

以下為幾種常用的組件類(lèi)型命名:

  • activity_{范圍_}功能,為Activity的命名格式
  • fragment_{范圍_}功能,為Fragment的命名格式
  • dialog_{范圍_}功能,為Dialog的命名格式
  • item_list_{范圍_}功能,為ListViewitem命名格式
  • item_grid_{范圍_}功能,為GridViewitem命名格式
  • header_list_{范圍_}功能,為ListViewHeaderView命名格式
  • footer_list_{范圍_}功能,為ListViewFooterView命名格式

9.strings的命名

類(lèi)型_{范圍_}功能,范圍可選。以下為幾種常用的命名:

  • 頁(yè)面標(biāo)題,命名格式為:title_頁(yè)面
  • 按鈕文字,命名格式為:btn_按鈕事件
  • 標(biāo)簽文字,命名格式為:label_標(biāo)簽文字
  • 選項(xiàng)卡文字,命名格式為:tab_選項(xiàng)卡文字
  • 消息框文字,命名格式為:toast_消息
  • 編輯框的提示文字,命名格式為:hint_提示信息
  • 圖片的描述文字,命名格式為:desc_圖片文字
  • 對(duì)話(huà)框的文字,命名格式為:dialog_文字
  • menu的item文字,命名格式為:action_文字

10.colors的命名

前綴{_控件}{_范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個(gè)。

  • 背景顏色,添加bg前綴
  • 文本顏色,添加text前綴
  • 分割線顏色,添加div前綴
  • 區(qū)分狀態(tài)時(shí),默認(rèn)狀態(tài)的顏色,添加normal后綴
  • 區(qū)分狀態(tài)時(shí),按下時(shí)的顏色,添加pressed后綴
  • 區(qū)分狀態(tài)時(shí),選中時(shí)的顏色,添加selected后綴
  • 區(qū)分狀態(tài)時(shí),不可用時(shí)的顏色,添加disable后綴

11.drawable的命名

前綴{_控件}{_范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個(gè)。

  • 圖標(biāo)類(lèi),添加ic前綴
  • 背景類(lèi),添加bg前綴
  • 分隔類(lèi),添加div前綴
  • 默認(rèn)類(lèi),添加def前綴
  • 區(qū)分狀態(tài)時(shí),默認(rèn)狀態(tài),添加normal后綴
  • 區(qū)分狀態(tài)時(shí),按下時(shí)的狀態(tài),添加pressed后綴
  • 區(qū)分狀態(tài)時(shí),選中時(shí)的狀態(tài),添加selected后綴
  • 區(qū)分狀態(tài)時(shí),不可用時(shí)的狀態(tài),添加disable后綴
  • 多種狀態(tài)的,添加selector后綴(一般為L(zhǎng)istView的selector或按鈕的selector

12.動(dòng)畫(huà)文件命名

動(dòng)畫(huà)類(lèi)型_動(dòng)畫(huà)方向

  • fade_in,淡入
  • fade_out,淡出
  • push_down_in,從下方推入
  • push_down_out,從下方推出
  • slide_in_from_top,從頭部滑動(dòng)進(jìn)入
  • zoom_enter,變形進(jìn)入
  • shrink_to_middle,中間縮小

注釋規(guī)范

1.文件頭注釋

文件頂部統(tǒng)一添加版權(quán)聲明,聲明的格式如下:

/**
 * Copyright (c) 2015. Keegan小鋼 Inc. All rights reserved.
 */

2.類(lèi)和接口注釋

類(lèi)和接口統(tǒng)一添加javadoc注釋?zhuān)袷饺缦拢?/p>

/**
 * 類(lèi)或接口的描述信息
 *
 * @author ${USER}
 * @date ${DATE}
 */

3.方法注釋

下面幾種方法,都必須添加javadoc注釋?zhuān)f(shuō)明該方法的用途和參數(shù)說(shuō)明,以及返回值的說(shuō)明。

  • 接口中定義的所有方法
  • 抽象類(lèi)中自定義的抽象方法
  • 抽象父類(lèi)的自定義公用方法
  • 工具類(lèi)的公用方法
**
 * 登錄
 *
 * @param loginName 登錄名
 * @param password  密碼
 * @param listener  回調(diào)監(jiān)聽(tīng)器
 */
public void login(String loginName, String password, ActionCallbackListener<Void> listener);

4.變量和常量注釋

下面幾種情況下的常量和變量,都要添加注釋說(shuō)明,優(yōu)先采用右側(cè)//來(lái)注釋?zhuān)糇⑨屨f(shuō)明太長(zhǎng)則在上方添加注釋。

  • 接口中定義的所有常量
  • 公有類(lèi)的公有常量
  • 枚舉類(lèi)定義的所有枚舉常量
  • 實(shí)體類(lèi)的所有屬性變量
public static final int TYPE_CASH = 1; // 現(xiàn)金券
public static final int TYPE_DEBIT = 2; // 抵扣券
public static final int TYPE_DISCOUNT = 3; // 折扣券

private int id;                // 券id
private String name;           // 券名稱(chēng)
private String introduce;      // 券簡(jiǎn)介

結(jié)束語(yǔ)

這份開(kāi)發(fā)規(guī)范說(shuō)明比較細(xì),也許還不是非常完整,但里面提到的每一條規(guī)范都很有用。按照此規(guī)范嚴(yán)格執(zhí)行,將大大提高代碼的可讀性和維護(hù)性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,653評(píng)論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,063評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,235評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,459評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,676評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,937評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評(píng)論 2 374

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