1.条件语句
1.1 if 语句
在写if语句时应该注意的事项:
- 首先写正常代码路径;再处理不常见的情况。
很容易理解,写代码的时候应该把你认为最希望的情况写在最前面,而不是一上来就处理诸如用户非法输入之类的不常见情况。 - 确保if后括号内的表达式是正确合理的
尽量使用">="
和"<="
而不是"<"
和">"
,原因很简单,因为后者更容易犯下 偏差一 (off-by-one)错误。 - if后应该尽量跟一个有意义的语句
而不是if什么也不做,然后再else。 - 把正常情况的处理放在if后面而不要丢在else后
- 确保所有的情况都考虑到
- 如果if需要考虑的情况比较多,请试着使用switch结构。
- 如果if后的布尔表达式比较复杂,可以试着把它封装成函数调用或者定义布尔变量。
下面是符合规范的一种情况:
1.2 switch语句
选一个合适的case排序方法
swich语句的使用主要就是case的排列顺序了,当case有很多时,你就要考虑一下以怎样的顺序白方它们了,有这几种排列方法,根据不同的场景选择不同的排序方法:
- 按照自顺序或者按照数字顺序排列
- 依然是把正常情况放在前面
- 按照执行频率排列
最经常执行的当然应该摆在前面,首先读程序者可以最容易找到最常见的情况,齐次机器的检索效率也会更高
使用规范
- 简化case下的语句
这样做可以使你的case结构更加清晰明了。但是,如果你需要在某一个case下进行大量的复杂操作,那就定义一个方法来调用吧。 - 不要为了使用switch,而去定义新的变量
简而言之就是:case后的变量应该是现成的,简单而又易于分类的变量,如果为了表示某一case而去定义新的变量,那就有点得不偿失了。此时我们应该直接使用if-else与语句。
例如:
char userCommend;
userCommend = orders[0];//截取用户的命令而创建的,这就是一个额外的变量
switch(userCommend){
case 'c':
copy();
break;
case 'b':
deleteCharacter();
break;
}
与其这样到不如一开始就使用if-else
- 使用default子句检测真正的默认情况
否则代码很难维护,伪默认情况可能会变成新的case。
就如上述的例子,假设命令只有copy和deleteCharacter,那我们完全可以将代码改为:
switch(userCommend){
case 'c':
copy();
break;
default:
deleteCharacter();
break;
}
但如果此时有新的命令加入,需要的修改量就大了,所以如果不是真正的默认情况,就不要使用default子句
- 利用default子句检测错误
这才是default子句的正确用法,当所有的case都没有被执行时,default才会执行,此时我们可以在default子句中加入诊断消息。
1.3 要点 key point
- 对于简单的if-else语句,特别是里面存在大量处理错误的情况时,应该保证正确的情况是清晰的。(不要本末倒置或鱼龙混杂)。
- 对于if-else if-else 和switch语句,应该选择一中最有利于人阅读的排序。
- 为了捕捉错误,可以使用case语句中的default子句,或者if-else if-else语句中最后那个else子句。
- 各种控制结构并不是生来平等的,不要为了使用而去使用,应该选择更合适的使用。