通常我們?yōu)榱隧?xiàng)目的維護(hù)會(huì)定下一系列的規(guī)范開發(fā)來提高自己或者團(tuán)隊(duì)之間的寫代碼的效率,正所謂無規(guī)矩不成方圓估脆。
Android Studio的使用
Android 開發(fā)首選 Android Studio病游,一個(gè)好的IDE能讓你事半功倍。編碼規(guī)范使用 Android Studio 默認(rèn)的模板規(guī)范即可,這也是比較方便的方法款咖。同時(shí)也要注意以下幾點(diǎn)何暮,可以讓你的團(tuán)隊(duì)協(xié)作更加協(xié)調(diào):
- 統(tǒng)一調(diào)整 IDE 的編碼方式為 UTF-8
- 編輯完代碼后不要忘記格式化(即 Ctrl+Alt+L 快捷鍵)
- 盡量保證團(tuán)隊(duì)之間的 IDE 版本與 Gradle 版本一致,最好的做法是及時(shí)更新保證與官方最新版一致铐殃。
- 代碼提交前進(jìn)行代碼檢查(Analyze->Inspect Code)海洼,可以消除代碼中的警告,減少不必要的錯(cuò)誤富腊。
- 擅用
//TODO
注釋來標(biāo)記未做完或需要其他人接手的工作 - 善用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
考余、Model
和Adapter
等一些文件放入同一個(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ì)包含(按順序地):
- 許可證或版權(quán)信息(如有需要)
- package語句
- import語句
- 一個(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)行命名:
- 單個(gè)的大寫字母龄毡,后面可以跟一個(gè)數(shù)字(如:E, T, X, T2)跋核。
- 以類命名方式样勃,后面加個(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è)類都必須要寫上
- 創(chuàng)建時(shí)間
- 作者
- 類的作用描述
- 版本和聯(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ī)范
參考資料: