代码大全读书笔记(第四部分)——语句

目录

第十四章:组织直线型代码

14.1 必须有明确顺序的语句

14.2 顺序无关的语句

第十五章:使用条件语句

15.1 if语句

简单if - then 语句

if - then - else语句串

15.2 case语句

为case选择最有效的排列顺序

使用case注意事项

第十六章:控制循环

16.1选择循环的种类

什么时候使用while循环

什么时候用带退出的循环

何时使用for循环

何时使用foreach循环

16.2 循环控制

进入循环

处理好循环体

退出循环

检查端点

使用循环变量

循环应该有多长

16.3 轻松创建循环——由内而外

第十七章: 不常见的控制结构

17.1 子程序中的多处返回(return)

17.2 递归(recursion)

使用递归的技巧

17.3 goto

17.4 对不常见控制结构的观点

第十八章: 表驱动法

18.1 表驱动法使用总则

18.2 直接访问表

构造查询键值对

18.3 索引访问表

18.4 阶梯访问表

第十九章: 一般控制问题

19.1 布尔表达式

19.2 复合语句

19.3 空语句

19.4 避免使用深层嵌套

19.5 编程基础:结构化编程

结构化编程的三个组成部分

19.6 控制结构与复杂度

降低复杂度的一般原则


第十四章:组织直线型代码

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选择循环的种类

  1. 计数循环
  2. 连续求值循环
  3. 无限循环
  4. 迭代器循环

什么时候使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值