規(guī)范你的 Android 項(xiàng)目

通常我們?yōu)榱隧?xiàng)目的維護(hù)會定下一系列的規(guī)范開發(fā)來提高自己或者團(tuán)隊(duì)之間的寫代碼的效率,正所謂無規(guī)矩不成方圓。

Hello Android.jpg

Android Studio的使用

Android 開發(fā)首選 Android Studio,一個(gè)好的IDE能讓你事半功倍。編碼規(guī)范使用 Android Studio 默認(rèn)的模板規(guī)范即可,這也是比較方便的方法。同時(shí)也要注意以下幾點(diǎn),可以讓你的團(tuán)隊(duì)協(xié)作更加協(xié)調(diào):

  1. 統(tǒng)一調(diào)整 IDE 的編碼方式為 UTF-8
  2. 編輯完代碼后不要忘記格式化(即 Ctrl+Alt+L 快捷鍵)
  3. 盡量保證團(tuán)隊(duì)之間的 IDE 版本與 Gradle 版本一致,最好的做法是及時(shí)更新保證與官方最新版一致。
  4. 代碼提交前進(jìn)行代碼檢查(Analyze->Inspect Code),可以消除代碼中的警告,減少不必要的錯(cuò)誤。
  5. 擅用 //TODO 注釋來標(biāo)記未做完或需要其他人接手的工作
  6. 善用AS插件來提高開發(fā)效率,像 GsonFormat——將json字符串轉(zhuǎn)換成一個(gè)Java實(shí)體類的工具,CodeGlance——在右邊可以預(yù)覽代碼,實(shí)現(xiàn)快速定位等工具都是非常棒的。

命名規(guī)范

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

包名

通常一個(gè)app需要一個(gè)頂級包名,而這個(gè)包名通常跟公司的域名相關(guān)。一級包名是頂級域名,通常為com,edu,gov,net,org等,二級包名為公司名,三級包名根據(jù)應(yīng)用進(jìn)行命名。

比如我的個(gè)人域名為 cpacm.net,那么我個(gè)人所做的app包名一般為net.cpacm.yourappname。

再來說如何分包?
分包的方式說法不一,有的人喜歡按照層次來分,比如說將所有 Activity 放在同一個(gè)包下。有的人喜歡按照功能來分,將一個(gè)功能的 Activity、ModelAdapter等一些文件放入同一個(gè)包內(nèi)。具體的例子可以參考谷歌的 iosched 樣例。

我個(gè)人比較推薦的方式是按照功能進(jìn)行分包,但同時(shí)會將數(shù)據(jù)層再單獨(dú)分離出來,詳細(xì)的例子可以看看我之前寫的文章——說說我自己常用的 Android 架構(gòu)。不過每個(gè)人的習(xí)慣并不一致,所以在這點(diǎn)上可以隨意發(fā)揮,只要不導(dǎo)致整個(gè)項(xiàng)目結(jié)構(gòu)混亂就成。

類名

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

  1. 許可證或版權(quán)信息(如有需要)
  2. package語句
  3. import語句
  4. 一個(gè)頂級類
    四個(gè)部分用一個(gè)空行隔開。

類名都以 UpperCamelCase 風(fēng)格編寫。

在 Android 中與系統(tǒng)相關(guān)的類通常以組件名為后綴標(biāo)識。

  • Activity 類,命名為 Activity 為后綴,如 LoginActivity
  • Fragment 類,命名以 Fragment 為后綴,如 LoginFragment
  • Service 類,命名以 Service 為后綴,如 DownloadService
  • BroadcastReceiver類,命名以Receiver為后綴,如 JPushReceiver
  • ContentProvider類, 命名以Provider為后綴,如ShareProvider
  • Adapter 類,命名以 Adapter 為后綴,如 ListAdapter

其他一些常見的命名:

  • 工具管理類,命名以 Utils 或者 Manager 為后綴,如 EncryptUtils,UserManager
  • 實(shí)體類,命名以 Bean 或者 Info 為后綴,如 UserBean
  • 接口實(shí)現(xiàn)類,命名以 Impl 或者 Listener 為后綴,如 ApiImpl
  • 數(shù)據(jù)庫類,命名以 Dao 或者 DbHelper 為后綴,如 UserDao
  • 自定義控件類,命名以 View 或者 Layout 為后綴,如 SimpleSliderLayout

方法名

方法名都以 lowerCamelCase 風(fēng)格編寫。

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

常見的方法名稱:

方法 說明
getXX()/setXX() 獲取/設(shè)置屬性值,如 getUserName()
isXX()/checkXX()/hasXX() 用于返回 Boolean 值的方法,如 isGirl(),hasPermission()
initXX() 初始化相關(guān)方法,如 initView()
loadXX()/handleXX() 讀取數(shù)據(jù)或者對數(shù)據(jù)處理時(shí)的方法,如 loadData()
disPlayXX()/showXX() 顯示相關(guān)信息,如 showToast()
... ...

一般方法的命名都是以動詞為前綴,后面加上動作的對象。

常量名

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

// Constant
static final int NUMBER = 5;

// Not constant
static String nonFinal = "non-final";

這些名字通常是名詞或名詞短語。

每個(gè)常量都是一個(gè)靜態(tài)final字段,但不是所有靜態(tài)final字段都是常量。在決定一個(gè)字段是否是一個(gè)常量時(shí), 考慮它是否真的感覺像是一個(gè)常量。

變量名

在Google其它編程語言風(fēng)格中使用的特殊前綴或后綴,如name_, mName, s_name和kName,在Java編程風(fēng)格中都不再使用。

現(xiàn)在在 Android 非常量字段名的命名有兩種方式,一種是在特定的字段名上加上特殊前綴或后綴,如普通成員變量命名以 mCamelCase 樣式命名,靜態(tài)變量以 sCamelCase 命名。另一種則是完全使用 lowerCamelCase 命名,如 camelCase 變量名。

雖然兩種命名方式都可,但切記不要在同一個(gè)項(xiàng)目中同時(shí)使用,這樣只會讓代碼看得糟糕。當(dāng)然個(gè)人推薦變量名以 lowerCamelCase 風(fēng)格編寫。

參數(shù)名,局部變量名以 lowerCamelCase 風(fēng)格編寫

臨時(shí)變量通常被取名為i、j、k、m和n,它們一般用于整型;c、d、e,它們一般用于字符型。

類型變量可用以下兩種風(fēng)格之一進(jìn)行命名:

  1. 單個(gè)的大寫字母,后面可以跟一個(gè)數(shù)字(如:E, T, X, T2)。
  2. 以類命名方式,后面加個(gè)大寫的T(如:RequestT, FooBarT)。

關(guān)于Android中相關(guān)控件的命名,控件變量命名可以在后綴加上控件名稱或者控件名稱的縮寫,如login+Button=loginButton/loginBtn。平常習(xí)慣控件名縮寫的話推薦使用控件名稱的縮寫來作為后綴。

Android 資源文件

Android資源文件基本上都采取使用下劃線_來連接詞語。

布局文件 layout

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

界面相關(guān)布局

命名方式為 界面_模塊.xml
通常 Activity 或者 Fragment 等類名要與其布局文件相對應(yīng),如:

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

列表項(xiàng)布局

命名方式為 控件_模塊_item.xml

一般關(guān)于列表項(xiàng)的命名則以 item 作為前綴,如:item_user.xml 表示這個(gè)布局文件用在用戶列表中。

但我更喜歡下面這種方式的命名:
listview_user_item -> 表示這是用于 listview 的用戶列表項(xiàng)。
recyclerview_user_item -> 表示這是用于 recyclerview 的用戶列表項(xiàng)。
gridview_user_item -> 表示這是用于 gridview 的用戶列表項(xiàng)。

而此時(shí)你自定義了一個(gè) GroupView 需要列表項(xiàng)去填充,比如說一個(gè) RefreshLayout:
refresh_user_item -> 表示這是用于 RefreshLayout 的用戶列表項(xiàng)。

包含項(xiàng)

命名方式為 模塊_描述.xml
在界面布局中,如 activity_user_header 表示為用戶界面的頭部布局。
在列表布局中,如 listview_user_header 表示為用戶列表的頭部布局。

圖片資源 drawable

全部小寫,采用下劃線命名法,加前綴區(qū)分

用途 命名規(guī)則 名稱
圖標(biāo) ic\_模塊名[\_用途] ic_home 或 ic_media_info
普通文件 模塊\_用途[\_狀態(tài)描述] search_background 或者 layerlist_progress_horizontal 或者 btn_xx_focused

