1. 程式人生 > >Android 編碼規範V1.0

Android 編碼規範V1.0

1 程式碼規範

1.1排版規範

1、原始檔編碼

  1. 所有原始檔編碼均為UTF-8
  2. 縮排為4個space,(不使用tab)
  3. 每行不超過200個字元,超過需要折行

2、空格、空行

  1. 左右的變數,操作符,引數之間必須加入空格

Bad Example:(操作符’if’、’=’的前後沒有空格)


  Profile profile=getUserInfo(param.getReqHead().getUserId());
  GetUserInfoResp resp=new GetUserInfoResp();
  if(profile!=null){
        BeanUtils.copyProperties
(profile, resp); } resp.setUserType(authInfoService.getAuthStatus(param.getReqHead().getUserId())); return resp;

Bad Example:(花括號沒有換行)


   if(profile!=null){BeanUtils.copyProperties(profile, resp);}

3、屬性順序

方法的屬性順序為public、protected、private

4、大括號

  1. 列表內容

    起始大括號不要單獨佔一行,結束的大括號獨立成行

Bad Example:


if (condition)
{
    //do something
}

正確:


if (condition) {
    //do something
}

2.若程式碼塊內只有一行語句,則也不能省略大括號。
Bad Example:


if (gpsFightInfo == null)
    showLoadingScreen(SCREEN_ACTION_RESUME, 0, 1.0f);
else
    showLoadingScreen(SCREEN_ACTION_RESUME, 0, 0.5f);

for (int i = 0; i < headers.
length; i++) headers[i] = headers[i].toLowerCase();

正確:


if (gpsFightInfo == null) {
    showLoadingScreen(SCREEN_ACTION_RESUME, 0, 1.0f);
} else {
    showLoadingScreen(SCREEN_ACTION_RESUME, 0, 0.5f);
}           
for (int i = 0; i < headers.length; i++) {
    headers[i] = headers[i].toLowerCase();
}

1.2註釋

1、使用標準javadoc(CTRL+ALT+J)使用template

2、 public的/class/interface/enum需要註釋

3、 public的field/method需要註釋

4、 必須寫在上面,不能換行

Bad Example 1:


    private Integer opType;// 0 新建 1修改

Bad Example 2:


    // 0 新建 1修改
    private Integer opType;

正確:


    /** 操作狀態 0 新建 1修改 */
    private Integer opType;

1.3命名規範

不要小看命名,不合適的命名會帶來很大的閱讀障礙,也加大後期的重構與維護成本。

1、基礎命名規範

  1. 包名
    包名全部小寫,連續的單詞只是簡單地連線起來,不使用下劃線。
    採用反域名命名規則,全部使用小寫字母。一級包名為com,二級包名為xx(可以是公司或則個人的隨便),三級包名根據應用進行命名,四級包名為模組名或層級名。
    例如:com.cmcc.hemuyi.discovery
包名 此包中包含
com.xx.應用名稱縮寫.activity 頁面用到的Activity類 (activitie層級名使用者介面層)
com.xx.應用名稱縮寫.base 基礎共享的類
com.xx.應用名稱縮寫.adapter 頁面用到的Adapter類 (介面卡的類)
com.xx.應用名稱縮寫.util 此包中包含:公共工具方法類(util模組名)
com.xx.應用名稱縮寫.bean 下面可分:vo、po、dto 此包中包含:JavaBean類
com.xx.應用名稱縮寫.model 此包中包含:模型類
com.xx.應用名稱縮寫.db 資料庫操作類
com.xx.應用名稱縮寫.view (或者 com.xx.應用名稱縮寫.widget ) 自定義的View類等
com.xx.應用名稱縮寫.service Service服務
com.xx.應用名稱縮寫.receiver BroadcastReceiver服務

注意:
如果專案採用MVP,所有M、V、P抽取出來的介面都放置在相應模組的i包下,所有的實現都放置在相應模組的impl下。

  1. class/interface/enum的命名使用PascalCase
    AssetManager
    Screen
    ScreenType

  2. method的命名使用camelCase


public void loadEssentialAssets();

4.private 或者protected field使用“m”字首(m的含義為member),其他部分使用PascalCase


private AssetManager mAssetManager;

5.static field使用g字首(g的含義為global),其他部分使用PascalCase


