Android 專案規範

위엄위엄發表於2017-03-24

通常我們為了專案的維護會定下一系列的規範開發來提高自己或者團隊之間的寫程式碼的效率,正所謂無規矩不成方圓。

Hello Android.jpg
Android Studio的使用

Android 開發首選 Android Studio,一個好的IDE能讓你事半功倍。編碼規範使用 Android Studio 預設的模板規範即可,這也是比較方便的方法。同時也要注意以下幾點,可以讓你的團隊協作更加協調:

1.統一調整 IDE 的編碼方式為 UTF-8
2.編輯完程式碼後不要忘記格式化(即 Ctrl+Alt+L 快捷鍵)
3.儘量保證團隊之間的 IDE 版本與 Gradle 版本一致,最好的做法是及時更新保證與官方最新版一致。
4.程式碼提交前進行程式碼檢查(Analyze->Inspect Code),可以消除程式碼中的警告,減少不必要的錯誤。
5.擅用 //TODO 註釋來標記未做完或需要其他人接手的工作
6.善用AS外掛來提高開發效率,像 GsonFormat——將json字串轉換成一個Java實體類的工具,CodeGlance——在右邊可以預覽程式碼,實現快速定位等工具都是非常棒的。
命名規範

最有效的命名方式是使用英文拼寫和語法,可以讓閱讀者易於理解,儘量避免使用中文拼音的情況(常見地名和通用名稱例外,比如HangZhou,alibaba等)。禁止使用中英文混合或者完全中文的方式。

包名

通常一個app需要一個頂級包名,而這個包名通常跟公司的域名相關。一級包名是頂級域名,通常為com,edu,gov,net,org等,二級包名為公司名,三級包名根據應用進行命名。

比如我的個人域名為 cpacm.net,那麼我個人所做的app包名一般為net.cpacm.yourappname。

再來說如何分包?
分包的方式說法不一,有的人喜歡按照層次來分,比如說將所有 Activity 放在同一個包下。有的人喜歡按照功能來分,將一個功能的 Activity、Model和Adapter等一些檔案放入同一個包內。具體的例子可以參考谷歌的 iosched 樣例。

我個人比較推薦的方式是按照功能進行分包,但同時會將資料層再單獨分離出來,詳細的例子可以看看我之前寫的文章——說說我自己常用的 Android 架構。不過每個人的習慣並不一致,所以在這點上可以隨意發揮,只要不導致整個專案結構混亂就成。

類名

一個類會包含(按順序地):

許可證或版權資訊(如有需要)
package語句
import語句
一個頂級類
四個部分用一個空行隔開。
類名都以 UpperCamelCase 風格編寫。

在 Android 中與系統相關的類通常以元件名為字尾標識。

Activity 類,命名為 Activity 為字尾,如 LoginActivity
Fragment 類,命名以 Fragment 為字尾,如 LoginFragment
Service 類,命名以 Service 為字尾,如 DownloadService
BroadcastReceiver類,命名以Receiver為字尾,如 JPushReceiver
ContentProvider類, 命名以Provider為字尾,如ShareProvider
Adapter 類,命名以 Adapter 為字尾,如 ListAdapter
其他一些常見的命名:

工具管理類,命名以 Utils 或者 Manager 為字尾,如 EncryptUtils,UserManager
實體類,命名以 Bean 或者 Info 為字尾,如 UserBean
介面實現類,命名以 Impl 或者 Listener 為字尾,如 ApiImpl
資料庫類,命名以 Dao 或者 DbHelper 為字尾,如 UserDao
自定義控制元件類,命名以 View 或者 Layout 為字尾,如 SimpleSliderLayout
方法名

方法名都以 lowerCamelCase 風格編寫。

方法名通常是動詞或動詞短語。下劃線可能出現在JUnit測試方法名稱中用以分隔名稱的邏輯元件。並不存在唯一正確的方式來命名測試方法。

常見的方法名稱:

方法 說明
getXX()/setXX() 獲取/設定屬性值,如 getUserName()
isXX()/checkXX()/hasXX() 用於返回 Boolean 值的方法,如 isGirl(),hasPermission()
initXX() 初始化相關方法,如 initView()
loadXX()/handleXX() 讀取資料或者對資料處理時的方法,如 loadData()
disPlayXX()/showXX() 顯示相關資訊,如 showToast()
… …
一般方法的命名都是以動詞為字首,後面加上動作的物件。
常量名

常量名命名模式為 CONSTANT_CASE,全部字母大寫,用下劃線分隔單詞。

// Constant
static final int NUMBER = 5;

// Not constant
static String nonFinal = “non-final”;
這些名字通常是名詞或名詞短語。

每個常量都是一個靜態final欄位,但不是所有靜態final欄位都是常量。在決定一個欄位是否是一個常量時, 考慮它是否真的感覺像是一個常量。

