一、命名规范
1.1包命名
命名规则:一个唯一包名的前缀总是全部小写ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org等。
规约:以公司为准,一般是com.公司名.项目名称缩写.模块名或层级名称
1.2类和接口命名
命名规则:类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。避免使用缩写词,除非该缩写词被更广泛使用,如URL,HTML等。
接口命名,以大写字母I开头,每个单词的首字母大写。
1.3方法命名
命名规则:方法名是一个动词,采用大小写混合的方式,第一个单词首字母小写,其后所有单词的首字母大写
1.3.1 类的获取方法(一般具有返回值)一般要求在被访问的字段名前加上get。一般来说,get前缀方法返回的是单个值,find方法返回的是列表值。
1.3.2类的设置方法(一般返回值为void)被访问字段名前面加上set
1.3.3类的布尔型的判断方法一般要求方法名使用单词is或has做前缀,或者使用具有逻辑意义的单词,例如equal或equals。
1.3.4类的普通方法一般采用完整的英文描述说明成员方法功能,第一个单词尽可能采用动词,首字母小写
1.3.5构造方法应该用递增的方式写即参数多的写在后面。
1.4变量命名
命名规则:第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为 i,j,k,m 和 n,它们一般用于整型;c,d,e,它们一般用于字符型。变量命名不允许出现无意义的单词。
1.5成员变量命名
同变量命名,但要在成员变量前添加m字样,后面字母以大写开头,比如mEditHours。
静态变量前添加s字样,后面字母以大写开头,比如sEditTime。
1.6常量命名
命名规则:类常量的声明,应该全部大写,单词间用下划线隔开。
1.7异常命名
规则:自定义异常的命名必须以Exception为结尾。以明确标示为一个异常。
1.8Layout命名
规约:layout xml的命名必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,即使用模块名_功能名称来命名。
1.9 ID命名
规约:layout中所使用的id必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,并且要求能够通过id直接理解当前组件要实现的功能。
1.10资源命名
规约:layout中所使用的所有资源(如drawable,style等)命名必须以全部单词小写,单词间以下划线分割,并且尽可能的使用名词或名词组,即使用模块名_用途来命名。如果为公共资源,如分割线等,则直接用用途来命名。
二、注释规范
释与代码的比例要求为30%,注释语言必须准确、易懂、简洁。
Java程序有两类注释:实现注释(implementationcomments)和文档注释(document comments)。实现注释是使用/*...*/和//界定的注释。文档注释(被称为"doc comments")由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。
2.1 文件注释
源文件头部应进行注释,列出:版权说明、版本号、模块目的/功能、作者、生成日期、修改日志等。
文件头模板:
/**
* @Title: ${file_name}
* @Package: ${package_name}
* @Description: ${todo}(用一句话描述该文件做什么)
* Copyright:
* Company:
*
* @author ${user}
* @date ${date} ${time}
* @version V1.0
*/
说明:文件描述一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。2.2类注释
每一个类都要包含如下格式的注释,以说明当前类的功能等。
/**
* @ClassName: ${type_name}
* @Description: ${todo}(这里用一句话描述这个类的作用)
* @author ${user}
* @date ${date} ${time}
*
* ${tags}
*/
2.3方法注释
每一个public方法都要包含如下格式的注释,包括当前方法的用途,当前方法参数的含义,当前方法返回值的内容和抛出异常的列表。
/**
* @Title: ${enclosing_method}
* @Description: ${todo}(这里用一句话描述这个方法的作用)
* @param: ${tags} 参数名称
* @return: ${return_type} 返回类型
* @throws
*/
2.4类成员和变量注释
成员变量和常量需要使用java doc形式的注释,以说明当前变量或常量的含义。
/**
* @Fields ${field}: ${todo}(用一句话描述这个变量表示什么)
*/2.5代码注释
2.5.1修改代码时应修改相应的注释
2.5.2注释应与其描述的代码相近,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2.5.3对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
2.5.4帮助读者理解代码,防止没必要的重复注释信息。
2.5.5.当代码段较长,特别是多重嵌套时,注释可以使代码更清晰,更便于阅读。
2.6修改已有类的注释
修改已有类时需要添加修订记录,如下,空一行后添加修订记录、修改内容、Review记录三行。
2.7修改代码注释
2.8XML注释
规约:如果当前layout 或资源需要被多处调用,或为公共使用的layout(若list_item),则需要在xml写明注释。要求注释清晰易懂。
2.9Code Review注释
2.10其他注释
方法内部的注释如果需要多行使用/*…… */形式,如果为单行是用//……形式的注释。不要再方法内部使用 java doc 形式的注释“/**……**/”,简单的区分方法是,java doc形式的注释在 eclipse中为蓝色,普通注释为绿色。
三、代码风格
3.1缩进
规约:不允许使用Tab进行缩进,使用空格进行缩进,推荐缩进为4空格。
3.2空行
下列情况应该总是使用空行:
1、一个源文件的两个片段(section)之间
2、类声明和接口声明之间
3、两个方法之间
4、方法内的局部变量和方法的第一条语句之间
5、一个方法内的两个逻辑段之间,用以提高可读性
规约:通常在变量声明区域之后要用空行分隔,常量声明区域之后要有空行分隔,方法声明之前要有空行分隔。3.3行宽
无特别规定,因为现在的显示器都比较大,所以推荐使用120进行设置。
四、规范约定
4.1方法
一个方法尽量不要超过15行,如果方法太长,说明当前方法业务逻辑已经非常复杂,那么就需要进行方法拆分,保证每个方法只作一件事。
4.2参数与返回值
一个方法的参数尽可能的不要超过4个。
尽可能不要使用null,替代为异常或者使用空变量如返回 List 则可以使用Collections.emptyList()。
4.3幽灵数字(参数与返回值)
代码中不允许出现单独的数字,字符!如果需要使用数字或字符,则将它们按照含义封装为静态常量!(for语句中除外)
4.4控制语句
判断中如有常量,则应将常量置于判断式的右侧。
尽量不使用三目条件的嵌套。
所有if 语句必须用{}包括起来,即便是只有一句。
4.5异常捕获
若有finally 子句,则不要在try 块中直接返回,亦不要在finally 中直接返回。
4.6访问控制
五、约定俗成
5.1变量赋值
避免在一个语句中给多个变量赋相同的值。
不要将赋值运算符用在容易与相等关系运算符混淆的地方。
不要使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作。
5.2圆括号
5.3返回值
设法让你的程序结构符合目的。
5.4二元表达式
如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前,那么应该给表达式添上一对圆括号。
六、21种代码坏味道
1.Duplicated Code 重复代码
2.Long Method 过长函数
3.Large Class 过大的类
4.Divergent Change 发散式变化
5.Shotgun Surgery 散弹式修改
6.Feature Envy 依赖情结
7.Data Clumps 数据泥团
8.Primitive Obsession 基本类型偏执
9.Switch Statement 多分支选择语句
10.Parallel Inheritance Hierarchies 平行继承体系
11.Lazy Class 冗赘类
12.Speculative Generality 夸夸其谈未来性
13.Temporary Field 令人迷惑的暂时值域
14.Message Chain 过度耦合的消息链
15.Middle Man 中间转手人
16.Inappropriate Intimacy 狎昵关系
17.Alternative Classes with Different Interfaces 异曲同工的类
18.Incomplete Library Class 不完善的程序类库
19.Data Class 纯粹的数据类
20.Refused Bequest 被拒绝的遗赠
21.Comments 过多的注释