目录
第十四章:组织直线型代码
14.1 必须有明确顺序的语句
如果语句之间存在依赖关系,并且这些关系要求你把语句按照一定的顺序加以排列,那么设法使得这些依赖关系变得明显
- 设法组织代码,使依赖关系变得明显
- 使子程序名能突显依赖关系
- 可以考虑用子程序参数来明确显示依赖关系
- 用注释对不清晰的依赖关系进行说明
- 用断言或者错误处理代码来检查依赖关系
14.2 顺序无关的语句
- 使代码易于自上而下地阅读
- 把相关的语句组织到一起
第十五章:使用条件语句
15.1 if语句
简单if - then 语句
- 首先写正常代码路径,再处理不常见情况
- 确保判断条件的正确性,特别要注意边界
- 正常情况放在if里而不是else里
- 让if子语句后面跟随一个有意义的语句
- 一般需要考虑else的情况
- 要记得测试else语句
- 检查if和else里的语句是否写反了
if - then - else语句串
- 利用布尔函数调用简化复杂的检测,其实就是增加程序可读性,减少对判断条件的关注
- 把最常见的情况放在最前面
- 确保所有情况都考虑到了
15.2 case语句
为case选择最有效的排列顺序
- 按字母顺序或者数字顺序排列各种情况
- 把正常的情况放在前面
- 按照执行频率排列case子句
使用case注意事项
- 简化每种情况对应的操作,如果case语句执行函数过长可以组织成一个子程序
- 不要为了使用case语句去刻意制造一个变量,case语句是用来处理判断条件数据不复杂的情况
- default子语句只用来检查真正的默认情况
- 也可以用default子语句来检查错误
第十六章:控制循环
16.1选择循环的种类
- 计数循环
- 连续求值循环
- 无限循环
- 迭代器循环
什么时候使用while循环
如果预先不知道循环迭代多少次,就使用while循环
- 检测位于循环开始
while(something)
{
}
- 检测位于循环结尾
do
{
}while(something)
什么时候用带退出的循环
何时使用for循环
如果需要一个执行次数固定的循环,那么for循环就是一个很好的选择
何时使用foreach循环
foreach很适用于对数组或者其他容器的各项元素执行操作。
16.2 循环控制
进入循环
- 只从一个位置进入循环
- 把初始化代码紧放在循环前面
- 用while(true)表示无限循环
- 适当的情况下尽量用for循环
处理好循环体
- 用{}把循环体包起来
- 避免使用空循环
- 把循环控制操作要么放在开头要么放在结尾
- 一个循环只做一件事
退出循环
- 确认这个循环是可以终止的
- 让循环终止条件看起来明显
- 不为了终止循环而去修改for循环下标
- 循环结束后的下标不去使用,同理while里控制循环条件的变量也不在循环体外使用
- 考虑使用安全计数
检查端点
- 对循环的端点情况进行验证和检测
使用循环变量
- 循环变量用整数或者枚举类型,不用float
- 嵌套循环中使用有意义的变量名来提高可读性
- 用有意义的名字避免下标串话
- 把循环下标变量的作用域控制在循环体内
循环应该有多长
- 尽可能短,一目了然
- 循环嵌套控制在三层内
- 长循环的内容移到子程序里
- 让长循环格外清晰
16.3 轻松创建循环——由内而外
- 由内而外创建循环体
- 把循环体中的数据替换为带下标的数据
- 检查循环条件
- 写出初始化代码
要点在于从具体事件入手,在同一时间只考虑一件事,以及从简单的部分开始创建循环。
第十七章: 不常见的控制结构
17.1 子程序中的多处返回(return)
- 如果能增强可读性就用return
- 用于检测并提早退出
- 减少每个子程序的return
17.2 递归(recursion)
使用递归的技巧
- 确认递归能够停止
- 使用安全计数防止出现无穷递归
- 把递归放在一个子程序中,避免出现循环递归,减少程序复杂度,
- 留心栈空间
- 用递归的时候可以用栈和循环来实现,考量优劣
17.3 goto
17.4 对不常见控制结构的观点
第十八章: 表驱动法
表驱动法是一种编程模式——从表里面查找信息而不使用逻辑语句。
18.1 表驱动法使用总则
适当的环境下使用表驱动法,所生成的代码会比复杂的逻辑代码更简单共容易修改,效率也高。
18.2 直接访问表
构造查询键值对
18.3 索引访问表
18.4 阶梯访问表
第十九章: 一般控制问题
19.1 布尔表达式
- 用true 和false来做布尔判断
- 隐式地比较布尔值与true和false,把表达式当作布尔表达式,可以写出更清晰的判断语句(nil == obj)
- 把一个大的判断拆分,并引入新的布尔变量
- 把复杂表达式做成布尔函数 if(hasdone())
- 用决策表代替复杂的条件
- 编写肯定形式的布尔表达式,而不是长的否定形式的
- 用括号使布尔表达式更清晰
- 按照数轴的顺序编写数值表达式
常见问题
- 在C家族语言中,应该把常量放在比较的左端
- java 中 a==b 和a.equals(b) 不同
19.2 复合语句
19.3 空语句
19.4 避免使用深层嵌套
- 重复检测条件中的某一部分来简化嵌套的if语句
- 用break块来简化嵌套if
- 把嵌套if转化成一组if then else
- 把嵌套if 转换成case语句
- 把深层嵌套的代码块放到子程序中
- 通过面向对象的方法,在子类中实现对应的执行部分
19.5 编程基础:结构化编程
一个应用程序应该只采用一些单入单出的控制结构。
结构化编程的三个组成部分
- 顺序(Sequence)
- 选择(Selection)
- 迭代(Iteration)
19.6 控制结构与复杂度
程序复杂度的一个衡量标准是,为了理解应用程序,你必须在同一时间记住的智力实体的数量。
降低复杂度的一般原则
如何度量复杂度:
从1开始,一直往下通过程序,一旦遇到以下关键字,或者同类的词,就+1,
if, while, repeat for, and,or
case语句中的每一种情况都+1
尽量保证同一时间关注的复杂度 < 10