前一段时间,在项目里遇到这样一个问题。
我提供了一些函数,比如A(),B(),C().....。之后其他人根据具体情况调用不同的函数。这些函数有一个
共同点,就是调用方式非常相似。
使用者可能会这样使用这些函数
if(condition == 1) A();
else if(condition == 2) B();
else if(condition == 3) C();
else ...
现在是看不出来有什么问题。但是问题在于调用函数没有这么简单,举一个复杂点的例子。
使用者可能这样使用
if(condition == 1)
{
do{
if(condition2) break;
A();
if(condition3 && condition4)
{
//do some code...
}
}while(condition1)
}
else
if(condition == 2)
{
do{
if(condition2) break;
B();
if(condition3 && condition4)
{
//do some code...
}
}while(condition1)
}
else ...
以上只是为了说明,每种情况的处理方法都差不多,但是都很复杂,有那么多得条件和操作。
现在出现问题了,调用者总会用错这些条件,比如condition2成立应该跳出循环,但是忘记break了。
或者又有其它的一些错误。总之即使调用A的情况弄对了,有的时候就偏偏忘记改调用B的那段代码。
导致问题总是接连不断的出现。
当然,有人说了,你这个明显有重复代码,改成参数化不就行了。
可以改成这样:
void func(int condition)
{
if(condition == 1) A();
else
if(condition == 2) B();
else
...
}
之后上面那段洛里啰嗦的代码就可以这样改
do{
if(condition2) break;
func(condition);
if(condition3 && condition4)
{
//do some code...
}
}while(condition1)。
但是关键的这个func函数应该由谁来提供呢?一开始我只是提供了A,B,C...这些函数,我本以为使用者
可以自己写一个func函数,但是我错了,使用者并没有这么做,而是赤裸裸的按照最笨的那种方法。当我
发现时,已经晚了,程序中到处都是这样的代码,以至于我苦不堪言。虽然单独提供A,B,C...可以使程序
更加灵活(万一使用者对函数有了不同的使用情况),但是到现在为止没有出现什么特例的使用情况。
而我也非常后悔,为什么自己不在当初提供一个参数化的方法。