Android_開發(fā)規(guī)范

開發(fā)規(guī)范

一豪娜、前言

1.1 為什么需要開發(fā)規(guī)范

編碼規(guī)范對于程序員而言尤為重要伸辟,有以下幾個原因:

  • 一個軟件的生命周期中簿姨,80%的花費在于維護(hù)
  • 幾乎沒有任何一個軟件痢甘,在其整個生命周期中喇嘱,均由最初的開發(fā)人員來維護(hù)
  • 編碼規(guī)范可以改善軟件的可讀性,可以讓程序員盡快而徹底地理解新的代碼
  • 如果你將源碼作為產(chǎn)品發(fā)布塞栅,就需要確任它是否被很好的打包并且清晰無誤者铜,一如你已構(gòu)建的其它任何產(chǎn)品

1.2 開發(fā)規(guī)范的作用

  • 減少維護(hù)花費
  • 提高可讀性
  • 加快工作交接
  • 減少名字增生
  • 降低缺陷引入的機會

二、命名規(guī)范

命名規(guī)范大體是已 java 的命名規(guī)范為基礎(chǔ)進(jìn)行的更改,如果這里沒有說明就默認(rèn)以 java 命名規(guī)范為準(zhǔn)作烟。

2.1 常量命名規(guī)范

2.1.1 說明

常量用于保存需要常駐內(nèi)存中并且經(jīng)常使用變化不多的數(shù)據(jù)愉粤,定義常量的名稱的時候需要遵循望文知意的原則;

2.1.2 規(guī)則
  1. 全部為大寫字母拿撩;
  2. 中間以“_”連接衣厘;
  3. 望文知意原則;
2.1.3 備注

代碼中涉及到直接使用某個字符串或者其他基本類型的值時压恒,建議定義成常量影暴,避免多處直接使用同樣的值作為參數(shù)。

2.1.4 舉例
  • 如:定義一個常量表示最小屏幕寬度的常量探赫,則可以定義一個int類型的常量型宙,該常量可以命名為:“MIN_SCREEN_WIDTH“;
  • 其他舉例:
  • 例如:static final int MIN_SCREEN_WIDTH = 4伦吠;( √)
  • 例如:static final int min_screen_width = 4;(×)
  • 例如:static final int minScreenWidth = 4; (×)
  • 例如:static final int WIDTH = 4妆兑;(×)
  • 例如:static final int width = 4;(×)
  • 例如:static final int wd = 4;(×)

2.2 變量命名規(guī)范

2.2.1 說明

變量用于保存系統(tǒng)中的臨時數(shù)據(jù),變量命名時遵循望文知意萌狂,簡單明了,駝峰標(biāo)示等原則谱姓。

2.2.2 規(guī)則
  1. 首字母小寫;
  2. java駝峰命名刨晴;
  3. 望文知意原則屉来;
  4. 推薦引用類型變量添加前綴“m”;
  5. boolean類型變量添加前綴“is”狈癞;
  6. 如果是View組件變量茄靠,則組件名稱為xml文件中定義的ID名稱去掉下劃線,下劃線后一位大寫蝶桶;
2.2.3 舉例
  • 如:定義一個表示最小屏幕寬度的變量慨绳,則可以定義一個int型的臨時變量為:mMinScreenWidth;
  • 例如:static final int mMinScreenWidth = 4真竖; ( √)
  • 例如:static final int minWidth = 4脐雪;(×)
  • 例如:static final int screenWidth = 4;(×)
  • 例如:static final int width = 4恢共;(×)
  • 例如:static final int min = 4战秋; (×)
  • 例如:static final int msw = 4; (×)

2.3 方法名命名規(guī)范

2.3.1 說明

方法名的命名應(yīng)該遵循簡單明了的原則讨韭;

2.3.2 規(guī)則
  1. 首字母小寫脂信;
  2. java駝峰命名癣蟋;
  3. 簡單明了原則;
  4. 初始化方法init*(每個init做一件事)
