《代码大全》学习笔记——第十六章,控制循环

本文探讨了如何选择合适的循环结构(如 while 和 for 循环),并提供了编写清晰、简洁循环的最佳实践。强调了循环的正确使用对于提高代码可读性和可维护性的重要性。

第十六章,控制循环

前言

16.1 选择循环的种类

什么时候使用 while 循环:

什么时候使用带退出的循环:

如果把循环条件放在开始或结束处,那就要写一个半循环。还要注意把所有的退出条件放在一起,避免将它写的到处都是。带退出的循环更容易理解。

什么时候使用 for 循环:

不需要在内部控制循环,循环条件是简单的递增或递减。如果更为复杂,则要使用 while 循环。

16.2 循环控制

防止循环错误的方法: 1 )减少能够影响该循环的各种因素的数量。 2 )把循环体内部看做一个子程序,把循环控制放在循环体外部。

进入循环:

<!-- [if !supportLists]-->1、 <!-- [endif]-->只从同一个位置进入循环。

<!-- [if !supportLists]-->2、 <!-- [endif]-->把初始化代码紧放在循环前面。就近原则主张把相关的语句放在一起。如果分开放置,在后期的维护过程中,对程序的更改容易产生错误。

<!-- [if !supportLists]-->3、 <!-- [endif]-->用 whiletrue )表示无限循环。

<!-- [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]-->对 continuebreak 的使用保持警惕。它会增加复杂度。

检查端点:

使用循环变量:

<!-- [if !supportLists]-->1、 <!-- [endif]-->用整数或者枚举类型表示数组和循环边界。

<!-- [if !supportLists]-->2、 <!-- [endif]-->在嵌套循环中使用有意义的变量名来提高其可读性。如果是你使用的二维或者多维的数组,也使用含有意义的变量来表示其数组名称。避免使用 ijk 等无意义的名称。

<!-- [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]-->如果这是一个 cjavac++ 循环,是否把循环头留给控制代码了?

循环内部:

<!-- [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]-->如果使用 breakcontinue ,他们用对了吗?

本章要点

<!-- [if !supportLists]-->1、 <!-- [endif]-->循环很复杂,保持循环简单将有助于别人阅读你的代码。

<!-- [if !supportLists]-->2、 <!-- [endif]-->保持循环简单的技巧:避免使用诡异的循环,减少嵌套层次,让入口和出口一目了然,把内务操作代码放在一起。

<!-- [if !supportLists]-->3、 <!-- [endif]-->循环下标很容易滥用,因此命名要准确,并且把他们各自仅用于一个用途。

<!-- [if !supportLists]-->4、 <!-- [endif]-->仔细考虑循环,确认他在每一种情况下都可以运行正常,并且在没一种情况下都可以退出循环。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值