從這篇文章開始我們暫停1下對android源碼的分析,開始講1下android產品研發中1些經常使用的技術,技能,方法,實踐等姿式。這里需要強調的是我們所講授的這些東西可能對產品開發中比較經常使用的,由于對項目開發中,可能更多的強調管理,進度方法的東西,對工程化的東西比較強調,而我們這里更多的是對產品技術方面的歸納總結。
而本文當選擇將開發規范作為這個系列的第1篇文章,就是個人感覺產品研發進程中,開發規范真的很重要,很重要,非常重要(重要的事情說3遍),1個好的開發規范可讓團隊中的人對他人的代碼更熟習,新人也能夠更好的了解產品的業務邏輯。開發規范其實不是1個死的1成不變的,每一個團隊可能都有自己的開發規范,只要是合適團隊的開發規范就是最好的開發規范。
所以本文中所講授的開發規范只能是拋磚引玉,有可取的地方可以鑒戒,援用,不能照搬全抄不假思索,畢竟不同的團隊有不同的實際情況。最好的方式就是可以根據本文的開發規范總結出本身團隊比較合適的規范流程。
好吧,空話不多說了,下面我們就介紹1下我在實踐中總結的android開發規范。
編碼規范對程序員而言尤其重要,有以下幾個緣由:
* 1個軟件的生命周期中,80%的花費在于保護
* 幾近沒有任何1個軟件,在其全部生命周期中,均由最初的開發人員來保護
* 編碼規范可以改良軟件的可讀性,可讓程序員盡快而完全地理解新的代碼
* 如果你將源碼作為產品發布,就需要確任它是不是被很好的打包并且清晰無誤,1如你已構建的其它任何產品
* 減少保護花費
* 提高可讀性
* 加快工作交接
* 減少名字增生
* 下降缺點引入的機會
常量命名規范
常量用于保存需要常駐內存中并且常常使用變化不多的數據,定義常量的名稱的時候需要遵守望文知意的原則;
代碼中觸及到直接使用某個字符串或其他基本類型的值時,建議定義成常量,避免多處直接使用一樣的值作為參數。
變量命名規范
變量用于保存系統中的臨時數據,變量命名時遵守望文知意,簡單明了,駝峰標示等原則。
無
方法命名規范
方法名的命名應當遵守簡單明了的原則;
類命名規范
類名主要表示1個類的作用,需要簡明扼要,望文知意,并且首字母大寫。
無
接口命名規范
接口命名需要簡單明了,長度不宜太長;
包名規范
用于分類管理類文件;
無
無
目錄名稱規范
主要是1些jar包,so文件的配置目錄名稱;
無
布局文件名稱規范
主要包括資源文件的命名問題;
無
如:如定義H5Activity的xml文件名稱,則可以定義為h5.xml;盡可能不使用大寫字母等。
drawable文件名稱命名規范
主要包括資源文件的命名問題;
無
無
資源ID命名規范
各種資源ID的定義問題;
可以斟酌依照組件的名稱的縮寫作為前綴,(同1個xml文件中ID名稱不能重復)如:組件簡寫(大寫字母縮寫)_業務名稱
TextView的組件:tv_pay_money
Button的組件:btn_pay_money
EditText的組件:et_user_name
LinerLayout組件:ll_container
如:比如1個textview組件,可點擊用于支付的按鈕,則可以把ID定義為: tv_pay_money;
在類、接口定義之前當對其進行注釋,包括類、接口的目的、作用、功能、繼承于何種父類,實現的接口、實現的算法、使用方法、示例程序等。
/**
* author:作者
* time:時間
* desc:描寫
*/
方法注釋的模板:
/**
* desc:描寫
* @param 參數名 參數描寫
* @param 參數名2 參數描寫
* @return 返回值類型說明
* @throws Exception 異常說明
*/
成員變量和常量需要使用以下注釋的情勢,注釋位于變量的上側;
/**
*
**/
內部邏輯注釋模板:
//支付成功
if (response.getRet() == 0) {
Toast.makeText(H5Activity.this, "支付成功", Toast.LENGTH_LONG).show();
goToNext(response);
}
//支付失敗
else if (response.getRet() == ⑴) {
Toast.makeText(H5Activity.this, "支付失敗", Toast.LENGTH_LONG).show();
//刷新當前頁面
reflush(currentUrl);
}
在1個典型的Activity中代碼的順序以下:
/**
* author:sh
* desc:該class的作用
* time:yyyy-MM-dd
**/
public class ClassName {
//(1) 成員變量集合
//(2) 回調方法集合
若該類為activity,則:onCreate、**、onDestory;
若該類為Fragment、則:onCreateView、**、onDestory;
//(3) 其他方法集合
}
左大括號不換行,右大括號換行;
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
if (condition) {
body();
} // 推薦
if-else語句應當具有以下格式:
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
注意:if語句總是用”{“和”}“括起來,避免使用以下容易引發毛病的格式:
if (condition) // 避免
statement;
1個for語句應當具有以下格式:
for (initialization; condition; update) {
statements;
}
當在for語句的初始化或更新子句中使用逗號時,避免因使用3個以上變量,而致使復雜度提高。
若需要,可以在for循環之前(為初始化子句)或for循環末尾(為更新子句)使用單獨的語句。
1個while語句應當具有以下格式:
while (condition) {
statements;
}
do {
statements;
} while (condition);
1個switch語句應當具有以下格式:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
每當1個case順著往下履行時(由于沒有break語句),通常應在break語句的位置添加注釋。
定義異常的時候,異常的后綴名稱以Exception結尾,及**Exception;
盡可能英文描寫,簡單明了;
1個try-catch語句應當具有以下格式:
try {
statements;
} catch (ExceptionClass e) {
statements;
}
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
1般來講源文件的行數不能大于2K行,過量的話可以斟酌拆分功能,拆分函數等;
在系統中需要打印LOG的時候,盡可能使用自定義的LOG,自定義的LOG在開發環境的時候會打印日志,正式環境的時候不會打印日志。
在系統打印LOG的時候,使用TAG盡可能使用tab,同意的TAG標志。
本文以同步至github中:https://github.com/yipianfengye/androidProject,歡迎star和follow