變數名

在Google其它程式語言風格中使用的特殊字首或字尾,如name_, mName, s_name和kName,在Java程式設計風格中都不再使用。
現在在 Android 非常量欄位名的命名有兩種方式,一種是在特定的欄位名上加上特殊字首或字尾,如普通成員變數命名以 mCamelCase 樣式命名,靜態變數以 sCamelCase 命名。另一種則是完全使用 lowerCamelCase 命名,如 camelCase 變數名。

雖然兩種命名方式都可,但切記不要在同一個專案中同時使用,這樣只會讓程式碼看得糟糕。當然個人推薦變數名以 lowerCamelCase 風格編寫。

引數名,區域性變數名以 lowerCamelCase 風格編寫

臨時變數通常被取名為i、j、k、m和n,它們一般用於整型;c、d、e,它們一般用於字元型。

型別變數可用以下兩種風格之一進行命名:

單個的大寫字母,後面可以跟一個數字(如:E, T, X, T2)。
以類命名方式,後面加個大寫的T(如:RequestT, FooBarT)。
關於Android中相關控制元件的命名,控制元件變數命名可以在字尾加上控制元件名稱或者控制元件名稱的縮寫,如login+Button=loginButton/loginBtn。平常習慣控制元件名縮寫的話推薦使用控制元件名稱的縮寫來作為字尾。

Android 資原始檔

Android資原始檔基本上都採取使用下劃線_來連線詞語。

佈局檔案 layout

必須全部單詞小寫,單詞間以下劃線分割,使用名詞或名詞片語

介面相關佈局

命名方式為 介面_模組.xml
通常 Activity 或者 Fragment 等類名要與其佈局檔案相對應,如:

LoginActivity.java -> activity_login.xml
BookFragment.java -> fragment_book.xml
DateDialog.java -> dialog_date.xml
SettingPopupWindow.java -> ppw_setting.xml

列表項佈局

命名方式為 控制元件_模組_item.xml

一般關於列表項的命名則以 item 作為字首,如:item_user.xml 表示這個佈局檔案用在使用者列表中。

但我更喜歡下面這種方式的命名:
listview_user_item -> 表示這是用於 listview 的使用者列表項。
recyclerview_user_item -> 表示這是用於 recyclerview 的使用者列表項。
gridview_user_item -> 表示這是用於 gridview 的使用者列表項。

而此時你自定義了一個 GroupView 需要列表項去填充,比如說一個 RefreshLayout:
refresh_user_item -> 表示這是用於 RefreshLayout 的使用者列表項。

包含項

命名方式為 模組_描述.xml
在介面佈局中,如 activity_user_header 表示為使用者介面的頭部佈局。
在列表佈局中,如 listview_user_header 表示為使用者列表的頭部佈局。

圖片資源 drawable

全部小寫,採用下劃線命名法,加字首區分

用途 命名規則 名稱
圖示 ic_模組名[_用途] ic_home 或 ic_media_info
普通檔案 模組_用途[_狀態描述] search_background 或者 layerlist_progress_horizontal 或者 btn_xx_focused
動畫資源 anim

也是要全部小寫,使用下劃線來分隔片語。
命名規則為 模組_用途[_狀態描述],如:

fade_out->淡出
push_down_in->從下方推入
選單資源 menu

命名規則為: menu_模組[_用途]
如:menu_shelf -> 表示為書架上的選單選項
其中選單內部的id命名規則為 action_用途,如:action_manage

好吧,其實資源的命名沒有那麼多死板的規則,只要能看到自己命名的名字能立馬明白它的作用就行了。當然不止自己也必須讓團隊的其他人能明白。

Values下的命名方式

色調(color)

禁止在layout直接使用 “#000000” 賦予顏色,
在你的colors.xml檔案中應該只是對映顏色的名稱一個ARGB值,而沒有其它的。不要為特定的UI定義特定的顏色值,這樣只會導致顏色值重複定義。

