程序鲁棒性的误区

来源:互联网 发布:传奇3挂机软件 编辑:程序博客网 时间:2024/04/28 22:35
 在参加面试的过程中,面试官经常会要求你写一段程序,实现某某功能,他们的评分标准里往往有一条如何处理边界条件,而且这个比例占的很大。这本来没错,但是出题者往往事先不暗示你。不可否认,如何处理异常情况是一个非常重要的能力,但是,如此考察的方式,存在着非常大的误区:

1. 函数是实现约定的功能。给定一个函数,不支持异常情况不表明该函数鲁棒性不强,可以在函数的规范中注明,比如传入参数不会空。
2. 函数有异常判断,不表明函数鲁棒性好。在现实的程序中,在哪一层处理异常情况是非常有讲究的。
一个简单的例子(忽略不好的命名习惯):
process() {
param = getParam();
step1(param); 
step2(param);
....
stepn(param);
}
假设step1, step2.... stepn是函数process的一系列步骤,如果参数异常(比如为空),应该不执行step1-n,那么应该怎么写process, step1,... stepn的异常判断呢?
是在每个stepx函数里加一句 if(invalidParam(param)) return; 好呢?还是在process里加这一句好呢?
显然是process里 ,而即使在step函数里加了异常判断,你的程序不会变得更健壮,反而更累赘。
这个例子表明了函数是一个约定,函数的调用者必须遵守这个约定,因此像写一个f(int * p) 之类的,是否需要判断p == null完全取决于对函数的定义,而不是对于每个函数,都去做无谓的判断,尤其是内部使用函数,更多的时候需要调用者知道调用场景。