命名
1.命名的准则是准确的表达意义。对于不同作用域的命名,可以选择不同的长度。一般来说,作用域小的变量(比如临时变量),可以选择短一些的命名方式。
2.可以借助类的信息来简化属性、函数的命名,利用函数信息来简化函数参数的命名。
class User{
String name; // not userName
String address; // not userAddress
}
3.命名要可读、可搜索,不要使用生僻单词来命名。
4.接口有两种命名方式:一种是接口带前缀“I”;另一种是在实现类中带后缀“Impl”。抽象类也有两种方式,一种是带前缀“Abstract”,一种是不带。重点是项目中要统一。
注释
1.注释要包含三个方面:做什么、为什么、怎么做。对于复杂类和接口,还需要写明如何用。
2.注释并非越多越好。类和函数一定要写注释,函数内部注释相对少一些,一般都靠好的命名、提炼函数、解释性变量、总结性注释来提高代码可读性。
类中成员排列顺序
在Google Java规范中,依赖类按照字母序从小到大排列。类中先写成员变量后写函数。成员变量之间或函数之间,先写静态成员变量或函数,后写普通变量或函数,按照作用域大小依次排列。
把代码分割为单元块
当代码逻辑比较复杂时,建议将其提炼为类或者函数,但是如果提炼出的函数只有两三行,则不建议。
避免函数参数过多
函数包含3、4个参数是可接受的,大于5个时,会影响到代码可读性。解决方法有两种:
- 考虑函数是否职责单一,是否需要将一个函数拆分为多个函数;
- 将函数参数封装为对象;
不用函数参数控制逻辑
不要在函数中用boolean类型的标识参数来控制内部逻辑,这违背了单一职责原则和接口隔离原则,建议将其拆分为两个函数。
public void buyCourse(long userId, long courseId, boolean isVip);
// 将其拆分成两个函数
public void buyCourse(long userId, long courseId);
public void buyCourseForVip(long userId, long courseId);
移除过深嵌套层次
代码嵌套过深往往因为if-else、switch-case、for循环过度嵌套导致。建议嵌套不要超过两层,难以理解。解决方法:
- 去掉(合并)多余if或else;
- 使用continue、break、return,提前退出嵌套;
- 调整执行顺序以减少嵌套;
- 将部分嵌套逻辑封装成函数调用;
学会使用解释性变量
1.用常量取代魔法数字。
public double CalculateCircularArea(double radius) {
return (3.1415) * radius * radius;
}
// 常量替代魔法数字
public static final Double PI = 3.1415;
public double CalculateCircularArea(double radius) {
return PI * radius * radius;
}
2.使用解释性变量解释复杂表达式。
if (date.after(SUMMER_START) && date.before(SUMMER_END)) {
// ...
} else {
// ...
}
// 引入解释性变量后逻辑更加清晰
boolean isSummer = date.after(SUMMER_START)&&date.before(SUMMER_END);
if (isSummer) {
// ...
} else {
// ...
}