【Android 進階】 代碼規范

代碼規范

前言

這份文檔參考了 Google Java 編程風格規范Google 官方 Android 編碼風格規范。該文檔僅供參考,只要形成一個統一的風格,見量知其意就可。

源文件基礎

編碼格式

源文件編碼格式為 UTF-8。

文件名

源文件以其最頂層的類名來命名,大小寫敏感,文件擴展名為.java。

源文件結構

許可證與版權信息

如果一個文件包含許可證或版權信息,那么它應當被放在文件最前面。

package語句

package 語句不換行,列限制(3.4節)并不適用于package語句。(即package語句寫在一行里)

import語句

1、import不要使用通配符:

即,不要出現類似這樣的import語句:import java.util.*;

2、不要換行:

import語句不換行,列限制(4.4節)并不適用于import語句。(每個import語句獨立成行)

類成員區順序

類成員順序對代碼的可讀性是有很大幫助的,從上到下的排列順序為:

常量區
UI控件變量區
普通變量區
重載方法區(重載,永不分離)
聲明周期區(在生命周期區方法內加入需要執行的代碼)

類成員劃分

按照發生的先后順序排列
常量按照使用先后排列
UI控件成員變量按照layout文件中的先后順序排列
普通成員變量按照使用的先后順序排列
方法基本上都按照調用的先后順序在各自區塊中排列

格式術語

大括號

1、使用大括號(即使是可選的)

大括號與if, else, for, do, while語句一起使用,即使只有一條語句(或是空),也應該把大括號寫上。

2、非空塊:K & R 風格

對于非空塊和塊狀結構,大括號遵循 Kernighan 和 Ritchie 風格 (Egyptian brackets):
左大括號前不換行;
左大括號后換行;
右大括號前換行;
如果右大括號是一個語句、函數體或類的終止,則右大括號后換行; 否則不換行。

例如,如果右大括號后面是else或逗號,則不換行。
示例:

return new MyClass() {    
    @Override 
    public void method() {        
        if (condition()) {
            try {
                something();
            } catch (ProblemException e) {
                recover();
            }
        }
    }
};

空塊:可以用簡潔版本

一個空的塊狀結構里什么也不包含,大括號可以簡潔地寫成{},不需要換行。
例外:如果它是一個多塊語句的一部分(if/else 或 try/catch/finally) ,即使大括號內沒內容,右大括號也要換行。
示例:

void doNothing() {}

塊縮進

每當開始一個新的塊,縮進增加4個空格,當塊結束時,縮進返回先前的縮進級別。縮進級別適用于代碼和注釋。(見3.1.2節中的代碼示例)

一行一個語句

每個語句后要換行。

列限制

一個項目可以選擇一行80個字符或100個字符的列限制,除了下述例外,任何一行如果超過這個字符數限制,必須自動換行。

空白

垂直空白

有且只有一個換行

類成員區劃分
在方法體內,語句的邏輯分組間使用空行。
類的第一個成員與最后一個成員的空白。

水平空白

類型和變量之間:List list
分隔任何保留字與緊隨其后的左括號(()(如if, for catch等)。
如果在一條語句后做注釋,則雙斜杠(//)兩邊都要空格。
在, : ;及右括號())后

具體結構

1、枚舉類

枚舉常量間用逗號隔開,換行可選。

private enum Suit { 
    CLUBS, 
    HEARTS, 
    SPADES, 
    DIAMONDS
}

2、變量聲明

1)、每次只聲明一個變量

不要使用組合聲明,比如int a, b;

2)、需要時才聲明,并盡快進行初始化

不要在一個代碼塊的開頭把局部變量一次性都聲明了(這是c語言的做法),而是在第一次需要使用它時才聲明。 局部變量在聲明時最好就進行初始化,或者聲明后盡快進行初始化。

3、數組

1)、非C風格的數組聲明

中括號是類型的一部分:String[] args, 而非 String args[]

4、switch語句

每個switch語句都包含一個default語句組,即使它什么代碼也不包含。

5、注解(Annotations)

1)、方法注解

注解緊跟在文檔塊后面,應用于類、方法和構造函數,一個注解獨占一行。

2)、變量注解

沒有特殊限制,也可以寫成:
@Partial @Mock DataLoader loader;

6、Modifiers(修飾)

類和成員的modifiers如果存在,則按Java語言規范中推薦的順序出現。
public protected private abstract static final transient volatile synchronized native strictfp

命名規范

包名

包名全部小寫,連續的單詞只是簡單地連接起來,不使用下劃線。
例如:com.shuidi.huzhu

類名

類名都以UpperCamelCase風格編寫,后綴類型,不要加下劃線。
類名通常是名詞或名詞短語,接口名稱有時可能是形容詞或形容詞短語。名詞,采用大駝峰命名法,盡量避免縮寫,除非該縮寫是眾所周知的, 比如HTML,URL,如果類名稱中包含單詞縮寫,則單詞縮寫的每個字母均應大寫。

WelcomeActivity、NewDetailAdapter、HomePosterParser、ThreadPoolManager等等

測試類的命名以它要測試的類的名稱開始,以Test結束。
例如:HashTest 或 HashIntegrationTest。
接口(interface):命名規則與類一樣采用大駝峰命名法,多以able或ible結尾,如
interface Runnable ;
interface Accessible;

方法名

方法名都以 LowerCamelCase 風格編寫。
方法名通常是動詞或動詞短語。

初始化方法,命名以init開頭,例:initView
按鈕點擊方法,命名以to開頭,例:toLogin
設置方法,命名以set開頭,例:setData
具有返回值的獲取方法,命名以get開頭,例:getData
通過異步加載數據的方法,命名以load開頭,例:loadData
布爾型的判斷方法,命名以is或has,或具有邏輯意義的單詞如equals,例:isEmpty