private static Class[] gClassArray;

6.constants的命名為FULL_UPPER_CASE,且用下劃線分割單詞


public static final int ACCESS_RANDOM = 1;
public static final String FONT_HP_PATH = "fonts/hp.fnt";
  1. enum中各欄位的命名為PascalCase,且每個欄位獨立成行

public enum Element {
    Earth,
    Hero,
    WaterFire
}
  1. 命名必須是自解釋的、有意義的,不要用i、j、k等名字命名

2 、命名必須使用合理、常用的英文單詞,或行業術語,杜絕用冷門詞彙

  1. 縮寫的使用必須參考縮寫規範表,不在縮寫規範表裡的不許用
  2. Method名字需要是doSomething
  3. Class名字需要是NamePhrase(首字母大寫)
  4. 資料型別不需要加字首、匈牙利命名法

3、 基本資料型別命名規範

Integer:int+描述 Char:chr+描述 Boolean:bln+描述

Long:lng+描述 Short:shr +描述 Double:dbl+描述

String:str+描述 Float:flt+描述 Single:sng+描述

DataTime:dt+描述 Array:arr+描述 Object:obj+描述

如:String srtName;

4、 Java程式碼根據資源型別命名

  1. Activity命名:xxxxActivity
  2. Fragment命名:xxxxFragment
  3. View命名:xxxxView 或者 xxxxLayout
  4. Dialog命名:xxxxDialog
  5. Service命名:xxxxService
  6. BroadcastReceiver命名:xxxxReceiver

5、資原始檔命名

  1. Layout檔案命名:
    Activity的Content View應使用:activity_xxxx.xml 的形式
    自定義View應使用:view_xxxx.xml
    adapter的列表專案使用:item_xxxx.xml
    dialog的佈局使用dialog_xxxx.xml
    PopupWindow命名:ppw_xxxx.xml

  2. drawable檔案
    檔名全部小寫,寫明按鈕的具體作用和狀態,單詞之間使用下劃線連線。
    login_normal.png
    login_pressed.png
    login_focused.png
    xxxx_checked.png
    xxxx_focused.png
    xxxx_selected.png
    xxxx_pressed.png
    xxxx_disabled.png
    xxxx_normal.png

多狀態drawable檔案命名xxxx_bg.xml


al_discovery_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon_discovery_checked" android:state_checked="true"/>
    <item android:drawable="@drawable/icon_discovery_checked" android:state_pressed="true"/>
    <item android:drawable="@drawable/icon_discovery_normal" android:state_checked="false"/>
</selector>
  1. layout中的id命名
    命名模式為:view的邏輯名稱_view縮寫
    username_tv(展示使用者名稱的TextView)

2 工具使用規範

Android Studio 工具設定,主要是程式碼格式化設定:
file——》settings——》keymap在keymap中選擇eclipse,選擇了copy一下,保留原來的eclipse的快捷鍵版本,然後新增加了一個eclipse copy的快捷鍵版本。在搜尋框裡搜尋formatcode,確保快捷鍵是Ctrl+shift+F,這樣就和eclipse一樣的format方式。

自動化工具檢查程式碼規範
專案中配置checkstyle、PMD、findbugs,利用這幾個工具進行程式碼規範檢查,進而提到程式碼質量。

3 提高程式碼質量

(1)刪除無用的變數

(2)刪除無用的引入

(3)對於可以複用的部分,一定提取成共用的方法,減少程式碼量

(4)變數/方法命名一定要符合清晰易懂,不用太在乎長度

(5)程式碼完成後,進行code review,減少出錯機率

(6) 用適合的方式儘量去思考設計模式方式來進行開發

(7)程式碼書寫注意事項

  1. item框整個item點選範圍
  2. 文字長度限制,太長會導致的換行壓住別的控制元件的問題
  3. 彈出框生命週期
  4. 空指標判定
  5. list的 item都沒有了的空白頁提示
  6. list裡面進行刪除操作的時候,不能直接remove,否則會導致java.util.ConcurrentModificationException
  7. 按鈕多次點選處理方式
  8. json 請求響應物件,用基本物件型別,不用基本資料型別,比如用Integer,不用int 。這樣資料就沒有預設值,就是空。
  9. 使用RxJava 注意要訂閱和取消訂閱;