代码大全 code complete 阅读笔记-4 第十五章 条件语句 if-else与switch

1.条件语句

1.1 if 语句

在写if语句时应该注意的事项:

  • 首先写正常代码路径;再处理不常见的情况。
    很容易理解,写代码的时候应该把你认为最希望的情况写在最前面,而不是一上来就处理诸如用户非法输入之类的不常见情况。
  • 确保if后括号内的表达式是正确合理的
    尽量使用">=""<=" 而不是"<"">",原因很简单,因为后者更容易犯下 偏差一 (off-by-one)错误。
  • if后应该尽量跟一个有意义的语句
    而不是if什么也不做,然后再else。
  • 把正常情况的处理放在if后面而不要丢在else后
  • 确保所有的情况都考虑到
  • 如果if需要考虑的情况比较多,请试着使用switch结构。
  • 如果if后的布尔表达式比较复杂,可以试着把它封装成函数调用或者定义布尔变量。

下面是符合规范的一种情况:
代码大全 code complete 阅读笔记-4 第十五章 条件语句 if-else与switch


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子句。
  • 各种控制结构并不是生来平等的,不要为了使用而去使用,应该选择更合适的使用。