2.3.3 備注
  • 同時在方法的實現(xiàn)上狰闪,盡量不要在一個方法中出現(xiàn)太多實現(xiàn)代碼疯搅,如一個方法有幾百行的實現(xiàn)邏輯,推薦在邏輯復(fù)雜時埋泵,按功能點拆分出多個方法幔欧,便于閱讀。
  • 另外秋泄,出現(xiàn)功能一樣的實現(xiàn)邏輯琐馆,盡量抽取公用方法,避免將實現(xiàn)邏輯復(fù)制到多個用到的地方恒序。
2.3.4 舉例
  • 如:定義一個獲取屏幕寬度的方法,依照上述原則谁撼,則可以定義為一個靜態(tài)方法:public static int getScreenWidth();
  • 例如:public static int getScreenWidth();( √)
  • 例如:public static int getscreenwidth();(×)
  • 例如:public static int getScreenwidth();(×)
  • 例如:public static int getWidth();(×)
  • 例如:public static int getScreen();(×)
  • 例如:public static int getSW();(×)

2.4 類命名規(guī)范

2.4.1 說明

類名主要表示一個類的作用歧胁,需要簡明扼要,望文知意厉碟,并且首字母大寫喊巍。

2.4.2 規(guī)則
  1. 首字母大寫;
  2. java駝峰命名箍鼓;
  3. 望文知意原則崭参;
  4. 能夠說明類的功能和主要作用(注釋的作用);
  5. Acitivity類以Acitivity結(jié)尾款咖;
  6. Fragment類以Fragment結(jié)尾何暮;
  7. Service類以Service結(jié)尾;
  8. BroadcastReceiver類以Receiver結(jié)尾铐殃;
  9. ContentProvider類以Provider結(jié)尾海洼;
  10. Application類以Application結(jié)尾(或直接APP命名);
  11. 自定義View類以Custom**View結(jié)尾富腊;
  12. 自定義Adapter類以Adapter結(jié)尾坏逢;
  13. adapter中的ViewHolder以Holder結(jié)尾;
  14. 實體Bean以Model或Bean結(jié)尾赘被;
  15. 工具類以Utils結(jié)尾
2.4.3 舉例
  • 如:定義一個獲取屏幕信息的工具類是整,則可以定義為public class ScreenUtils;
  • 例如:public class ScreenUtils; ( √)
  • 例如:public class Screenutils; (×)
  • 例如:public class Screen; (×)
  • 例如:public class screenutils; (×)
  • 例如:public class screen; (×)
  • 例如:public class su民假;(x)

2.5 接口命名規(guī)范

2.5.1 說明

接口命名需要簡單明了浮入,長度不宜過長;

2.5.2 規(guī)則
  1. 首字母大寫(第二個字母也是大寫)阳欲;
  2. java駝峰命名舵盈;
  3. 望文知意原則陋率;
  4. 建議在名稱前面追加“I”;
2.5.3 備注
  • I**Listener
  • I**CallBack
  • I**秽晚;
2.5.4 舉例
  • 如:定義一個activity的方法接口瓦糟,實現(xiàn)接口中的某些方法:public
    interface IFunctionListener;
  • 例如:public interface IFunctionListener赴蝇;( √)
  • 例如:public interface BaseActivity; (×)
  • 例如:public interface Baseactivityinter; (×)
  • 例如:public interface BaseInter; (×)
  • 例如:public interface ActivityInter菩浙;(×)

2.6 包名規(guī)范

2.6.1 說明

用于分類管理類文件;

