第十六章,控制循环
前言
16.1 选择循环的种类
什么时候使用 while 循环:
什么时候使用带退出的循环:
如果把循环条件放在开始或结束处,那就要写一个半循环。还要注意把所有的退出条件放在一起,避免将它写的到处都是。带退出的循环更容易理解。
什么时候使用 for 循环:
不需要在内部控制循环,循环条件是简单的递增或递减。如果更为复杂,则要使用 while 循环。
16.2 循环控制
防止循环错误的方法: 1 )减少能够影响该循环的各种因素的数量。 2 )把循环体内部看做一个子程序,把循环控制放在循环体外部。
进入循环:
1、 只从同一个位置进入循环。
2、 把初始化代码紧放在循环前面。就近原则主张把相关的语句放在一起。如果分开放置,在后期的维护过程中,对程序的更改容易产生错误。
3、 用 while ( true )表示无限循环。
4、 在适当的情况下多使用 for 循环。 For 循环将循环控制代码集中在一处。从而有助于形成可读性强的代码。
5、 在 while 循环更适用的时候,使用 while 循环。不要把和循环无关的代码放在循环头部。
处理好循环体:
1、 用 {} 将循环体括起来。
2、 避免空循环。有时候如果把循环检测和循环执行放在循环头中,会出现这种情况。
3、 把循环内务操作(?循环的内务操作是指向 i++ , j++ 之类的循环控制操作)要么放在循环的开始,要么放在循环的结尾。
4、 一个循环只做一件事情。
退出循环:
1、 设法确认循环可以终止。
2、 循环终止条件看起来很明显。
3、 不要为了推出循环而胡乱的更改下标。为了获得对循环更多的控制权,可以使用 while 循环来实现。
4、 避免出现依赖于循环下标最终取值的代码。更好的具有自描述的做法是,定义一个变量,将循环下标赋值给它。
5、 使用安全计数器:用于在如果循环过多会产生灾难性后果的情况下使用。
提前退出循环:
1、 考虑在 while 循环中使用 break 语句而不是使用布尔标记。
2、 对循环中存在过多 break 语句的情况提高警惕。
3、 在循环开始处使用 continue ,可以代替 if 判断,提高可读性。
4、 对 continue 和 break 的使用保持警惕。它会增加复杂度。
检查端点:
使用循环变量:
1、 用整数或者枚举类型表示数组和循环边界。
2、 在嵌套循环中使用有意义的变量名来提高其可读性。如果是你使用的二维或者多维的数组,也使用含有意义的变量来表示其数组名称。避免使用 i , j , k 等无意义的名称。
3、 用有意义的名字来避免循环下标串话。
4、 把循环变量的作用域限制于循环内部。
循环应该有多长:
1、 循环要尽可能的短,以便能够一目了然。尝试“编写简单代码的原则”,那么会很少写出超过 20 行的循环。一般的,一个函数在 7 行左右。
2、 把嵌套控制 3 层内。提取子程序来优化。
3、 把循环体内部的长的语句提取层一个子程序。
4、 要让长循环格外清晰。
我发现,这本书中的很多原则都基于一个中心,就是“帮助人的大脑来降低复杂度,代码对人的友好性远大于代码对机器的友好性”。
16.3 轻松创建循环——由内而外
先写一个一般的过程,再把这个过程用循环代替。
CHECKLIST: Loops核对表:循环循环选择: 1、 在合适的情况下用 while 循环代替 for 循环了吗? 2、 循环式由内到外创建的吗? 进入循环: 1、 是从循环头进入循环的吗? 2、 初始化代码直接位于循环前面吗? 3、 循环式无限循环或事件循环码?它的结构是否清晰? 4、 避免使用像 for i=1 to 999 这样的代码吗? 5、 如果这是一个 c , java , c++ 循环,是否把循环头留给控制代码了? 循环内部: 1、 把内务处理集中的放在循环开始或循环结束处了吗? 2、 循环像定义良好的子程序那样只执行了一件操作吗? 3、 循环短的足以一目了然吗? 4、 循环嵌套层次不超过三层吗? 5、 把长循环的内如提取为单独的子程序了吗? 6、 如果循环很长,那么它非常清晰吗? 循环下标: 1、 如果是 for 循环,那么循环中的代码有没有随意的修改下标的值? 2、 是否把重要的循环下标的值保存在另外的变量里,而不是在循环外使用该循环下标的值? 3、 循环下标的名字有意义吗? 4、 循环避免了下标串话的问题吗? 退出循环: 1、 循环在所有可能的条件下都能够终止吗? 2、 如果你建立了某种安全计数器标准,循环使用安全计数器了吗? 3、 循环退出的条件清晰吗? 4、 如果使用 break 或 continue ,他们用对了吗? |
本章要点
1、 循环很复杂,保持循环简单将有助于别人阅读你的代码。
2、 保持循环简单的技巧:避免使用诡异的循环,减少嵌套层次,让入口和出口一目了然,把内务操作代码放在一起。
3、 循环下标很容易滥用,因此命名要准确,并且把他们各自仅用于一个用途。
4、 仔细考虑循环,确认他在每一种情况下都可以运行正常,并且在没一种情况下都可以退出循环。