Android編程規(guī)范

命名規(guī)范

1. 基本原則

(1) 代碼風格與android源碼保持一致
(2) 命名要清晰明了介褥、有明確含義
(3) 同一產(chǎn)品命名風格要保持一致洲尊,避免一意多詞
(4) 同一作用域贩猎,不能有變量重名收夸,如局部變量與全局變量重名

2. 包名

(1) package命名如com.brian.xx.yy.zz蜗顽,xx為產(chǎn)品布卡,yy為模塊,zz為子模塊
(2) 模塊劃分诫舅,按以下兩種方式均可羽利,但需要項目組統(tǒng)一

  • 按產(chǎn)品業(yè)務劃分,如
    com.brian.example.homepagecom.brian.example.player
  • 按邏輯功能劃分刊懈,如
    com.brian.example.homepage.uicom.brian.example.homepage.logic

3. 類成員命名这弧,參考android源碼,如android.content.pm.PackageManager

(1) 類:public abstract class PackageManager
(2) 函數(shù):public abstract PackageInfogetPackageInfo(String packageName)
(3) 常量:public static final int GET_ACTIVITIES= 0x00000001;
(4) 靜態(tài)變量:static ComponentName sComponent;
(5) 成員變量:ComponentName mComponent;
(6) 臨時變量:ComponentName component;

4. 對于簡單的內部類虚汛,或則DTO(數(shù)據(jù)傳輸對象)匾浪,成員變量名稱可以不帶前綴m

public final class Message implements Parcelable {
    /**
     * User-defined message code so that the recipient can identify 
     * what this message is about. Each {@link Handler} has its own name-space
     * for message codes, so you do not need to worry about yours conflicting
     * with other handlers.
     */
    public int what;

    /**
     * arg1 and arg2 are lower-cost alternatives to using
     * {@link #setData(Bundle) setData()} if you only need to store a
     * few integer values.
     */
    public int arg1;

    /**
     * arg1 and arg2 are lower-cost alternatives to using
     * {@link #setData(Bundle) setData()} if you only need to store a
     * few integer values.
     */
    public int arg2;
}

5. 接口命名,參考android源碼卷哩,如android.view.View.OnClickListener

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

6. 資源命名

(1) 文件名(字母小寫和下劃線組成)

  • activity_main.xml
  • ic_launcher.png

(2) 資源名id(字母小寫和下劃線組成)

  • android:id="@+layout/loading_view"
  • <string name="app_name">應用名稱</string>

代碼排版

1. 文字編碼

(1) 統(tǒng)一使用utf8編碼

2. 縮進對齊

(1) 代碼縮進采用4個空格
(2) 代碼行首蛋辈,合理縮進,以簡潔明了為原則

3. 空格

(1) 條件語句将谊,關鍵字與“(”用空格隔開冷溶,如 if (xx)、while (i > 3)
(2) 注釋內容尊浓,左右用空格隔開逞频,如 // xxx,/* xxx */
(3) 比較操作符栋齿、賦值操作符苗胀、算術操作符、邏輯操作符瓦堵、位操作符基协,等雙目操作符的前后加空格

    if ( (a >= b) && (c <= d) )
    if (size >= MAX_SIZE)
    a = b + c;
    a *= 2;
    a = b ^ 2;

(4) "!"、"~"菇用、"++"澜驮、"--"、"&"(地址運算符)等單目操作符前后不加空格

*p = 'a';
flag = !isEmpty;
p = &mem;
i++;

(5) 逗號惋鸥、分號(非行結束符號)在后面加空格泉唁,前面不加空格

int x = 1, y = 2, z = 3;
function(x, y, z);
for (inti = 0; i < 10; i++)

4. 條件語句(if鹅龄、for、while亭畜、do)

(1) 條件語句,使用完備的括號

if (a == b && c == d) // BAD
if ((a == b) && (c == d))// GOOD

(2) 條件語句迎卤,獨自占一行拴鸵,執(zhí)行語句不得緊跟其他

    // BAD
if (flag) doSomething();

    // GOOD
    if (flag) {
        doSomething();
    }

(3) 條件語句,不論語執(zhí)行句有多少行都要加“{}”

    // BAD
    for (inti = 0; i < 10; i++)
        doSomething();

    // GOOD
    for (inti = 0; i < 10; i++) {
        doSomething();
    }

5. 代碼結構

(1) 一行只寫一條語句

    // BAD
    x = a + b; y = c + d; z = e + f;

    // GOOD
    x = a + b;
    y = c + d;
    z = e + f;

(2) 代碼以“段”來編寫蜗搔,作用相近的代碼寫在一段劲藐,段與段間以空行分開,注釋也相應以“段”來注釋樟凄,如

    public void filterData(Data in, Data out) {

        // 預處理
        clip(in.a + 100);
        clip(in.b + 200);
        clip(in.c + 300);

        // 濾波
        intavg  = (in.a + in.b + in.c) / 3;
        int tmp1 = in.a + avg;
        int tmp2 = in.b - avg;
        int tmp3 = in.c + tmp1 + tmp2;

        // 保存結果
        out.a = tmp1;
        out.b = tmp2;
        out.c = tmp3;
    }

(3) 代碼文件中從上到下聘芜,函數(shù)依次按照調度、被調度的順序出現(xiàn)缝龄,例如

    public void funA() {
        funB();
        ...
    }

    public void funB() {
        ...
    }

代碼注釋

1. 基本原則

(1) 注釋語言必須準確汰现、簡潔、易懂叔壤,能直接反映編程思路
(2) 統(tǒng)一使用中文作為注釋語言瞎饲,除非直接拷貝第三方的英語注釋
(3) 注釋比例沒有嚴格的要求,建議不低于15%
(4) 注釋要與代碼保持一致炼绘,代碼作用變了嗅战,注釋也要更新
(5) 對于邏輯復雜、使用有限制的代碼俺亮,需要重點注釋

2. 必須注釋

(1) 文件
(2) 類
(3) 函數(shù)(對外接口public函數(shù))
(4) 常量
(5) 成員變量(有特殊含義)
(6) 靜態(tài)變量
(7) 特殊邏輯驮捍、定制邏輯、有坑邏輯脚曾、臨時邏輯

3. 建議注釋

(1) 復雜的邏輯
(2) 重要的分支东且,如 if-else,switch-case
(3) 重要的循環(huán)斟珊,說明苇倡,“每次循環(huán)遍歷…”

4. 注釋樣式

(1) 注釋樣式參考android源碼
(2) 代碼以“段”來編寫,注釋也相應以“段”來注釋

    /**
    * 函數(shù)注釋
    */
    public void foo() {
    }

    /**
     * 函數(shù)注釋
     * @param a
     * @param b
     * @return
     */
    public int math(int a, int b) {
    }

    /**
    * 成員變量注釋
    */
    public int mValue;

    // 一段代碼注釋
    xxx
    xxx
    xxx

    xxx
    xxx // 一行代碼注釋
    xxx

    // if分支注釋(1)
    if (true) {
    }
    // else分支注釋(1)
    else {
    }

    if (true) { // if分支注釋(2)
    }
    else { // else分支注釋(2)
    }

    // switch注釋
    switch (xxx) {
        // case注釋(1)
        case xxx : break;
        case xxx : // case注釋(2)
            break;
        default: break;
    }

模塊設計

1. 基本原則

(1) 開放封閉
(2) 單一職責
(3) 倒置依賴
(4) 高內聚低耦合

2. 分層設計

原則上囤踩,程序實現(xiàn)業(yè)務功能時旨椒,按MVC模式,從上至下進行分層設計
(1) 應用層:負責UI展示堵漱、下發(fā)操作指令
(2) 服務層:負責控制邏輯综慎、數(shù)據(jù)維護
(3) 數(shù)據(jù)層:負責底層數(shù)據(jù)獲取,包括網(wǎng)絡勤庐、數(shù)據(jù)庫示惊、文件好港、底層算法

3. 模塊交互

(1) 原則上,下層功能代碼不能import上層業(yè)務的package米罚,如下層操作數(shù)據(jù)庫的類不能import上層UI的activity
(2) 上層模塊調度下層模塊钧汹,通過下層public接口函數(shù)
(3) 下層模塊回調上層模塊,通過interface執(zhí)行回調(不用handler)
(4) 廣播或則單播監(jiān)聽事件录择,同時具有attach和detach操作
(5) 非特殊情況拔莱,調度與回調默認在UI線程執(zhí)行
(6) 非特殊情況,獲取對象的變量統(tǒng)一使用getter隘竭、setter操作

4. 代碼分離

(1) 分開:界面代碼塘秦、數(shù)據(jù)代碼
(2) 分開:業(yè)務相關代碼、底層通用模塊代碼
(3) 分開:基本模塊动看、特殊定制模塊

函數(shù)設計

1. 基本原則

(1) 一個函數(shù)只做一件事
(2) 按抽象層劃分函數(shù)
(3) 向下調度原則
(4) 高扇入低扇出

2. 其他建議

(1) 代碼以“段”編寫尊剔,合理分隔不相關的代碼段
(2) 禁止代碼中實現(xiàn)與函數(shù)名不相關的邏輯
(3) 禁止代碼中出現(xiàn)魔鬼數(shù)字
(4) 避免多處出現(xiàn)雷同的代碼,應提取公共的功能函數(shù)菱皆,或則調整調度入口
(5) 避免嵌套邏輯太深须误,超過3~5層,建議優(yōu)化
(6) 避免復雜的復合判斷條件搔预,建議分拆
(7) 避免山寨臨時邏輯
(8) 函數(shù)的參數(shù)超過5個霹期,則使用參數(shù)對象封裝參數(shù),有助于擴展接口
(9) 降低臨時變量的生命周期
(10)廢棄的代碼及時清理

其他參考

  1. 《Android Code Style》
    https://source.android.com/source/code-style.html

  2. 《Java Programming Style Guidelines》
    http://geosoft.no/development/javastyle.html

  3. 《Google Java Style》
    https://google.github.io/styleguide/javaguide.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拯田,一起剝皮案震驚了整個濱河市历造,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌船庇,老刑警劉巖吭产,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸭轮,居然都是意外死亡臣淤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門窃爷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑蒋,“玉大人,你說我怎么就攤上這事按厘∫降酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵逮京,是天一觀的道長卿堂。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么草描? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任览绿,我火速辦了婚禮,結果婚禮上穗慕,老公的妹妹穿的比我還像新娘饿敲。我一直安慰自己,他們只是感情好逛绵,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布诀蓉。 她就那樣靜靜地躺著,像睡著了一般暑脆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狐肢,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天添吗,我揣著相機與錄音,去河邊找鬼份名。 笑死碟联,一個胖子當著我的面吹牛,可吹牛的內容都是我干的僵腺。 我是一名探鬼主播鲤孵,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辰如!你這毒婦竟也來了普监?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤琉兜,失蹤者是張志新(化名)和其女友劉穎凯正,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豌蟋,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡廊散,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梧疲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片允睹。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幌氮,靈堂內的尸體忽然破棺而出缭受,到底是詐尸還是另有隱情,我是刑警寧澤浩销,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布贯涎,位于F島的核電站,受9級特大地震影響慢洋,放射性物質發(fā)生泄漏塘雳。R本人自食惡果不足惜陆盘,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望败明。 院中可真熱鬧隘马,春花似錦、人聲如沸妻顶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讳嘱。三九已至幔嗦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沥潭,已是汗流浹背邀泉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钝鸽,地道東北人汇恤。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像拔恰,于是被迫代替她去往敵國和親因谎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 參考資料:我總結的Android編程規(guī)范 1. 命名規(guī)則 1.1 類名颜懊,接口名: 以大寫開頭财岔,如果一個類的類名由多...
    Coder_Y閱讀 2,785評論 12 60
  • 前言 通過建立代碼編寫規(guī)范,形成Android編碼約定饭冬,提高程序的可靠性使鹅、可讀性、可修改性昌抠、可維護性患朱、一致性,保證...
    yabin小站閱讀 1,170評論 1 13
  • 架構&分包 -- 原則 包名應讓人一目知意:英文命名描述其功能炊苫。 分包層次應盡可能的低裁厅,減短包名長度。 Model...
    zhazhaxin閱讀 1,738評論 3 48
  • 今早去楊老師哪兒拿之前落下她哪兒的資料侨艾,遇見了之前因為出國項目認識的一個姑娘执虹,我倆一樣的都是簽證幾次都沒過,但還是...
    Miss邱閱讀 275評論 0 1