動畫資源 anim

也是要全部小寫,使用下劃線來分隔詞組。
命名規(guī)則為 模塊_用途[_狀態(tài)描述],如:

fade_out->淡出
push_down_in->從下方推入

菜單資源 menu

命名規(guī)則為: menu_模塊[_用途]
如:menu_shelf -> 表示為書架上的菜單選項(xiàng)
其中菜單內(nèi)部的id命名規(guī)則為 action_用途,如:action_manage

好吧,其實(shí)資源的命名沒有那么多死板的規(guī)則,只要能看到自己命名的名字能立馬明白它的作用就行了。當(dāng)然不止自己也必須讓團(tuán)隊(duì)的其他人能明白。

Values下的命名方式

色調(diào)(color)

禁止在layout直接使用 “#000000” 賦予顏色,
在你的colors.xml文件中應(yīng)該只是映射顏色的名稱一個(gè)ARGB值,而沒有其它的。不要為特定的UI定義特定的顏色值,這樣只會導(dǎo)致顏色值重復(fù)定義。

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>

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

尺寸(dimen)

盡量遵循 Material Design 的設(shè)計(jì)標(biāo)準(zhǔn),比如字體的大小,頁面左右空白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>

    <!-- 頁面統(tǒng)一間距 -->
    <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>

盡量不要直接在布局文件里面寫上具體的數(shù)值。

字符串(string)

strings的name命名使用下劃線命名法,采用以下規(guī)則:模塊名+邏輯名稱,
同樣,禁止在代碼中或者layout中直接填入字符,請?jiān)?code>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">風(fēng)采</string>
    <string name="study">學(xué)習(xí)</string>
    <string name="contract">互動</string>

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

</resources>

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

樣式(style)

style的name命名使用大駝峰命名法。
當(dāng)某部分xml屬性代碼重復(fù)過多時(shí),請將其變成 style 以便重復(fù)利用。

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

自定義屬性(attr)

attr的name命名使用大駝峰命名法。
在自定義控件或其他地方需要自定義屬性名稱時(shí),除去直接加入attrs.xml中也可以新建一個(gè) attr 文件,并在 attr 后加上功能名稱。
attr_slider 表示一個(gè)輪播器控件的自定義屬性。

layout內(nèi)的id命名

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

注釋

類注釋

每個(gè)類都必須要寫上

  1. 創(chuàng)建時(shí)間
  2. 作者
  3. 類的作用描述
  4. 版本和聯(lián)系方式(可選)
    這樣團(tuán)隊(duì)就能知道這個(gè)類的作用是什么,原生產(chǎn)者是誰。
/**
 * <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,輸入模板。

方法注釋

每個(gè)成員方法都應(yīng)該有一個(gè)頭注釋,告訴我們這個(gè)方法做了什么,返回了什么。

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

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

塊/行注釋

主要作用是為一些代碼進(jìn)行補(bǔ)充說明,防止自己或團(tuán)隊(duì)的其他人無法理解代碼的含義。

//指向書城界面
viewPager.setCurrentItem(2, false);

總結(jié)

上面的規(guī)范只是給個(gè)參考,適合自己或團(tuán)隊(duì)才是最好的。養(yǎng)成好的命名習(xí)慣才能寫出優(yōu)美的代碼,這需要長時(shí)間的堅(jiān)持才能培養(yǎng)出來。說實(shí)話,其實(shí)英語基礎(chǔ)才是最重要的XD.
Java 更多的編寫風(fēng)格可以參考:Google Java 命名規(guī)范


參考資料:

  1. Google Java 命名規(guī)范
  2. 安卓開發(fā)規(guī)范
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • 文章來自https://github.com/Blankj/AndroidStandardDevelop#安卓開發(fā)...
    小莊bb閱讀 896評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 請看完結(jié)版:Android開發(fā)規(guī)范(完結(jié)版)
    Blankj閱讀 8,720評論 25 115
  • 學(xué)會分享 文/侯國華 大多數(shù)人都看見小孩都喜歡逗他們玩,尤其是看見他們正在吃好吃的東西時(shí),就問她給不給你吃,給了,...
    南風(fēng)窗A閱讀 365評論 1 0

友情鏈接更多精彩內(nèi)容