救命的全局变量?

       先啥也不说, 把实际的复杂场景抽象如下:

#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. 要多为未来考虑一点点, 考虑一下未来的程序。






你可能感兴趣的:(救命的全局变量?)