您的位置:首页 > 编程语言

再看代码中的映射(利用数组优化你的代码---好的代码结构可以让人少加班, 少通宵)

2014-09-21 16:19 197 查看
       在博文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函数完全不用动, 只需要增加注册字段, 实现注册字段对应的函数即可。 可见, 利用数组, 程序的可扩展性是多么好啊。

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

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

        建议以后考评的时候, 不要仅仅关注程序猿实现的功能, 还要去看他写的程序的架构, 看程序的稳健性等诸多因素。 不然的话,每个人都值考虑当前自己的事情, 最后 大家只能在加班和熬夜中“奋战”, 通宵成为惯例, 离职的人越来越多, 剩下的人越来越苦逼。 其实, 一个经常通宵的团队, 几乎差不多就是比较烂的团队。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: