段代码删掉,它指的是版本控制预编译开关,或其它不编译那段特定代码的技术。如果不存在
空间限制问题,你也可以保留这段查错代码,并让它向一个错误记录文件隐蔽地传送信息。
去掉那些引起程序终止的代码。在开发阶段,程序发现了一个错误时,你会希望这个错误
越引人注意越好,以便你能修复它,通常,达到这一目的最好办法是让一个程序在发现错误时
打印出错误信息然后终止。即使对于微小错误来说,这样做也是很有用的。
而在最终软件中,在程序终止前,用户总是希望有机会将其工作存盘。他们往往愿为达到
这一目的而忍受一些反常现象,用户们不会感激那些使其工作付诸东流的东西,不管这些东西
在调试阶段多么有用,哪怕最终极大提高了软件质量。如果程序中含有会使干百万数据丢失的
调试代码,那么在最终产品中应将其去除掉。
保留那些可以使程序延缓终止的代码。同时,那些相反的代码也应该保留。如果程序中含
有测试潜在致命错误的信息,那么用户会为能在它们最终发展起来之前将自己的工作有盘而感
到高兴。我所使用的文字处理机在溢出内存之前会亮起“SAVE”提示灯进行警告,当发现这一
情况后就立即存盘并退出。当重新启动程序时,一切又变得正常了。从理论上说,程序不应该
溢出内存,而且,在用同一台机器重新启动程序运行同一文件时,它也不应该用更多内存。产
生了内存溢出问题说明程序有缺欠,但是,程序员想得很周到,在程序中保留了内存检查代码,
我也宁愿得到一个警告信息,而不愿失去我前面所做的工作。
保证留在程序中的错误提示信息是友好的。如果在程序中保留了内部错误提示信息,要确
保它是用友好的语言表达。在我早期编程工作中,我曾经收到一个用户的电话,说她在屏幕上
看到了这样的信息“你的指针地址有错,笨蛋!”幸亏她还有一些幽默感,这对我来说是很幸运
的。通常的办法是通知用户存在“内部错误”,并告诉用户一个她可以投诉的电话号码。
要对防错性编程提高警惕。过多的防错性编程会带来它自身的问题,如果你对每一种可以
察觉的参数传递,在每一个可以察觉的地方都进行检查,那么程序将变得臃肿而笨拙。更糟的
是,附加的用于防错性编程的代码本身并非是完善无缺的,同其它代码一样,你也会在其中发
现错误,而且,如果你是随意写它的,那么错误也会更多。考虑好需要在哪里预防错误,然后
再使用防错性编程。
5.7 子程序参数
子程序间的接口往往是一个程序中最容易出错的部分,由Basili 和Perricone 进行的一项研
究表明,程序中39%的错误都是内部接口错误,即予程序间的通信错误。以下是尽量减少这类
错误的一些准则:
确保实际参数与形式参数匹配。形式参数,即哑参数,是在子程序定义中说明的变量,实
际参数是在调用程序中使用的变量和参数。
常见的错误是在子程序调用时变量类型有误,比如,在需要使用实型数时使用了整型数
(这种情况只在像C 这种弱类型的语言中,才会遇到。例如,在汇编语言或在C语言中未使用
全部编译程序的全部警告时就可能产生这种问题。而在Pascal 中,当变元是单纯输入的时候,
几乎不会产生这个问题)。通常编译程序在把实参传入子程序之前,会把它转为形参的类型。如
果产生这个问题,编译程序通常会产生警告。但是在某些情况下,特别是当变元既用于输入也
用于输出时,你可能由于传递了错误的变元类型而受到惩罚。