【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阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • Android编码规范 源文件基础 文件名 源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。 文...
    呼呼哥阅读 928评论 0 0
  • 作者:李旺成 时间:2016年4月3日 1. 前言 这份文档参考了 Google Java 编程风格规范和 Goo...
    diygreen阅读 39,834评论 19 224
  • Android 编码规范 1. 前言 这份文档是 Google Java Code Style 的译文,并稍有添加...
    人失忆阅读 439评论 0 3
  • written by leo.wang Android代码开发规范 1 类声明 1.1 只有一个顶级 类声明每个顶...
    Poseidon_Wang阅读 639评论 0 0
  • 1.Resource文件 命名 遵循前缀表明类型的习惯,形如type_foo_bar.xml。如:fragment...
    Rave_Tian阅读 4,337评论 0 1