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

通常我們?yōu)榱隧?xiàng)目的維護(hù)會(huì)定下一系列的規(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è)頂級(jí)包名事秀,而這個(gè)包名通常跟公司的域名相關(guān)。一級(jí)包名是頂級(jí)域名野舶,通常為com,edu,gov,net,org等易迹,二級(jí)包名為公司名,三級(jí)包名根據(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í)會(huì)將數(shù)據(jù)層再單獨(dú)分離出來,詳細(xì)的例子可以看看我之前寫的文章——說說我自己常用的 Android 架構(gòu)含懊。不過每個(gè)人的習(xí)慣并不一致身冬,所以在這點(diǎn)上可以隨意發(fā)揮,只要不導(dǎo)致整個(gè)項(xiàng)目結(jié)構(gòu)混亂就成岔乔。

類名

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

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

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

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

  • 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)格編寫徽鼎。

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

常見的方法名稱:

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

一般方法的命名都是以動(dòng)詞為前綴啰扛,后面加上動(dòng)作的對(duì)象。

常量名

常量名命名模式為 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í)使用末秃,這樣只會(huì)讓代碼看得糟糕概页。當(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 等類名要與其布局文件相對(duì)應(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

動(dòng)畫資源 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定義特定的顏色值舶斧,這樣只會(huì)導(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 是不會(huì)充斥太多無用的色彩的察皇。

尺寸(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中直接填入字符,請(qǐng)?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">互動(dòng)</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í),請(qǐng)將其變成 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便會(huì)生成模板蜂嗽。

塊/行注釋

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

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

總結(jié)

上面的規(guī)范只是給個(gè)參考植旧,適合自己或團(tuán)隊(duì)才是最好的辱揭。養(yǎng)成好的命名習(xí)慣才能寫出優(yōu)美的代碼,這需要長(zhǎng)時(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市完沪,隨后出現(xiàn)的幾起案子域庇,更是在濱河造成了極大的恐慌,老刑警劉巖覆积,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件听皿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宽档,警方通過查閱死者的電腦和手機(jī)尉姨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吗冤,“玉大人又厉,你說我怎么就攤上這事⌒拦拢” “怎么了馋没?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)降传。 經(jīng)常有香客問我篷朵,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任声旺,我火速辦了婚禮笔链,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腮猖。我一直安慰自己鉴扫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布澈缺。 她就那樣靜靜地躺著坪创,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姐赡。 梳的紋絲不亂的頭發(fā)上莱预,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音项滑,去河邊找鬼依沮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枪狂,可吹牛的內(nèi)容都是我干的危喉。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼州疾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辜限!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孝治,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤列粪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谈飒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岂座,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年杭措,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了费什。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡手素,死狀恐怖鸳址,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泉懦,我是刑警寧澤稿黍,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站崩哩,受9級(jí)特大地震影響巡球,放射性物質(zhì)發(fā)生泄漏言沐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一酣栈、第九天 我趴在偏房一處隱蔽的房頂上張望险胰。 院中可真熱鬧,春花似錦矿筝、人聲如沸起便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榆综。三九已至,卻和暖如春铸史,著一層夾襖步出監(jiān)牢的瞬間奖年,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工沛贪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人震贵。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓利赋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親猩系。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媚送,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

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