@编写可读代码的艺术(二)-- 简化循环和逻辑
1、把控制流程变得易懂
关键思想:把条件、循环以及对流程的控制做的越自然越好,运用一种方式使读者不用停下来重复阅读你的代码
1.1、条件语句中参数的顺序
1.1.1、把不变的参数放在运算符的右边
// 1、固定值maxValue在右边
if (param < maxValue){
...
}
// 2、固定值maxValue在左边
if (maxValue > param) {
}
// 1、固定值预算在右边
if (unitPriceParam * amountParam > budget) {
// 预算超支
}
// 2、固定值在等号左边
if (budget < unitPriceParam * amountParam ) {
// 未超出预算
}
固定值放在等号右边
1.1.2、调整if/else块的执行顺序
优先执行确定的、再是简单的、然后是其他的;
1.1.3、避免复杂三目运算符的使用
// eg: 简单情况使用三木运算符
boolean overBudget = isBudgetIsOver();
overBudget ? methed1() : methd2();
// eg:以下复杂情况不推荐三目运算符
amount = (num * amount/2) > 3 ? param1*param2-param3 : param2-param3;
// 上述三目运算符虽然只占用了一行代码,但是可读性降低,应使用可读性
// 更高的if/else
if ((num * amount/2) > 3) {
amount = param1*param2-param3 ;
} else {
amount = param2-param3;
}
1.1.4、避免do/while循序的使用
无论什么情况下,do中的逻辑都会被执行一次,阅读者难确定循环结束的条件;
建议调整为while,可以直观、明了的看到 循环执行的条件
do {
...
} while (condition)
while(condition) {
...
}
1.1.5、避免循环嵌套
循环套循环大大降低代码可读性,视情况使用提早返回
for (int i = 0; i < userList.size(); i++) {
if (null != userList[i]) {
... do somethingA
if (null != userLisr[i].name) {
... do somethingB
}
}
}
上述代码过于繁琐,可读性降低,利用continue 增加代码可读性
for (int i = 0; i < userList.size(); i++) {
if (null == userList[i]) {
// 结束本次循环,进入下次循环
continue;
}
... do somethingA
if (null == userLisr[i].name) {
continue;
}
... do somethingB
}
1.1.5、避免条件嵌套
if套if,导致代码可读性极其差,利用return,提前返回
// 3层if判断
void method() {
if (null != user) {
if (null != user.age) {
if (user.age > 18) {
... do somethingA
} else {
... do somethingB
}
}
}
}
// 对上述逻辑进行调整,调整为位语句形式
void method() {
if (null == user) {
// return 阻断代码执行
return;
}
if (null == user.age) {
return;
}
if (user.age > 18) {
... do somethingA
} else {
... do somethingB
}
}
2、拆分超长的表达式
关键思想:把超长的表达式拆分为更容易理解的小块