1、开发规范的作用
- 减少维护花费
- 提高可读性
- 加快工作交接
- 减少名字增生
- 降低缺陷引入的机会
2、命名规范
1.常量命名规范:
通常都遵循望文知意的原则,常量通常储存经常使用且变化不多得数据。
1.1.规则:
1. 全部为大写字母
2. 中间以“_”连接
3. 望文知意
1.2例子:
比如写一个游戏关卡的关数:
static final int MY_GAME_LEVEL = 1;
2.变量命名规范
变量用于保存系统中的临时数据,变量命名时遵循望文知意,简单明了,驼峰标示等原则。
2.1 规则:
- 首字母小写
- java驼峰命名;
- 望文知意原则;
- 推荐引用类型变量添加前缀“m”;
- 如果是View组件变量,则组件名称为xml文件中定义的ID名称去掉下划线,下划线后一位大写;
2.2例子:
static final int mMyGameLevel = 1;
3.方法命名规范
遵循简洁明了的原则:
3.1 规则:
- 首字母小写;
- java驼峰命名;
- 简单明了原则;
- 初始化View方法init*(每个init做一件事)
3.2 例子:
public static int getMyGameLevel();
4.类命名规范
简明扼要,望文知意,并且首字母大写。
4.1 规则:
- 首字母大写;
- java驼峰命名;
- 望文知意原则;
- 能够说明类的功能和主要作用(注释的作用);
- Acitivity类以Acitivity结尾;
- Fragment类以Fragment结尾;
- Service类以Service结尾;
- BroadcastReceiver类以Receiver结尾;
- ContentProvider类以Provider结尾;
- Application类以Application结尾;
- 自定义View类以Custom**View结尾;
- 自定义Adapter类以Adapter结尾;
- adapter中的ViewHolder以Holder结尾;
- 实体Bean以Model结尾;
4.2例子
距离一个游戏的工具类可以定义为
public class GameUtils;
5.接口命名规范
接口命名需要简单明了,长度不宜过长;
5.1 规则:
- 首字母和第二个字母大写;
- java驼峰命名;
- 望文知意原则;
- 在名称前面追加“I”;
5.2例子:
如:定义一个activity的方法接口,实现接口中的某些方法:
public interface IFunctionListener;
6.包名规范
用于分类管理类文件;
6.1 规则:
- 所有字母小写;
- 简单明了,层级很深,没有拼接的包名;
- 望文知意;
- 工具类可以划分为一个工具类的包名,utils,里面可以添加包名层级;
- 系统类的可以划分为一个系统类的包,system,里面可以添加包名层级;
- 组件类的可以划分为一个组件类的包 ,**,里面添加adapter的包名,自定义view包名;
- Service类的可以划分为一个服务类的包,service,里面可以添加包名层级;
- 数据库相关类可以划分为一个数据库类,db,里面可以添加数据
- 相关类,Bean类,数据库服务类等;
- 广播类的可以划分为广播类的包,receiver,可以放一些广播相关的类;
- 网络类相关的可以划分为,network,放一些网络相关的类;
- Fragment类存放在fragment包下;
- Activity类存放在Activity包下;
7.布局文件
布局文件名称规范
7.1 规则:
- 全部为小写字母;
- 中间以”_”连接;
- 望文知意原则;
- 布局文件的开头为类名;
- 列表项的xml布局文件名称:类名_item.xml;
- activity类的xml文件名称:类名_activity.xml;
- fragment类的xml文件名称:类名_fragment.xml;
- 自定义View的xml文件的名称:类名_父类名.xml;
7.2 例子:
例如MainActivity的XML文件名称为:main_activity.xml
8.Drawable文件名规范
8.1规则:
- 全部为小写字母;
- 中间以”_”连接;
- 望文知意原则;
- 布局文件的开头问类名;
- 11_22_33_44,44:selector,shape(大概五六个,暂时不定义其他的); 33:src、bg、color(可扩展,可为空); 22:状态名称或者为空;11:业务名称
9.资源ID规范:
9.1 规则:
- 全部为小写字母;
- 中间以”_”连接;
- 望文知意原则;
9.2例子
可以考虑按照组件的名称的缩写作为前缀,(同一个xml文件中ID名称不能重复)如:组件简写(大写字母缩写)_业务名称
TextView的组件:tv_pay_money
Button的组件:btn_pay_money
EditText的组件:et_user_name
LinerLayout组件:ll_container
10.注释规范:
10.1.类注释
在类、接口定义之前当对其进行注释,包括类、接口的目的、作用、功能、继承于何种父类,实现的接口、实现的算法、使用方法、示例程序等。
/**
* author:作者
* time:时间
* desc:描述
*/
10.2.方法注释
方法注释的模板:
/**
* desc:描述
* @param 参数名 参数描述
* @param 参数名2 参数描述
* @return 返回值类型说明
* @throws Exception 异常说明
*/
10.3.类成员变量和常量注释
成员变量和常量需要使用如下注释的形式,注释位于变量的上侧;
/**
*
**/
10.4 内部逻辑注释
内部逻辑注释模板:
//支付成功
if (response.getRet() == 0) {
Toast.makeText(H5Activity.this, "支付成功", Toast.LENGTH_LONG).show();
goToNext(response);
}
//支付失败
else if (response.getRet() == -1) {
Toast.makeText(H5Activity.this, "支付失败", Toast.LENGTH_LONG).show();
//刷新当前页面
reflush(currentUrl);
}
3、代码顺序
在一个典型的Activity中代码的顺序如下:
/**
* author:sh
* desc:该class的作用
* time:yyyy-MM-dd
**/
public class ClassName {
//(1) 成员变量集合
//(2) 回调方法集合
若该类为activity,则:onCreate、**、onDestory;
若该类为Fragment、则:onCreateView、**、onDestory;
//(3) 其他方法集合
}
4、代码风格
1.大括号换行
左大括号不换行,右大括号换行;
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
2.小括号空格
if (condition) {
body();
}
3.缩进
- 4 个空格作为缩进排版的一个单位,不使用制表符 tab。
- 8 个空格作为换行后的缩进,包括函数调用和赋值。
- Instrument i =
someLongexpression_r(that, NotFit, on, one, line); // 推荐
4.每一行的长度
- 尽量避免一行的长度超过 100 个字符。
- 例外:如果注释行包含了超过 100 个字符的命令示例或者 url 文字,为了便于剪切和复制,其长度可以超过 100 个字符。
- 例外:import 行可以超过限制,因为很少有人会去阅读它。这也简化了编程工具的写入操作。
5.每次声明一个变量
- 推荐一行一个声明,因为这样以利于写注释;
- int level; // indentation level
- int size; // size of table
6. if-else语句
if-else语句应该具有如下格式:
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
注意:if语句总是用”{“和”}“括起来,避免使用如下容易引起错误的格式:
if (condition) // 避免
statement;
7.for语句
一个for语句应该具有如下格式:
for (initialization; condition; update) {
statements;
}
当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高。
若需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。
8.while语句
一个while语句应该具有如下格式:
while (condition) {
statements;
}
9.do-while语句
do {
statements;
} while (condition);
10.switch语句
一个switch语句应该具有如下格式:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
每当一个case顺着往下执行时(因为没有break语句),通常应在break语句的位置添加注释。
5 异常规范
5.1 异常名称:
定义异常的时候,异常的后缀名称以Exception结尾,及**Exception;
5.2 异常格式
一个try-catch语句应该具有如下格式:
try {
statements;
} catch (ExceptionClass e) {
statements;
}
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
6.其他规范
6.1 源文件的函数小于2K
一般来说源文件的行数不能大于2K行,过多的话可以考虑拆分功能,拆分函数等;
6.2 使用TODO注释
- 对那些临时性的、短期的、够棒但不完美的代码,请使用 TODO 注释。
- TODO 注释应该包含全部大写的 TODO,后跟一个冒号:
- // TODO: Remove this code after the UrlTable2 has been checked in.
- // TODO: Change this to use a flag instead of a constant. 如果 TODO 注释是“将来要做某事”的格式)。
6.3 使用自定义LOG
在系统中需要打印LOG的时候,尽量使用自定义的LOG,自定义的LOG在开发环境的时候会打印日志,正式环境的时候不会打印日志。
7.4 使用自定义TAG
在系统打印LOG的时候,使用TAG尽量使用tab,统一的TAG标志。