代码大全学习-20-不常见的控制结构(Unusual Control Structures)

来源:互联网 发布:安安电子狗软件 编辑:程序博客网 时间:2024/04/26 07:35
    所谓不常见的控制结构,其实也不是那么不常见,只是相对顺序结构,条件结构,循环结构而言。主要有三种:多重返回,递归,goto。一个一个说。
    多重返回其实还是蛮常见的,就是一个函数里有多个return语句。其目的主要是增强可读性。比如有时候一些错误处理检查条件嵌套太深,不如不满足条件就马上返回。还有一个好处是可以提高效率,比如有些函数得到结果了就可以马上返回,后面那些其他的情况都不用再处理。但是它带来的问题也很明显,就是你不仔细看函数里面根本不知道它什么时候会返回,有时大家默认在最后返回,结果中间不知道什么地方它就提前返回了,这可能会引入bug。所以原则上,尽量少用,除非真的能提高可读性。
    递归是教科书上都会提到的一种方法,而且经常举的是阶乘或者Fibonacci数列的例子。这两个例子举的不怎么好,因为用递归来计算阶乘或者Fibonacci数列是又慢又不好理解又容易引起内存问题。当然,它们还是证明了递归是可用的,也展示出了递归的概念。递归被归到不常见的控制结构里的主要原因是因为它的不好理解。它存在的理由是在某些特定的情况下它可以使得代码大幅简化。我们用递归是因为它能降低复杂性,所以在用之前要先问问自己,是不是能降低复杂性。用的时候也有几点要注意,比如一定要有退出条件,注意递归的层数,会不会导致栈溢出,内存不够用,可以考虑用一个安全计数器等。
    Goto语句是一个讨论了N多年的话题,有支持的,有反对的。说一下作者建议的使用原则吧。99%的情况下都是用不着goto的。剩的那1%用的时候要注意:一、用在某些不支持结构化控制的语言中模拟结构。二、用在某些goto能提高效率的场合,这里还要注意是不是真能提高效率,能提高多少,衡量下值不值。三、goto都往下走,不要倒着走,除非是在模拟循环结构等。四、一个函数里最好只有一个goto的标签,多了太混乱。五、不要因为goto而引入不可达的语句。总之就是实在不得不用的时候才用它,优先要考虑其他的方法。
    附上Checklist:
Checklist: Unusual Control Structures
 return
  Does each routine use return only when necessary?
  Do returns enhance readability?
 Recursion
  Does the recursive routine include code to stop the recursion?
  Does the routine use a safety counter to guarantee that the routine stops?
  Is recursion limited to one routine?
  Is the routine's depth of recursion within the limits imposed by the size of the program's stack?
  Is recursion the best way to implement the routine? Is it better than simple iteration?
 goto
  Are gotos used only as a last resort, and then only to make code more readable and maintainable?
  If a goto is used for the sake of efficiency, has the gain in efficiency been measured and documented?
  Are gotos limited to one label per routine?
  Do all gotos go forward, not backward?
  Are all goto labels used?
原创粉丝点击