先啥也不说, 把实际的复杂场景抽象如下:
#include <iostream>
using namespace std;
typedef enum
{
UNDEF_F,
F1,
F2,
F3,
}FLAG;
void base(int x, FLAG flag)
{
cout << x << " " << flag << endl;
}
// 已知这个函数的接口绝对不能改变
void middle(int x)
{
base(x, UNDEF_F);
}
// 这个函数中参数标志为F1
void top1()
{
middle(100);
}
// 这个函数中参数标志为F2
void top2()
{
middle(100);
}
// 这个函数中参数标志为F3
void top3()
{
middle(100);
}
int main()
{
int i = 0;
for(i = 0; i < 10; i++)
{
top1();
}
for(i = 0; i < 10; i++)
{
top2();
}
for(i = 0; i < 10; i++)
{
top3();
}
return 0;
}
遇到这样一个棘手的问题:top1/2/3中的函数调用middle的时候, 把某个不重要的参数flag故意省去了, 结果呢, 后来又要用flag这个参数, 但又不能再为middle增加参数个数了, 怎么办呢?
讨论方案后, 有的人说: 再花点大力气给middle增加一个参数嘛; 有的人说: 把另外一个参数绑定在middle的x上, 然后解析; 有的人说: 用变参函数替代啊;有的人说: 这个问题无解, 就不要解决了吧。
其实, 仔细想想, 上面哪个方案都不可取。
排开一切的干扰和思维定式, 还是得想办法想出路, 我居然感觉用全局变量可行:
#include <iostream>
using namespace std;
typedef enum
{
UNDEF_F,
F1,
F2,
F3,
}FLAG;
FLAG g_flag = UNDEF_F;
void base(int x, FLAG flag)
{
if(UNDEF_F == flag)
{
flag = g_flag;
}
g_flag = UNDEF_F;
cout << x << " " << flag << endl;
}
// 已知这个函数的接口绝对不能改变
void middle(int x)
{
base(x, UNDEF_F);
}
// 这个函数中参数标志为F1
void top1()
{
g_flag = F1;
middle(100);
}
// 这个函数中参数标志为F2
void top2()
{
g_flag = F2;
middle(100);
}
// 这个函数中参数标志为F3
void top3()
{
g_flag = F3;
middle(100);;
}
int main()
{
int i = 0;
for(i = 0; i < 10; i++)
{
top1();
}
for(i = 0; i < 10; i++)
{
top2();
}
for(i = 0; i < 10; i++)
{
top3();
}
return 0;
}
经自测并经历多轮版本考验, 这个问题算是得到解决了, 而且工作量也确实小了很多很多(说明: 上述程序只是真实复杂场景的一个简化, 比如, 调用top1的地方其实遍布程序各处, 而不是在一个for中)
这个问题实际上阻塞了很长时间, 长达几十天, 一直遗留。 原来各方预计, 解决这个问题可能要2-3天, 非常麻烦, 而且容易造成版本极不稳定(实际上, 我后来也意识到, 如果为middle函数增加一个接口, 必然会导致程序到处都是bug, 得不偿失), 所以迟迟不敢动手。
就用全局变量吧。 不过, 我不禁要问: 当初在写middle函数的时候, 是谁把一个不重要的参数故意丢掉的呢? 别跟我说: 因为不重要, 所以丢掉。 我只想问, 这不是在耍流氓么?
好吧, 该吸取的教训还是要吸取的: 1. 多想方法, 少找借口少扯淡, 而且要相信一定有相对比较好的方法; 2. 要多为未来考虑一点点, 考虑一下未来的程序。