常量名

全部為大寫單詞,單詞之間用下劃線分開。
public final static int PAGE_SIZE = 20;

參數名、變量名

1、控件類型

類型描述+{范圍描述+}意義描述的組合,用駝峰式,首字母小
private TextView tvHeaderTitle; // 標題欄的標題
private Button btnLogin; // 登錄按鈕

2、其他類型

{范圍描述+}意義描述+類型描述的組合,用駝峰式,首字母小
private ArrayList<String> commentList; 
private String content; 

資源文件命名

資源文件命名與java命名不同,大多采用前綴命名法,對類型進行區分

1、控件ID命名

<!-- 這是標題欄的標題 -->
<TextView
    android:id="@+id/txt_header_title"
    ... />

<!-- 這是登錄按鈕 -->
<Button
    android:id="@+id/btn_login"
    ... />

2、layout命名

組件類型{范圍}功能,范圍可選,只在有明確定義的范圍內才需要加上。

activity_{范圍_}功能,為Activity的命名格式 
fragment_{范圍_}功能,為Fragment的命名格式
dialog_{范圍_}功能,為Dialog的命名格式 
item_{范圍_}功能,為列表的item命名格式
widget_{范圍_}功能,為自定義控件類命名格式
header_{范圍_}功能,為列表的HeaderView命名格式
footer_{范圍_}功能,為列表的FooterView命名格式

3、string的命名

類型{范圍}功能,范圍可選。
傳統命名方式:

頁面標題,命名格式為:title_頁面
按鈕文字,命名格式為:btn_按鈕事件
標簽文字,命名格式為:label_標簽文字
選項卡文字,命名格式為:tab_選項卡文字
消息框文字,命名格式為:toast_消息
編輯框的提示文字,命名格式為:hint_提示信息
圖片的描述文字,命名格式為:desc_圖片文字
對話框的文字,命名格式為:dialog_文字
menu的item文字,命名格式為:action_文字

建議命名方式:
String命名如果以傳統命名法來命名,有些按照業務邏輯進行命名,好處是可插拔,壞處是資源命名滿天飛,迭代周期久后導致過于臃腫,建議根據實際意義進行命名。

示例:

我的優惠券 :str_mine_coupon
支付 :str_pay

4、colors的命名
傳統命名方式:
前綴{控件}{范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個。

背景顏色,添加bg前綴
文本顏色,添加text前綴
分割線顏色,添加div前綴
區分狀態時,默認狀態的顏色,添加normal后綴
區分狀態時,按下時的顏色,添加pressed后綴
區分狀態時,選中時的顏色,添加selected后綴
區分狀態時,不可用時的顏色,添加disable后綴

建議命名方式:

由于色值復用較多,個人建議采用更為直接的匈牙利命名法,達到更直觀,更簡潔的使用

示例:

正常顏色 :col_000000
帶透明度顏色 :col_000000_translucent25 

5、drawable的命名

前綴{控件}{范圍}{_后綴},控件、范圍、后綴可選,但控件和范圍至少要有一個。

圖標類,添加ic前綴
背景類,添加bg前綴
分隔類,添加div前綴
默認類,添加def前綴
區分狀態時,默認狀態,添加normal后綴
區分狀態時,按下時的狀態,添加pressed后綴
區分狀態時,選中時的狀態,添加selected后綴
區分狀態時,不可用時的狀態,添加disable后綴
多種狀態的,添加selector后綴(一般為ListView的selector或按鈕的selector)

6、動畫文件命名

動畫類型_動畫方向。

fade_in,淡入
fade_out,淡出
push_down_in,從下方推入
push_down_out,從下方推出
slide_in_from_top,從頭部滑動進入
zoom_enter,變形進入
shrink_to_middle,中間縮小

附錄:

1、 UI控件縮寫表 : 建議控件的命名以前綴命名

LinearLayout    ll  llFriend
RelativeLayout  rl  rlMessage
FrameLayout     fl  flCart
TableLayout     tl  tlTab
Button      btn     btnHome
ImageButton     ibtn    btnPlay
TextView    tv  tvName
EditText    et  etName
ListView    lv  lvCart
RecycleView     rv  rvTopic
ImageView   iv  ivHead
GridView    gv  gvPhoto

2、常見英文單詞縮寫表

icon        ic 
color       col
divider     di
selector    sl
average     avg
background  bg
buffer      buf
control     ctrl
delete      del
document    doc
error       err
escape      esc
increment   inc
infomation  info
initial     init
image       img
length      len
library     lib
message     msg
password    pwd
position    pos
server      srv
source      src
string      str
temp        tmp
window      win

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • Android編碼規范 源文件基礎 文件名 源文件以其最頂層的類名來命名,大小寫敏感,文件擴展名為.java。 文...
    呼呼哥閱讀 976評論 0 0
  • 作者:李旺成 時間:2016年4月3日 1. 前言 這份文檔參考了 Google Java 編程風格規范和 Goo...
    diygreen閱讀 39,960評論 19 224
  • Android 編碼規范 1. 前言 這份文檔是 Google Java Code Style 的譯文,并稍有添加...
    人失憶閱讀 449評論 0 3
  • written by leo.wang Android代碼開發規范 1 類聲明 1.1 只有一個頂級 類聲明每個頂...
    Poseidon_Wang閱讀 659評論 0 0
  • 1.Resource文件 命名 遵循前綴表明類型的習慣,形如type_foo_bar.xml。如:fragment...
    Rave_Tian閱讀 4,416評論 0 1