代码大全学习-20-不常见的控制结构(Unusual Control Structures)
2012-08-08 07:18
288 查看
所谓不常见的控制结构,其实也不是那么不常见,只是相对顺序结构,条件结构,循环结构而言。主要有三种:多重返回,递归,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?
多重返回其实还是蛮常见的,就是一个函数里有多个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?
相关文章推荐
- 【代码大全】第17章 不常见的控制结构
- 代码大全第二版读书笔记 第四部分-语句 十七、不常见的控制结构
- MySQL游标和控制结构代码学习
- 四、控制结构和函数Control Structures and Functions
- python学习之路-第二天-常见的注意事项(代码风格、运算符、优先级、控制语句)
- 代码大全学习-22-常见的控制问题(General Control Issues)
- 代码大全学习总结——一般控制问题
- 循环控制结构程序05 - 零基础入门学习C语言20
- 循环控制结构程序05 - 零基础入门学习C语言20
- App工程结构搭建:几种常见Android代码架构分析
- perl控制结构学习笔记
- 常见CNN网络结构的详解和代码实现
- 《代码大全》学习笔记—— 第十七章,不常见的控制结构
- 优化控制结构——读书笔记[Linux程序设计大全]
- 常见股票代码开头说明大全
- 【代码学习】PYTHON字符串的常见操作
- 游戏服务器学习笔记 3———— firefly 的代码结构,逻辑
- 【Java学习4.4】控制循环结构
- 看看软件开发人员在代码编写工作中为什么需要学习代码的优雅性,结构以及效率方面的内容。
- java学习08--程序流程控制--判断结构