2.6.2 規(guī)則
  1. 所有字母小寫句伶;
  2. 簡單明了劲蜻,層級很深,沒有拼接的包名考余;
  3. 望文知意先嬉;
  4. 按功能劃分包名,如“我的”
  5. 工具類可以劃分為一個工具類的包名楚堤,utils疫蔓,里面可以添加包名層級;
  6. 系統(tǒng)類的可以劃分為一個系統(tǒng)類的包身冬,system衅胀,里面可以添加包名層級;
  7. 組件類的可以劃分為一個組件類的包酥筝,*滚躯,里面添加adapter的包名,自定義view包名嘿歌;
  8. Service類的可以劃分為一個服務(wù)類的包掸掏,service,里面可以添加包名層級搅幅;
  9. 數(shù)據(jù)庫相關(guān)類可以劃分為一個數(shù)據(jù)庫類阅束,db,里面可以添加數(shù)據(jù)庫相關(guān)類茄唐,Bean類息裸,數(shù)據(jù)庫服務(wù)類等;
  10. 廣播類的可以劃分為廣播類的包沪编,receiver呼盆,可以放一些廣播相關(guān)的類;
  11. 網(wǎng)絡(luò)類相關(guān)的可以劃分為蚁廓,network访圃,放一些網(wǎng)絡(luò)相關(guān)的類;
  12. Fragment類存放在fragment包下相嵌;
  13. Activity類存放在Activity包下腿时;
  14. 在接口過多的情況下可以單獨為接口劃分一個包interface或infa

2.7 目錄名稱規(guī)范

2.7.1 說明

主要是一些jar包况脆,so文件的配置目錄名稱;

2.7.2 規(guī)則
  1. 全部為小寫字母批糟;
  2. 簡單明了格了;
  3. 望文知意;
  4. 駝峰表示徽鼎;
2.7.3 舉例
  • 后期增加目錄的可能性不多盛末,現(xiàn)列舉出系統(tǒng)中存在的目錄結(jié)構(gòu):
  • lib:第三方j(luò)ar的保存路徑;
  • jniLibs:jni引用的so文件的目錄否淤;

2.8 布局文件名稱規(guī)范

2.8.1 說明

主要包含資源文件的命名問題悄但;

2.8.2 規(guī)則
  1. 全部為小寫字母;
  2. 中間以”_”連接石抡;
  3. 望文知意原則檐嚣;
  4. 布局文件的開頭問類名;
  5. 列表項的xml布局文件名稱:類名_item.xml汁雷;
  6. activity類的xml文件名稱:類名_activity.xml净嘀;
  7. fragment類的xml文件名稱:類名_fragment.xml;
  8. 自定義View的xml文件的名稱:類名_父類名.xml侠讯;
2.8.3 列舉
  • 如:如定義H5Activity的xml文件名稱,則可以定義為h5.xml暑刃;盡量不使用大寫字母等厢漩。

2.9 drawable文件名稱規(guī)范

2.9.1 說明

drawable文件名稱命名規(guī)范;

2.9.2 規(guī)則
  1. 全部為小寫字母岩臣;
  2. 中間以”_”連接溜嗜;
  3. 望文知意原則;
  4. 布局文件的開頭問類名架谎;
  5. 11_22_33_44炸宵;44:selector,shape(大概五六個谷扣,暫時不定義其他的)土全; 33:src、bg会涎、color(可擴展裹匙,可為空); 22:狀態(tài)名稱或者為空末秃;11:業(yè)務(wù)名稱
2.9.3 舉例

* 如:比如一個textview組件概页,可點擊用于支付的按鈕,則可以把ID定義為: tv_pay_money练慕;

2.10 資源ID規(guī)范

2.9.1 說明

各種資源ID的定義問題惰匙;

2.9.2 規(guī)則
  1. 全部為小寫字母技掏;
  2. 中間以”_”連接;
  3. 望文知意原則项鬼;
2.9.3 備注
  • 可以考慮按照組件的名稱的縮寫作為前綴哑梳,(同一個xml文件中ID名稱不能重復(fù))如:組件簡寫(大寫字母縮寫)_業(yè)務(wù)名稱
  • TextView的組件:tv_pay_money
  • Button的組件:btn_pay_money
  • EditText的組件:et_user_name
  • LinerLayout組件:ll_container
2.9.4 舉例

* 如:比如一個textview組件,可點擊用于支付的按鈕秃臣,則可以把ID定義為: tv_pay_money涧衙;

三、注釋規(guī)范

3.1 類注釋

成員變量和常量需要使用如下注釋的形式奥此,注釋位于變量的上側(cè)弧哎;
/**
*
**/ 

