1、子程序中的多次返回
-
使用return语句的指导原则
- 如果能增强可读性、那么就使用return
- 用防卫子句(早返回早退出)来简化复杂的错误处理
- 减少每个子程序中return的数量
2、递归
在递归里,一个子程序子句复杂解决某个问题的小部分,它还把问题分解成很多的小块,然后调用自己来分别解决每一个小块。当问题的小部分很容易解决,而问题的大部分也容易分解成众多的小部分时,常常会用到递归。
-
使用递归的技巧
- 确认递归能够停止
- 使用安全的计数器防止出现无穷递归
- 把递归限制在一个子程序内
- 留心桟空间
- 不要用递归去计算阶乘或者斐波那契数列
3、goto
goto争论的现代版本仍在以各种各样的形式出现。如争论多处返回、多个循环出口、具名循环出口、错误处理及异常处理等。
-
反对goto的论点:
- 没有使用goto的代码就是高质量的代码
- 含有goto的代码很难安排好格式
- 使用goto也会破坏编译器的优化特性
- 使用goto会使运行速度更慢,代码更大
- 实践中,使用goto会违背代码应该严格自上而下的原则
-
支持goto的观点:
- 在特定的场合下谨慎的使用goto,不要不分青红皂白的使用
- 如果使用恰当,goto可以减少重复的代码
- goto在分配资源、使用资源后再释放资源的子程序里非常有用
- 某些情况下,goto会让代码运行速度更快,体积更小
- 编程水平高并不等于不使用goto
- 对goto做了几十年的研究后,人们还是无法证明它们是有害的
- 很多现代语言已经包含了goto
-
为避免使用goto,可能的重写策略:
- 用嵌套的if重写
- 用一个状态变量重写代码
- 用try-finally重写
-
是否使用goto?
用不用goto是一个信仰问题。在现代语言里,可以很容易把九成的goto替换成与之等价的顺序结构。对于这些简单情况,应该把替换goto当成习惯。对于复杂的情况,仍有九成不用goto的可能,可以采用上述的重写策略来替换goto。对于剩下的1%的情况,使用goto是合理的办法,请在使用的同时予以详细的说明。
-
使用goto的指导原则:
- 在那些不直接支持结构化控制的语言里,用goto模拟控制接口,但不要滥用goto
- 在语言中内置等价控制结构的情况下不要用goto
- 如果是为了提高代码效率而使用goto,请衡量此举实际带来的性能提升
- 除非你要模拟结构化语句,否则尽量在每个子程序内只使用一个goto标号
- 除非你要模拟结构化语句,否则尽量让goto向前端跳转而不要向后跳转
- 确认所有的goto标号都被用到了
- 确认goto不会产生某些执行不到的代码
- 对于goto用法所展开的争论并不是事关全局的
4、针对不常见控制结构的观点
一些离奇、过时、危险的,但是曾经被任务是可以接受、所期望的想法:
- 不加限制的使用goto
- 能动态计算出goto的跳转目标并且执行跳转
- 用goto从一个子程序的中部跳转到另外一个子程序的中部的能力
- 根据行数或者标号调用子程序,从而允许代码从子程序中间的某个位置开始执行
- 具备让应用程序动态生成代码并执行这些代码的能力
更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/
本文链接:http://tabalt.net/blog/cc2-unusual-control-structures/,转载请注明。
