开发规范制定目的
Android开发规范的制定是为了减少团队协作开发的成本,提高开发和维护的效率,方便自己和他人阅读代码。
一. 概要
1.1类名:
大驼峰 (pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写
1.2 方法函数:
小驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写
1.3 常量:
下划线命名法:单词与单词间用下划线做间隔,全部大写
1.4 代码中一些定义的变量规范:
成员变量:m***(mInitAvtivity)
局部变量:l***
形参:a***
静态:s:
常量:大写_***
枚举值:em***
二.编码规范
编码方式统一用UTF-8. Android Studio默认已是UTF-8,只要不去改动它就可以了。
注:所有的网络请求都是 UTF-8 编码
三.书写规范
3.1 空格使用
(1). 花括号不要单独一行,和它前面的代码同一行。而且,花括号与前面的代码之间用一个空格隔开。
public void method() { // Good
}
public void method()
{ // Bad
}
public void method(){ // Bad
}
(2). if、else、for、switch、while 等逻辑关键字与后面的语句留一个空格隔开
if (booleanVariable) {// Good
// TODO while booleanVariable is true
} else {
// TODO else
}
if(booleanVariable) {// Bad
// TODO while booleanVariable is true
}else {
// TODO else
}
(3). 运算符两边各用一个空格隔开
int result = a + b; //Good, = 和 + 两边各用一个空格隔开
int result=a+b; //Bad,=和+两边没用空格隔开
(4). 方法的每个参数之间用一个空格隔开
public void method(String param1, String param2); // Good,param1 后面的逗号与String 之间隔了一个空格
method(param1, param2); // Good,方法调用时,param1 后面的逗号与 param2 之间隔了一个空格
method(param1,param2); // Bad,没有用一个空格隔开
3.2. 空行使用
(1). 两个方法之间
// Good
public void initView() {
}
public void loadData() {
}
(2). 方法内的两个逻辑段之间
// Good
public void initView() {
initView();
loadData();
}
(3). 方法内的局部变量和方法的第一条逻辑语句之间
public void loadData() {
String url= “http://localhost:8080/login.do”;
Int a=0;
Int b =1;
HttpClient httpClient = new HttpClient();
}
(4). 常量和变量之间
private static final String DATA_RUL = “http://localhost:8080/login.do”;//登录接口
private String studentName;//学生姓名
3.3. 换行使用
(1). 表达式长度过长
当表达式的无法容纳在一行内时,可换行显示,另起的新行用 8个空格的缩进。
(2). 使用的方法长度过长
当调用的方法无法容纳一行时,可换行显示,另起的新行用 8 个空格的缩进。(大概与 void,也就是上一行的第二个关键字对齐)。
private void loadData(String url, int start, int length, int type,
string date);
3.4. 变量声明
一行声明一个变量,不要一行声明多个变量,这样有利于写注释
private String studentID, studentName;//学生 ID
private String studentName;//学生姓名
3.5. 方法代码行数限制
一个方法最多不能超过40行代码,多于40行的代码尽量抽取封装起来。
3.6. 枚举值的使用
范围型用枚举类定义,而不要直接用整型或者字符,这样可以减少范围值的有效性检查。
public enum CouponType{
//现金
CASH,
//抵用券
DEBIT,
//折扣券
DISCOUNT
}
3.7. 统一单位
文字大小:sp
像素大小:px
元素大小:dp
3.8. 字符串、颜色、样式、数组
字符串:应用中统一在 string.xml中定义
颜色:所有的颜色值统一在 color.xml中定义
样式:应用样式统一在 style.xml 中定义
数组:应用数组统一在 arrays.xml 中定义
四.命名规范
4.1. 包命名
包名 = com + ”公司名” + “应用缩写” + “模块名称”(采用反域名命名规则,全部使用小写字母。一级包名为 com,二级包名为 (公司名称),三级包名根据应用进行命名,四级包名为模块名或层级名)
.activitys Activity类包
.fragments Fragment类包
.services Service类包
.broadcast BroadcastReceive类包
.adapters Adapter类包
.widgets 自定义控件类包
.interfaces 接口类包
.beans bean类包
.api 网络请求包
.databases 数据库操作类包
.utils 工具类包
.models Model类包
4.2. 类和接口命名
使用大驼峰规则,用名词或名词词组命名,每个单词的首字母大写。
以下为几种常用类的命名:
1. activity类,命名以 Activity 为后缀,如:LoginActivity
2. fragment类,命名以 Fragment 为后缀,如:ShareDialogFragment
3. service类,命名以 Service 为后缀,如:DownloadService
4. adapter类,命名以 Adapter 为后缀,如:CouponListAdapter
5. 自定义接口 interface 类,命名以 Api 为后缀,如:OrderCompeletdApi
注:【这里的Api是用户自定义的接口,它是存放在interface包中,而
百度Api、分享Api、支付Api等等放在API包中,表示第三方的API。】
6. 工具类,命名以 Util 为后缀,如:EncryptUtil
7. Bean类,命名以 Bean 为后缀,如:OrderBean
8. 接口实现类,命名以 Impl 为后缀,如:ApiImpl
9. Model类,命名以 Model 为后缀,如:UserModel
4.3. 方法命名
使用小驼峰规则,用动词命名,第一个单词的首字母小写,其他单词的首字母大写。以下为几种常用方法的命名:
1. 初始化方法,命名以 init 开头,例:initView()
2. 按钮点击方法,命名以 to 开头,例:toLogin
3. 设置方法,命名以 set 开头,例:setData
4. 具有返回值的获取方法,命名以 get开头,例:getData
5. 通过异步加载数据的方法,命名以 load 开头,例:loadData
6. 布尔型的判断方法,命名以 is 或 has,或具有逻辑意义的单词如 equals,例:isEmpty
7. 保存数据相关的方法,命名以 save 开头,例:saveGoodsData,
8. 对数据重组的方法,命名以 reset 开头,例:resetOrderData,,
9. 清除数据相关的方法,命名以 clear 开头,例:clearUserData,
10. 弹出提示框或者提示信息,命名以 display 开头,例:displayDialog
4.4. 控件 id 命名
控件的id命名:{范围}模块名称逻辑名称_缩写,例:login_signin_btn(login_head_signin_btn)//登录界面中的登录按钮
1. 控件的缩写
控件 缩写 控件 缩写
TextView txtVi EditText edtTxt
Button btn ImageButton imgBtn
ImageView imgVi ListView listVi
RadioGroup rdoGrp RadioButton rdoBtn
ProgressBar proBar SeekBar skBar
CheckBox chkBox Spinner spinner
TableLayout tbLayout TableRow tbRow
LinearLayout lLayout RelativeLayout rLayout
ScrollView sclVi SearchView searchVi
TabHost host TabWidget widget
AutoCompleteTextView autoTxt VideoView vdoVi
analogClock anaClk DatePicker dtPk
TimePicker tmPk toggleButton tglBtn
ImageSwitch ImgSwt
- 范围词
heard//头 heard_login_signin_btn
center//中
foot//脚
4.5. 常量命名
常量全部用大写,采用下划线的命名法,例如:PAGE_SIZE = 10;
4.6. layout 命名
组件类型{范围}功能,范围可选,只在有明确定义的范围内才需要加上。
以下为几种常用的组件类型命名:
1. {范围_}功能_activity,为 Activity 的命名格式
2. {范围}功能_fragment,为 Fragment 的命名格式
3. {范围}功能_dialog,为 Dialog 的命名格式
4. {范围}功能_item,为 ListView或RecycleView 的 item 命名格式
4.7. strings 命名
- 页面标题,命名格式为:页面_title
- 按钮文字,命名格式为:按钮事件_btn
- 标签文字,命名格式为:标签文字_label
- 选项卡文字,命名格式为:选项卡文字_tab
- 消息框文字,命名格式为:消息_toast
- 编辑框的提示文字,命名格式为:提示信息_hint
- 图片的描述文字,命名格式为:图片文字_pic
- 对话框的文字,命名格式为:文字_dialog
- menu的item文字,命名格式为:文字_action
4.8. color 命名
{范围}{前缀}{功能}_后缀,控件、范围、前缀可选,但控件和范围至少要有一个,多个功能用下划线隔开。
1. 背景颜色,添加 bg 后缀
2. 文本颜色,添加 text 后缀
3. 分割线颜色,添加 div 后缀
4. 区分状态时,默认状态的颜色,添加 normal 前缀
5. 区分状态时,按下时的颜色,添加 pressed 前缀
6. 区分状态时,选中时的颜色,添加 selected 前缀
7. 区分状态时,不可用时的颜色,添加 disable 前缀
4.9. drawable 命名
{功能}{范围}后缀{_区分状态},前缀、范围、功能可选,但功能和范围至少要有一个。signin_bg_ic_selected.同一张图片被多处使用则去掉{功能}
1. 图标类,添加 ic 后缀 例:signin_ic_btn(登录按钮的图标)
2. 背景类,添加 bg 后缀,例:activity_loginbg_bg
3. 分隔类,添加 div 后缀,
4. 默认类,添加 def 后缀
5. 样式类, 添加selector 后缀 login_bg_selector
6. 区分状态时,默认状态,添加 normal 例:
7. 区分状态时,按下时的状态,添加 pressed 例:signin_bg_btn_pressed
8. 区分状态时,选中时的状态,添加 selected 例:signin_bg_btn_selected
9. 区分状态时,不可用时的状态,添加 disable 例:signin_bg_btn_disable
10. 多种状态的,添加 selector 后缀(一般为 ListView 的 selector 或按钮的selector)
4.10. 动画文件命名
动画类型_动画方向:
1. fade_in,淡入
2. fade_out,淡出
3. push_down_in,从下方推入
4. push_down_out,从下方推出
5. push_left,从左边推入
6. slide_in_from_top,从头部滑动进入
7. zoom_enter,变形进入
8. shrink_to_middle,中间缩小
五.注释规范
5.1. 文件头注释
文件顶部统一添加版权声明,声明的格式如下:
/*
* Copyright (c) 2016. Inc.All rights reserved.
*/
5.2. 类和接口注释
/**
* 类或接口的描述信息
*
* @author
* @date
*/
5.3. 方法的注释
下面几种方法,都必须添加 javadoc 注释,说明该方法的用途和参数说明,以及返回值的说明。
1. 接口中定义的所有方法
2. 抽象类中自定义的抽象方法
3. 抽象父类的自定义公用方法
4. 工具类的公用方法
/**
* 登录
*
* @param loginName 登录名
* @param password 密码
* @param listener 回调监听器
*/
public void login(String loginName, String password, ActionCallbackLisener listener);
5.4. 变量和常量注释
下面几种情况下的常量和变量,都要添加注释说明,优先采用右侧//来注释,
若注释说明太长则在上方添加注释。
1. 接口中定义的所有常量
2. 公有类的公有常量
3. 枚举类定义的所有枚举常量
4. 实体类的所有属性变量
public static final int TYPE_CASH = 1; //现金券
public static final int TYPE_DEBIT = 2; //抵扣券
public static final int TYPE_DISCOUNT = 3; //折扣券
private int id; //券id
private String name; //券名称
private String introduce; //券简介