2009年3月24日星期二

把条件判断提到方法外

我在开发中见过这样的方法:
function doSomething(flag, arg1, arg2) {
if !flag return;
// doSomething logic
....
}

那我就奇怪了,既然caller了解flag,为何不先判断,符合条件才进入doSomething方法呢?

你可能会说我不会写出这样的代码。那看看下面这种稍复杂点儿的变体:
function doSomething(arg1, arg2) {
flag = arg1.checkSomething(arg2);
if !flag return;
// doSomething logic
...
}

根据传入参数的计算结果来决定是否执行后续逻辑的情况与第一个例子其实是一样的。

有时候出现这种情况可能是代码在修改的过程中没有意识到这个问题。另外一种可能的理由是doSomething被多处地方调用,为了避免重复条件判断逻辑,所以把条件判断下推到doSomething方法。

这个理由在某些情况下可能是合理的,比如调用地方太多,改动起来会影响到很多测试,而当前没有足够时间。

但一般来说,我认为对这样的情况,减少条件判断的重复的好处不足以弥补代码在表达性上的损失,而且还要加上doSomething方法的测试所增加的复杂度的代价。