3.2 內(nèi)部邏輯注釋

內(nèi)部邏輯注釋模板:
//支付成功
if (response.getRet() == 0) {
   Toast.makeText(H5Activity.this, "支付成功", Toast.LENGTH_LONG).show();
   goToNext(response);
}
//支付失敗
else if (response.getRet() == -1) {
  Toast.makeText(H5Activity.this, "支付失敗", Toast.LENGTH_LONG).show();
  //刷新當(dāng)前頁面
  reflush(currentUrl);
}

四、代碼順序

在一個典型的Activity中代碼的順序如下:
/**
* author:sh
* desc:該class的作用
* time:yyyy-MM-dd
**/
public class ClassName {
    //(1) 成員變量集合
    //(2) 回調(diào)方法集合
    若該類為activity稚虎,則:onCreate撤嫩、**、onDestory蠢终;
    若該類為Fragment序攘、則:onCreateView、**寻拂、onDestory程奠;
    //(3) 其他方法集合
}

五、代碼風(fēng)格

5.1 大括號換行

左大括號不換行祭钉,右大括號換行瞄沙;
class MyClass {
    int func() {
        if (something) {
            // ...
        } else if (somethingElse) {
            // ...
        } else {
            // ...
        }
    }
}

5.2 小括號空格

if (condition) {
    body();
}                         // 推薦

5.3 縮進(jìn)

  • 4 個空格作為縮進(jìn)排版的一個單位,不使用制表符 tab慌核。
  • 8 個空格作為換行后的縮進(jìn)距境,包括函數(shù)調(diào)用和賦值。
  • Instrument i = someLongexpression_r(that, NotFit, on, one, line); // 推薦

5.4 每一行的長度

  • 盡量避免一行的長度超過 100 個字符垮卓。(如果屏幕比例較大時可以適當(dāng)增加)
  • 例外:如果注釋行包含了超過 100 個字符的命令示例或者 url 文字垫桂,為了便于剪切和復(fù)制,其長度可以超過 100 個字符粟按。
  • 例外:import 行可以超過限制诬滩,因為很少有人會去閱讀它。這也簡化了編程工具的寫入操作钾怔。

5.5 每次聲明一個變量

  • 推薦一行一個聲明碱呼,因為這樣以利于寫注釋;
  • int level; // indentation level
  • int size; // size of table

5.6 if-else語句

if-else語句應(yīng)該具有如下格式:
if (condition) {
    statements;
}

if (condition) {
    statements;
} else {
    statements;
}

if (condition) {
    statements;
} else if (condition) {
    statements;
} else{
    statements;
}
注意:if語句總是用”{“和”}“括起來宗侦,避免使用如下容易引起錯誤的格式:
if (condition)  // 避免
    statement;

5.7 for語句

一個for語句應(yīng)該具有如下格式:
for (initialization; condition; update) {
    statements;
}

當(dāng)在for語句的初始化或更新子句中使用逗號時愚臀,避免因使用三個以上變量,而導(dǎo)致復(fù)雜度提高矾利。

  若需要姑裂,可以在for循環(huán)之前(為初始化子句)或for循環(huán)末尾(為更新子句)使用單獨的語句馋袜。

5.8 while語句

一個while語句應(yīng)該具有如下格式:
while (condition) {
    statements;
}

5.9 do-while語句

do {
    statements;
} while (condition);

5.10 switch語句

一個switch語句應(yīng)該具有如下格式:
switch (condition) {
    case ABC:
        statements;
        /* falls through */
    case DEF:
        statements;
        break;

    case XYZ:
        statements;
        break;

    default:
        statements;
        break;
}

每當(dāng)一個case順著往下執(zhí)行時(因為沒有break語句),通常應(yīng)在break語句的位置添加注釋舶斧。

六欣鳖、異常規(guī)范

6.1 異常名稱

定義異常的時候,異常的后綴名稱以Exception結(jié)尾茴厉,及**Exception泽台;

6.2 異常描述

盡量英文描述,簡單明了矾缓;

