開發(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ī)則
- 全部為大寫字母拿撩;
- 中間以“_”連接衣厘;
- 望文知意原則;
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ī)則
- 首字母小寫;
- java駝峰命名刨晴;
- 望文知意原則屉来;
- 推薦引用類型變量添加前綴“m”;
- boolean類型變量添加前綴“is”狈癞;
- 如果是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ī)則
- 首字母小寫脂信;
- java駝峰命名癣蟋;
- 簡單明了原則;
- 初始化方法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ī)則
- 首字母大寫;
- java駝峰命名箍鼓;
- 望文知意原則崭参;
- 能夠說明類的功能和主要作用(注釋的作用);
- Acitivity類以Acitivity結(jié)尾款咖;
- Fragment類以Fragment結(jié)尾何暮;
- Service類以Service結(jié)尾;
- BroadcastReceiver類以Receiver結(jié)尾铐殃;
- ContentProvider類以Provider結(jié)尾海洼;
- Application類以Application結(jié)尾(或直接APP命名);
- 自定義View類以Custom**View結(jié)尾富腊;
- 自定義Adapter類以Adapter結(jié)尾坏逢;
- adapter中的ViewHolder以Holder結(jié)尾;
- 實體Bean以Model或Bean結(jié)尾赘被;
- 工具類以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ī)則
- 首字母大寫(第二個字母也是大寫)阳欲;
- java駝峰命名舵盈;
- 望文知意原則陋率;
- 建議在名稱前面追加“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ī)則
- 所有字母小寫句伶;
- 簡單明了劲蜻,層級很深,沒有拼接的包名考余;
- 望文知意先嬉;
- 按功能劃分包名,如“我的”
- 工具類可以劃分為一個工具類的包名楚堤,utils疫蔓,里面可以添加包名層級;
- 系統(tǒng)類的可以劃分為一個系統(tǒng)類的包身冬,system衅胀,里面可以添加包名層級;
- 組件類的可以劃分為一個組件類的包酥筝,*滚躯,里面添加adapter的包名,自定義view包名嘿歌;
- Service類的可以劃分為一個服務(wù)類的包掸掏,service,里面可以添加包名層級搅幅;
- 數(shù)據(jù)庫相關(guān)類可以劃分為一個數(shù)據(jù)庫類阅束,db,里面可以添加數(shù)據(jù)庫相關(guān)類茄唐,Bean類息裸,數(shù)據(jù)庫服務(wù)類等;
- 廣播類的可以劃分為廣播類的包沪编,receiver呼盆,可以放一些廣播相關(guān)的類;
- 網(wǎng)絡(luò)類相關(guān)的可以劃分為蚁廓,network访圃,放一些網(wǎng)絡(luò)相關(guān)的類;
- Fragment類存放在fragment包下相嵌;
- Activity類存放在Activity包下腿时;
- 在接口過多的情況下可以單獨為接口劃分一個包interface或infa
2.7 目錄名稱規(guī)范
2.7.1 說明
主要是一些jar包况脆,so文件的配置目錄名稱;
2.7.2 規(guī)則
- 全部為小寫字母批糟;
- 簡單明了格了;
- 望文知意;
- 駝峰表示徽鼎;
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ī)則
- 全部為小寫字母;
- 中間以”_”連接石抡;
- 望文知意原則檐嚣;
- 布局文件的開頭問類名;
- 列表項的xml布局文件名稱:類名_item.xml汁雷;
- activity類的xml文件名稱:類名_activity.xml净嘀;
- fragment類的xml文件名稱:類名_fragment.xml;
- 自定義View的xml文件的名稱:類名_父類名.xml侠讯;
2.8.3 列舉
- 如:如定義H5Activity的xml文件名稱,則可以定義為h5.xml暑刃;盡量不使用大寫字母等厢漩。
2.9 drawable文件名稱規(guī)范
2.9.1 說明
drawable文件名稱命名規(guī)范;
2.9.2 規(guī)則
- 全部為小寫字母岩臣;
- 中間以”_”連接溜嗜;
- 望文知意原則;
- 布局文件的開頭問類名架谎;
- 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ī)則
- 全部為小寫字母技掏;
- 中間以”_”連接;
- 望文知意原則项鬼;
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