《代码阅读方法与实践》读书笔记2

创造性的代码布局可以用来提高代码的易读性。我们常常可以通过添加空格,利用临时变量将表达式分解成较小的部分,或使用圆括号提高特定运算符的优先次序等方法,使得表达式更为易读。

         使程序更易读,并不总是需要更改它的结构。一些不会影响程序运行的项(比如注释、空格的使用和变量、函数、类名的选择),常常会影响程序的易读性。

         要注意,虽然重新缩排代码或许有助于提高代码的易读性,它也有可能弄乱程序在修订控制系统中的更改历史。因此,最好不要将重新编排与程序逻辑的任何实际更改合并起来。应该先对代码进行重新编排,将它检入,然后再做其他更改。用这种方式,将来的代码阅读者能够选择性的读取和复查对程序逻辑的更改,不会受到整体重新编排的影响。另一方面,用diff程序分析程序的修订历史时,如果这段历史跨越了整体重新缩进,通常通过制定-w选项,让diff忽略空白差异,避免由于更改了缩进层次而引入的噪音。

         在C和C++程序中,将数组传递到函数和作为结果返回,都要用到指针,在C代码中,将数组名作为函数的参数时,实际上传递给函数的是数组的第一个元素的地址,因而,函数执行时对数组中的数据做出的任何修改,都将影响到数组中的元素。数组这种隐式的引用调用行为,与C语言中所有其他数据类型的传递方式都不相同,因此,可能容易造成混淆。

         类似的,C函数只能返回指向数组元素的指针,不能返回整个数组,因此,当函数在数组中生成结果,并返回相应的指针时,一定要确保该数组不是在函数的栈上分配的局部变量。如果数组是局部变量,在函数退出后,数组的存储空间可能被重写,从而函数的结果也就变无效。

         由于指针在计算机内部以内存地址来表示,所以,低级代码常常使用指针访问与硬件专有的内存区域,许多外设,比如图形和网络适配器,使用一段公共可访问的内存区域与系统的主处理器交换数据。将一个指针变量初始化为指向该区域后,就可以方便的使用这个变量与给定的设备进行通信。

         程序编写时大小未知的数据结构,或程序运行时大小会增长的结构,都存储在程序运行期间动态分配的内存中。程序使用指针来引用动态分配的内存。当内存耗尽时,程序能做的事情并不多,大多数情况喜爱,打印一个错误消息然后退出是唯一可行的策略。

         如果不将内存释放掉,会导致程序出现内存泄露。但是有些程序常常只会分配内存,但从不释放。当程序的运行时间比较短时,可以忽略内存释放的问题;当程序终止后,它所分配的所有内存都由操作系统自动回收。

         Typedef声明为一个已有的类型增加一个新的名称,或称替代名,C程序使用typedef声明促进抽象,并增强代码的易读性,从而防范可移植问题。并模拟C++和java的类声明行为,在C声明组合使用前缀和后缀类型,有时会使得一些typedef声明难以阅读。然后,解读此类声明并不十分困难。只需要将typedef看作是类似的extern或static的存储型描述符,将该声明理解为一个变量定义。

         将typedef声明用作一种抽象机制时,实际上就是为原来的具体实现定义一个抽象名称作为替代名。因而,由于typedef声明的名称是按照恰当命名的抽象概念定制的,不是偶然的实现细节,所以使用这种名称的代码会更容易理解。

         程序的作用是将算法应用到数据之上。数据的内部组织对算法的执行至关重要。

         许多不同的机制都可以将相同类型的元素组织成集合,每种机制都提供各自不同形式的存储与访问数据的方式。用数组实现的向量,提供对所有元素的随机访问,但他不适合运行期间大小发生改变的情况。向量还可以用来将多组元素组织成表的形式,或堆叠成二维,创建矩阵。向量的操作有时被限定只能发生在向量的某一端。栈就是如此;向量的操作也有可能被限定为以先入为主的次序进行,这时候,向量就成为了队列。在元素的次序并不重要的情况下,常常用映射常见查找表和集合,后二者都可以用来形成元素的集合。

 

你可能感兴趣的:(《代码阅读方法与实践》读书笔记2)