Date:
2005-1-3========================================================
对于某些程序来说,可以加进一些容错的功能,不过最好还是加进错误报告功能。错误报告可以只报告最近发生的多个错误中的一个,因为所有这些错误都将导致程序不可用。另外,函数可以对参数的合法性进行检查,但是这不是最重要的,而且为了编程的方便与易读,这个检查其实没有必要一直都做。但是对于用户提供的数据应该作检查。这是保证程序稳定可靠的关键。还有一点:如果是一个类的成员函数,在操作前应该检查对象的状态。
Date:
2004-2-29=======================================================
之前我提到过要对所有要同步的数据做一个列表,以保证数据一致性。这里我要说的是我们要对所有的匈牙利命名法中的变量前缀也做一个列表以说明每个前缀分别是什么意思。
Date:
2003-9-30=======================================================
经过最近三次程序开发的经历:HTTP SERVER、图形学程序、为陈中润写的本地内存分配程序,我发现 CODE
REVIEW(可以叫做代码复习)是一个很重要的 DEBUG 的方法。一般来说,程序每到一个关键时候,就应该做一下 CODE REVIEW。但是 CODE
REVIEW 比较花时间,不可以经常做。
同时 MODELING 也是很重要的一个技巧,因为出于某些程序的特点,它可能不是一个简单的模型。比如说我的
RPSHELL,它在打开文件的时候最好是使用一个第三方代理“OPEN
AGENT”。为什么呢?因为打开一个文件需要好几个步骤,所以我们现在要做这件事,就要使用一个 AGENT,让它和 SHELL
进行交互。具体的实现我还没有做,但是我想象起来就是把它封装在一个函数里,然后在其他函数里面注册这个 AGENT 所需要的消息。当这些消息发出时,让这个
AGENT 函数来处理这些消息。这样一个打开文件的过程就可以完成了。
Date:
2003-4-27=======================================================
今天我发现了发现程序错误的一个很好的办法:一边写注释,一边检查。另外,根据微软公司的工程师林斌的说法,一边给别人讲解自己程序一边自己也能发现很多错误。
Date:
2002-10-19======================================================
变量放在哪里定义?1. 如果变量只在这一个函数里面有用,那么只在这一个函数里面定义。2.
如果变量对好几个函数都有用,并且这些函数都在同一个文件里面,那么就放在这个文件的头部作为静态全局变量。3.
如果变量只是在一个分支或者循环里面有用,那么用大括号把变量括起来。4.
如果变量只是在一个函数的一段代码里面起作用,有两种方法来处理:把变量用大括号括起来,或者把函数拆分成几个函数。
Date:
2002-6-9========================================================
Robbie Mosaic
的经典思想:一个好的程序像一幢好的房子,它外观美丽,内部结构四通八达,但是不会漏风漏雨。而且,每个部位都容易清扫。
Date:
2002-5-25=======================================================
对于分支语句,把所有的条件都考虑一遍(比如有 if 一定也要考虑 else)。
Date:
2002-4-1========================================================
不会用好 Ctrl + C 和 Ctrl + V 的程序员不是好的程序员。同样,不会用好查找和替换的程序员也不是好程序员。
Date:
2002-4-1========================================================
判断一个程序正确与否,就是看它在理想的环境下能否保持其数据结构的完整性,以及能否实现期望的变化。
Date:
2002-3-9========================================================
今天,我发现一个事实:编写程序或进行设计时,最好先从大局来观看事物,这样,错误很容易被发现,不必要的事也可以不做。当然,细节也很能影响大局,所以必须在适当的时候改变整体策略。虽然这样做可能需要较大量的代码修改以及重写,但是非常有助于程序的逻辑严密性和实用性。
Date:
2002-2-19=======================================================
在编写程序时,一般不要过早追求程序功能多,因为在没有完全掌握程序特性之前,很有可能作出错误的估计,写出低效或错误(令人感到不爽)的代码。应该逐步建立整个程序。
对于有些低质量的代码,宁可重新写,也不要不舍得丢弃。
Date:
2001-12-9=======================================================
我发现了一个实用的检查程序错误的方法:
每个函数单独检查的时候,跟踪函数中的每一个变量,如果对每一个变量的操作没有问题,那么函数也应该没有大问题,最多有一些小问题。
Date:
2001-10-4=======================================================
1. 我建立了一种通用的命名变量的方法:用不多于三个的小写字母表示变量的类型,作为前缀。然后紧跟一个下划线,再用类似 Java
的变量命名方法(第一个单词小写,以后的单词首字母大写)来进行余下的命名。这一命名方法还是麻烦了一些,只适用于全局的变量或对象。
2.
同样地,我建立了一种通用的函数名称命名方法。首字母是否大写并不重要,关键是如果用一个动词加一个名词构成函数名,那么就应该把动词写在前面。
3. 我感到,最人性化的命名方法就是骆驼命名法(Java 所采用的),而最人性化的代码书写方法是 QuickC
的帮助及例子中的代码书写格式。
Date:
2001-9-16=======================================================
编程时需要注意的一点:就算让循环变量多一点,也不要为了节省循环变量而用一个循环变量代替好几个。如果这样做,不仅会使得程序的维护工作变得更困难,还会降低可读性,效率其实也没有什么大的提高。
例子:
char chars1[80], chars2[160];
int i, j;
for( i = 0; i < 80;
i++ )
{
chars1[i] = chars2[i + 80];
}
for( i = 0,
j = 0; i < 80; i++, j++ )
{
chars1[i] =
chars2[j];
}
Date:
2001-9-7========================================================
编程时逻辑结构清晰的保障,也是避免编程错误的一法:每写一步,把新建的函数与数据结构之间的关系写下来。对于某种特定的算法,应该先写下来,再进行编程。
Date:
2001-8-8========================================================
1. 在一个 for 循环中,有一个固定的结构模式:
循环变量初始化
循环条件检查
主要处理部分
循环变量递增
只要遵循以上的规则,就不会犯错误。
Date:
2001-7-27=======================================================
1. 编程序以后,应该对程序仔细地加以观察,尽可能凭借眼睛来找到大多数的错误。
2. 对于一些比较难以处理边界问题的程序,比如将一个 unsigned char
数组中的每一个成员都向右移动一定位数,高位空档由高位字节的内容填充,那么这个程序必须考虑头上一个字节和末尾一个字节的问题。这样一来,边界问题就变得很复杂了,为了避免复杂的边界问题,我采用了一种办法,既然移动的位数不超过八位,那么就可以在原数组的头上和末尾补上两个字节,内容都是零,这样,问题就轻而易举地解决了。具体情况请参见
HUFFMAN 压缩的 COMPRESS.C 程序。
Date:
2001-7-19=======================================================
1. 在 C 语言中,很有必要注意整数循环的初始化,一般从 0 开始。HUFFMAN.C 的编写中我曾经就犯了这样一个错误。
2. 类似地,在
C 语言中,(struct Type *)malloc(sizeof(struct Type *)) 是初学者经常犯的错误。正确的应该是:(struct
Type *)malloc(sizeof(struct Type))。
Date:
2001-7-18=======================================================
1. 对于需要释放的动态分配内存,在写好申请分配的代码以后,紧跟着写上释放的代码。
2. C 语言中最要小心的是整数和字符的不同类型。要注意它们的长度、正负的可能性、使用场合。
Date:
2001-6-23=======================================================
我发现了三个可以用于防止编程时出现错误的方法:
1. 对于功能上可以分离,但篇幅较小,并且适合放在一起的代码,可以放在同一个函数中。要点是用大括号把代码括起来(利用 C
语言的特性),以免变量名称的冲突。当然,这并不是必须的。视情况而定。
2. 对于需要保持数据一致性的部分,加一个注释,把所有需要保持一致性的内容写在列表中。
3. 在使用长变量名时,建立适当的规则,并将这些规则写入注释,同时,在写代码时,不时地检查拼写。