TXT 原文在 http://pan.baidu.com/s/1i39TmV7 留存了一份,想要看原文的可以去下载,下面是我自己节选的
1、在复查软件系统时, 要注意, 系统是由很多部分组成的, 不仅仅只是执行语句. 还要注意分析以下内容: 文件和目录结构|生成和配置过程|用户界面和系统的文档.
2、进行重构时, 您从一个能够正常工作的系统开始做起, 希望确保结束时系统能够正常工作. 一套恰当的测试用例(test case)可以帮助您满足此项约束.
3、要注意并重视代码中特殊的非功能性需求, 这些需求也许会导致特殊的实现风格.
4、在移植代码或修改接口时, 您可以通过编译器直接定位出问题涉及的范围, 从而减少代码阅读的工作量.
5、了解局部的命名约定, 利用它们来猜测变量和函数的功能用途.
6、当基于猜测修改代码时, 您应该设计能够验证最初假设的过程. 这个过程可能包括用编译器进行检查|引入断言|或者执行适当的测试用例.
7、要养成遇到库元素就去阅读相关文档的习惯; 这将会增强您阅读和编写代码的能力.
8、代码阅读有许多可选择的策略: 自底向上和自顶向下的分析|应用试探法和检查注释和外部文档, 应该依据问题的需要尝试所有这些方法.
9、使用De Morgan法则简化复杂的逻辑表达式.
10、不需要为了效率, 牺牲代码的易读性.
11、创造性的代码布局可以用来提高代码的易读性.
12、将a<<n理解为a*k, k=2n, 将a>>n理解为a/k, k=2n.
13、每次只分析一个控制结构, 将它的内容看作是一个黑盒.
14、将每个控制结构的控制表达式看作是它所包含代码的断言.
15、用复杂循环的变式和不变式, 对循环进行推理.
16、使用保持含义不变的变换重新安排代码, 简化代码的推理工作.
17、在C程序中, 指针一般用来构造链式数据结构|动态分配的数据结构|实现引用调用|访问和迭代数据元素|传递数组参数|引用函数|作为其他值的别名|代表字符串|以及直接访问系统内存
18、以引用传递的参数可以用来返回函数的结果, 或者避免参数复制带来的开销.
19、指向数组元素地址的指针, 可以访问位于特定索引位置的元素.
20、使用全局或static局部变量的函数大多数情况都不可重入(reentrant).
21、共用体在C程序中主要用于优化存储空间的利用|实现多态|以及访问数据不同的内部表达方式.
22、栈上分配的内存块当分配它的函数退出后释放.
23、C程序使用typedef声明促进抽象, 并增强代码的易读性, 从而防范可移植性问题, 并模拟C++和Java的类声明行为.
24、表达式sizeof(x)总会得到用memset或memcpy处理数组x(不是指针)所需的正确字节数.
25、不对称区间中的低位边界代表区间的第一个元素; 高位边界代表区间外的第一个元素.
26、指向结构的指针常常表示访问底层记录和字段的游标.
27、动态分配的矩阵一般存储为指向数组列的指针或指向元素指针的指针; 这两种类型都可以按照二维数组进行访问.
28、可以将表达式sizeof(x) / sizeof(x[0])理解为数组x中元素的个数.
29、如果结构中含有指向结构自身|名为next的元素, 一般说来, 该结构定义的是单向链表的结点.
30、包含指向自身的next和prev指针的结构可能是双向链表的结点.
31、图的结点常常顺序地存储在数组中, 链接到链表中, 或通过图的边链接起来.
32、图中的边一般不是隐式地通过指针, 就是显式地作为独立的结构来表示.
33、在非连通图中, 执行遍历代码应该能够接通孤立的子图.
34、尾递归调用等同于一个回到函数开始处的循环.
35、在多处理器计算机上运行的代码常常围绕进程或线程进行组织.
36、我们可以通过浏览项目的源代码树—包含项目源代码的层次目录结构, 来分析一个项目的组织方式. 源码树常常能够反映出项目在构架和软件过程上的结构.
37、项目的源代码远不只是编译后可以获得可执行程序的计算机语言指令; 一个项目的源码树一般还包括规格说明|最终用户和开发人员文档|测试脚本|多媒体资源|编译工具|例子|本地化文件|修订历史|安装过程和许可信息.
38、检查大型编译过程的各个步骤时, 可以使用make程序的-n开关进行预演.
39、定制编译工具用在软件开发过程的许多方面, 包括配置|编译过程管理|代码的生成|测试和文档编制.
40、可以用断言来检验算法运作的步骤|函数接收的参数|程序的控制流程|底层硬件的属性和测试用例的结果.
41、使用系统的规格说明文档, 了解所阅读代码的运行环境.
42、从用户参考手册中, 我们可以快速地获取, 应用程序在外观与逻辑上的背景知识, 从管理员手册中可以得知代码的接口|文件格式和错误消息的详细信息.
43、文档能够提供非功能性需求背后的理论基础.
44、文档还会说明内部编程接口.
45、在源代码文档中, 单词gork的意思一般是指”理解”.
46、数据流构架的一个明显征兆是: 程序中使用临时文件或流水线(pipeline)在不同进程间进行通信.
47、使用图示来建模面向对象构架中类的关系.
48、用C语言实现的系统, 常常用函数指针的数组, 表达层接口的多路复用操作.
49、用面向对象的语言实现的系统, 使用虚方法调用直接表达对层接口的多嘴复用操作.
50、状态变迁图常常有助于理清状态机的动作.
51、C中的模块, 由提供模块公开接口的头文件和提供对应实现的源文件组成.
52、对象方法经常使用类字段来存储控制所有方法运作的数据(比如查找表或字典)或维护类运作的状态信息(例如, 赋给每个对象一个标识符的计数器).
53、在设计良好的类中, 所有的字段都应在声明为private, 并用公开的访问方法提供对它们的访问.
54、抽象数据类型经常用来封装常用的数据组织方案(比如树|列表或栈), 或者对用户隐藏数据类型的实现细节.
55、使用程序编辑器和正则表达式查找命令, 浏览庞大的源代码文件.
56、使用正则表达式的否定字符类, 可以避免非积极匹配.
57、使用正则表达式 symbol-1. *symbol-2, 可以查找出现在同一行的符号.
58、使用编辑器的大纲视图, 可以获得源代码结构的鸟瞰图.
59、要抵制住按照您的编码规范对外部代码进行美化的诱惑; 不必要的编排更改会创建不同的代码, 并妨碍工作的组织.
60、cdecl 程序可以将难以理解的C和C++类型声明转换成纯英语(反之亦然).、