Don`t

  <color name="chapter_select_area_bg">#fff5f5f5</color>
    <color name="content_text_color">#ff404040</color>
    <color name="et_hit_text_color">#ffacacac</color>

Do

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <!-- 常用字型顏色 -->
    <color name="black">#000000</color>
    <color name="black_alpha">#8A000000</color>
    <color name="black_alpha_more">#64000000</color>
    <color name="black_normal">#DE000000</color>
    <color name="white">#FFFFFF</color>
    <color name="white_alpha">#8AFFFFFF</color>
    <color name="white_normal">#DEFFFFFF</color>
    <color name="white_normal_more">#33FFFFFF</color>
    <color name="white_less">#FFFAFA</color>


    <color name="transparent">#00000000</color>
</resources>

一個美觀的 app 是不會充斥太多無用的色彩的。
尺寸(dimen)

儘量遵循 Material Design 的設計標準,比如字型的大小,頁面左右空白16dp,列表上下間隔8dp等。

<resources>

    <dimen name="horizontal_margin">16dp</dimen>
    <dimen name="vertical_margin">16dp</dimen>
    <dimen name="horizontal_padding">16dp</dimen>
    <dimen name="vertical_padding">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>

    <!-- 頁面統一間距 -->
    <dimen name="title_height">48dp</dimen>
    <dimen name="toolbar_height">48dp</dimen>
    <dimen name="tab_height">48dp</dimen>
    <dimen name="bar_height">56dp</dimen>
    <dimen name="edittext_height">56dp</dimen>
    <dimen name="caption_height">24dp</dimen>
    <dimen name="line_height">8dp</dimen>
    <dimen name="line_height_half">4dp</dimen>
    <dimen name="line_height_double">16dp</dimen>
    <dimen name="layout_height">72dp</dimen>

    <!-- 字型大小 -->
    <dimen name="text_display3">56sp</dimen>
    <dimen name="text_display2">45sp</dimen>
    <dimen name="text_display1">34sp</dimen>
    <dimen name="text_headline">24sp</dimen>
    <dimen name="text_title">20sp</dimen>
    <dimen name="text_subhead">16sp</dimen>
    <dimen name="text_body">14sp</dimen>
    <dimen name="text_caption">12sp</dimen>
    <dimen name="text_mini">10sp</dimen>
    <dimen name="text_menu">14sp</dimen>
    <dimen name="text_button">16sp</dimen>
    <dimen name="text_navi">18sp</dimen>

</resources>

儘量不要直接在佈局檔案裡面寫上具體的數值。
字串(string)

strings的name命名使用下劃線命名法,採用以下規則:模組名+邏輯名稱,
同樣,禁止在程式碼中或者layout中直接填入字元,請在string.xml加入字串。最好是按模組來分隔開字串便於查詢和修改,公用的寫在最開始位置。

<resources>
    <string name="app_name">cpacm</string>

    <string name="open_string">open</string>
    <string name="close_string">close</string>

    <!--####################  Home模組  #####################-->

    <!-- bottom navi -->
    <string name="free">休閒</string>
    <string name="news">資訊</string>
    <string name="beauty">風采</string>
    <string name="study">學習</string>
    <string name="contract">互動</string>

    <!--#####################  Free模組  #####################-->
    <!-- tab -->
    <string name="music">音樂</string>
    <string name="movie">電影</string>
    <string name="book">圖書</string>

</resources>

所有文字放在 strings.xml 中可以很方便的轉換多國語言。
樣式(style)

style的name命名使用大駝峰命名法。
當某部分xml屬性程式碼重複過多時,請將其變成 style 以便重複利用。

<style name="ContentText">
    <item name="android:textSize">@dimen/font_normal</item>
    <item name="android:textColor">@color/basic_black</item>
</style>

自定義屬性(attr)

attr的name命名使用大駝峰命名法。
在自定義控制元件或其他地方需要自定義屬性名稱時,除去直接加入attrs.xml中也可以新建一個 attr 檔案,並在 attr 後加上功能名稱。
如 attr_slider 表示一個輪播器控制元件的自定義屬性。

layout內的id命名

命名模式為:模組名_view縮寫,比如 search_btn

註釋

類註釋

每個類都必須要寫上

建立時間
作者
類的作用描述
版本和聯絡方式(可選)
這樣團隊就能知道這個類的作用是什麼,原生產者是誰。

/**
 * <pre>
 *     author : cpacm
 *     e-mail : xxx@xx
 *     date   : 2017/03/21
 *     description   : xxxx描述
 *     version: 1.0
 * </pre>
 */
public class MainActivity {
      ...
}

在 Android Studio 中 Settings → Editor → File and Code Templates → Includes → File Header,輸入模板。

方法註釋

每個成員方法都應該有一個頭註釋,告訴我們這個方法做了什麼,返回了什麼。

/**
 * snackbar的顯示
 */
public void showSnackBar(View view, @StringRes int toast) {
    Snackbar.make(view, getString(toast), Snackbar.LENGTH_SHORT).show();
}

設定Fix doc comment(Settings → Keymap → Fix doc comment)快捷鍵,AS便會生成模板。

塊/行註釋

主要作用是為一些程式碼進行補充說明,防止自己或團隊的其他人無法理解程式碼的含義。

//指向書城介面
viewPager.setCurrentItem(2, false);
總結
上面的規範只是給個參考,適合自己或團隊才是最好的。養成好的命名習慣才能寫出優美的程式碼,這需要長時間的堅持才能培養出來。說實話,其實英語基礎才是最重要的XD.
Java 更多的編寫風格可以參考:Google Java 命名規範

相關文章