6.3 異常格式

一個try-catch語句應(yīng)該具有如下格式:
try {
    statements;
} catch (ExceptionClass e) {
    statements;
}

try {
    statements;
} catch (ExceptionClass e) {
    statements;
} finally {
    statements;
}

七怀酷、其他規(guī)范

7.1 源文件的函數(shù)小于2K

一般來說源文件的行數(shù)不能大于2K行,過多的話可以考慮拆分功能嗜闻,拆分函數(shù)等蜕依;

7.2 使用TODO注釋

對那些臨時性的、短期的琉雳、夠棒但不完美的代碼样眠,請使用 TODO 注釋。
TODO 注釋應(yīng)該包含全部大寫的 TODO翠肘,后跟一個冒號:
// TODO: Remove this code after the UrlTable2 has been checked in.
// TODO: Change this to use a flag instead of a constant. 
如果 TODO 注釋是“將來要做某事”的格式)檐束。

7.3 使用自定義LOG

在系統(tǒng)中需要打印LOG的時候,盡量使用自定義的LOG束倍,自定義的LOG在開發(fā)環(huán)境的時候會打印日志厢塘,正式環(huán)境的時候不會打印日志。

7.4 使用自定義TAG

在系統(tǒng)打印LOG的時候肌幽,使用TAG盡量使用tab,同意的TAG標(biāo)志抓半。

作者: Beetle_sxy

時間: 2017/8/10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喂急,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笛求,更是在濱河造成了極大的恐慌廊移,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件探入,死亡現(xiàn)場離奇詭異狡孔,居然都是意外死亡,警方通過查閱死者的電腦和手機蜂嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門苗膝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人植旧,你說我怎么就攤上這事辱揭±胩疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵问窃,是天一觀的道長亥鬓。 經(jīng)常有香客問我,道長域庇,這世上最難降的妖魔是什么嵌戈? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮听皿,結(jié)果婚禮上熟呛,老公的妹妹穿的比我還像新娘。我一直安慰自己写穴,他們只是感情好惰拱,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啊送,像睡著了一般偿短。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馋没,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天昔逗,我揣著相機與錄音,去河邊找鬼篷朵。 笑死勾怒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的声旺。 我是一名探鬼主播笔链,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腮猖!你這毒婦竟也來了鉴扫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澈缺,失蹤者是張志新(化名)和其女友劉穎坪创,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姐赡,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡莱预,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了项滑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片依沮。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悉抵,到底是詐尸還是另有隱情肩狂,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布姥饰,位于F島的核電站傻谁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏列粪。R本人自食惡果不足惜审磁,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岂座。 院中可真熱鬧态蒂,春花似錦、人聲如沸费什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸳址。三九已至瘩蚪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稿黍,已是汗流浹背疹瘦。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡球,地道東北人言沐。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像酣栈,于是被迫代替她去往敵國和親险胰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理矿筝,服務(wù)發(fā)現(xiàn)鸯乃,斷路器,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法跋涣,類相關(guān)的語法,內(nèi)部類的語法鸟悴,繼承相關(guān)的語法陈辱,異常的語法,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • .Net 開發(fā)規(guī)范一细诸、C# 編碼規(guī)范1. 代碼組織與風(fēng)格1.1. Tab要使一個Tab為4個空格長沛贪。1.2. 縮進(jìn)...
    PowerYangSoft閱讀 3,969評論 0 3
  • 開發(fā)規(guī)范 首先,我這篇開發(fā)規(guī)范,只是針對于剛進(jìn)入職場的萌新來寫的利赋,已經(jīng)形成自己開發(fā)風(fēng)格的可以自行繞過水评。其次,這些也...
    手術(shù)刀切西瓜閱讀 860評論 0 6
  • 有些許莫名的煩躁媚送,心難靜中燥,書翻了一頁又一頁,卻不知所云塘偎,索性放在一邊不去翻它疗涉。看了一下日歷吟秩,20日春分咱扣,又該去那個...
    瘋子_6e6e閱讀 175評論 0 0