在博文http://blog.csdn.net/stpeace/article/details/27879953中, 我们谈论过数组的本质, 在博文http://blog.csdn.net/stpeace/article/details/21830005中, 我们简要介绍了一下stl中的map,  在本文中, 我们用数组来模拟一下map.

      有经验的软件开发者应该知道这样一个道理: 一拿到需求就开始写代码的人, 往往不是高手, 因为高手通常需要先构思一下代码架构。 仅仅实现功能是远远不够的, 要考虑的程序的兼容性(过去), 健壮性(现在), 扩展性(将来)等等。  我们来看一个简单的程序:

 

#include <iostream>
using namespace std;

void printCpu()
{
	cout << "Intel" << endl;
}

void printVersion()
{
	cout << "2014..." << endl;
}

void printOS()
{
	cout << "iOS" << endl;
}

int main()
{

	char szName[] = "OS";

	if(0 == strcmp(szName, "cpu"))
	{
		printCpu();
	}

	if(0 == strcmp(szName, "version"))
	{
		printVersion();
	}

	if(0 == strcmp(szName, "OS"))
	{
		printOS();
	}


	return 0;
}

       这是只有3个参数的情况, cpu, version和OS,  那要是有100个参数呢? 岂不是要写100个if?   我承认, 很久以前, 我觉得这样逻辑很自然啊, 结构很清晰啊, 犯过这种比较傻比较天真的错误。  我们知道, 一个东西, 重复的次数太多了, 我们可以用for循环啊, 那有些朋友可能要问了, 这些if对应的字段不同, 怎么能用for进行循环呢? 我们仔细回忆一下, 这不正好是数组的长处吗? 对, 用数组作映射(当然, 也可以用我们之前介绍过的stl map):

 

 

#include <iostream>
using namespace std;

typedef void (*FunType)();

typedef struct _myMap
{
	char *pName;
	FunType pFun;
}MyMap;

void printCpu()
{
	cout << "Intel" << endl;
}

void printVersion()
{
	cout << "2014..." << endl;
}

void printOS()
{
	cout << "iOS" << endl;
}

MyMap mymap[] = 
{
	{"cpu", printCpu},
	{"version", printVersion},
	{"OS", printOS},
};

int main()
{
	int size = sizeof(mymap) / sizeof(mymap[0]);
	int i = 0;

	char szName[] = "OS";
	for(i = 0; i < size; i++)
	{
		if(0 == strcmp(szName, mymap[i].pName))
		{
			(*mymap[i].pFun)();
		}
	}

	return 0;
}

       这就是数组的厉害之处, 下面我们来看看, 程序的可扩展性如何, 如果要再加2个字段, 上面的程序该怎么改呢?

 

 

#include <iostream>
using namespace std;

typedef void (*FunType)();

typedef struct _myMap
{
	char *pName;
	FunType pFun;
}MyMap;

void printCpu()
{
	cout << "Intel" << endl;
}

void printVersion()
{
	cout << "2014..." << endl;
}

void printOS()
{
	cout << "iOS" << endl;
}



// 增加两个新的字段对应的函数
void printEndian()
{
	cout << "little endian" << endl;
}

void printPrinter()
{
	cout << "HP printer" << endl;
}



MyMap mymap[] = 
{
	{"cpu", printCpu},
	{"version", printVersion},
	{"OS", printOS},

	// 增加另个新的字段
	{"endian", printEndian},
	{"printer", printPrinter},
};

int main()
{
	int size = sizeof(mymap) / sizeof(mymap[0]);
	int i = 0;

	char szName[] = "OS";
	for(i = 0; i < size; i++)
	{
		if(0 == strcmp(szName, mymap[i].pName))
		{
			(*mymap[i].pFun)();
		}
	}

	return 0;
}

        看看, main函数完全不用动, 只需要增加注册字段, 实现注册字段对应的函数即可。 可见, 利用数组, 程序的可扩展性是多么好啊。

 

        这些都是软件开发中的细微功底, 千万不要忽视。 很多时候, 第一直觉是对的, 是可以实现功能的, 是可以讨得领导喜欢的, 领导就是爱逼进度嘛, 爱催大家嘛。第一直觉可以实现功能的方法, 是可以让你今天早下班不用加班的, 是可以让你在今天暂时获得一点成就感的。 但是, 对的, 未必就是好的, 未必就是对未来有好处的。 

        有一点比较可惜的是, 在一个团队中, 真正去关注程序结构的人, 确实不多, 大家都喜欢早下班, 今天要实现的功能, 怎么简单怎么搞, 不考虑团队中其他的一些同事将来在该处可能要扩展程序。 

        建议以后考评的时候, 不要仅仅关注程序猿实现的功能, 还要去看他写的程序的架构, 看程序的稳健性等诸多因素。 不然的话,每个人都值考虑当前自己的事情, 最后 大家只能在加班和熬夜中“奋战”, 通宵成为惯例, 离职的人越来越多, 剩下的人越来越苦逼。 其实, 一个经常通宵的团队, 几乎差不多就是比较烂的团队。



 


本文转载:CSDN博客