【代码阅读的方法与实践】第2章 基本编程元素

来源:互联网 发布:淘宝图片大小多少合适 编辑:程序博客网 时间:2024/06/05 17:03

2章 基本编程元素

多数情况下,代码阅读是一项自底向上的活动。

用编译器对代码进行编译,检查产生的警告信息。

分析一个程序时,main是一个好的起点,就是要从最重要的部分开始。

要了解一个函数的功用,可以使用以下的策略:

猜,基于函数名

阅读位于函数开始部分的注释

分析如何使用该函数

阅读函数体的代码

查阅外部的程序文档

阅读代码时,常会采用渐进式理解的方式。理解了这一部分代码可能会使得其它部分变得十分明晰。

每次只分析一个控制结构,将它的内容看作是一个黑盒,结构化编程的优点就是:它采用控制结构,允许抽象和选择性地推理程序的各个组成部分,而不必考虑程序总体的复杂性。

层叠if-else if-... -else 序列可以看作是由互斥选择项组成的选择结构。

所有输出函数,特别在程序的标准输出重定向到文件时,都有可能由于各种原因而失败

存储输出的设备没有剩余空间

设备上分配给用户的空间可能耗尽

进程对文件的写入可能超出进程或文件大小的最大限制

输出设备上可能发生硬件错误

文件描述符或与标准输出关联的流或许不能写入

不检查输出操作的结果可能引起程序悄然失败,在没有任何警告的情况下丢失输出。一个实用的办法就是在程序结束前,检查标准输出流上的错误。

有时,要想了解程序在某一方面的功能,运行它可能比阅读源代码更为恰当。

在分析重要的程序时,最好首先识别出重要的组成部分。

了解局部的命名约定,利用它们来猜测变量和函数的功能用途。

当基于猜测修改代码时,您应该设计能够验证最初假设的过程。这个过程可能包括用编译器进行检查、引入断言、或者执行适当的测试用例。

理解了代码的某一部分,可能帮助您理解余下的代码。

解决困难的代码要从容易的部分入手。

要养成遇到库元素就去阅读相关文档的习惯;这将会增强您阅读和编写代码的能力。

代码阅读有许多可选择的策略:自底向上和自顶向下的分析、应用试探法和检查注释和外部文档,应该依据问题的需要尝试所有这些方法。

for(i=0; i<n; i++) r 形式的循环执行n次;其他任何形式都要小心。

涉及两项不等测试(其中一项包括相等条件)的比较表达式可以看作是区间成员测试。

我们经常可以将表达式应用在样本数据上,借以了解它的含义。

使用De Morgan法则简化复杂的逻辑表达式。

在阅读逻辑乘表达式时,总是可以认为正在分析的表达式以左的表达式均为true;在阅读逻辑和表达式时,类似地,可以认为正在分析的表达式以左的表达式均为false

重新组织您控制的代码,使之更为易读。

将使用条件运算符?:的表达式理解为if代码。

不需要为了效率,牺牲代码的易读性。

高效的算法和特殊的优化确实有可能使得代码更为复杂,从而更难理解,但这并不意味着使代码更为紧凑和不易读会提高它的效率。

创造性的代码可以用来提高代码的易读性。

我们可以使用空格、临时变量和括号提高表达式的易读性。

在阅读您所控制的代码时,要养成添加注释的习惯。

我们可以用好的缩进以及对变量名称的明智选择,提高编写欠佳的程序的易读性。

diff程序分析程序的修订历史时,如果这段历史跨越了整体重新缩排,常常可以通过指定-w选项,让diff忽略空白差异,避免由于更改了缩进层次而引入的噪音。

do循环的循环体至少执行一次。

执行算术运算时,当b=2^n-1时,可以将a&b理解为a%(b+1)

a<<n理解为a * k , k = 2 ^ n

将每个控制结构的控制表达式看作是它所含代码的断言。

return, goto, break continue语句,还有异常,都会影响结构化的执行流程。由于这些语句一般都会终止或重新开始正在进行的循环,因此要单独推理它们的行为。

用复杂循环的变式和不变式,对循环进行推理。

使用保持含义不变的变换重新安排代码,简化代码的推理工作。