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

被折叠的 条评论
为什么被折叠?



