再看代码中的映射(利用数组优化你的代码---好的代码结构可以让人少加班, 少通宵)
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.
有经验的软件开发者应该知道这样一个道理: 一拿到需求就开始写代码的人, 往往不是高手, 因为高手通常需要先构思一下代码架构。 仅仅实现功能是远远不够的, 要考虑的程序的兼容性(过去), 健壮性(现在), 扩展性(将来)等等。 我们来看一个简单的程序:
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函数完全不用动, 只需要增加注册字段, 实现注册字段对应的函数即可。 可见, 利用数组, 程序的可扩展性是多么好啊。
这些都是软件开发中的细微功底, 千万不要忽视。 很多时候, 第一直觉是对的, 是可以实现功能的, 是可以讨得领导喜欢的, 领导就是爱逼进度嘛, 爱催大家嘛。第一直觉可以实现功能的方法, 是可以让你今天早下班不用加班的, 是可以让你在今天暂时获得一点成就感的。 但是, 对的, 未必就是好的, 未必就是对未来有好处的。
有一点比较可惜的是, 在一个团队中, 真正去关注程序结构的人, 确实不多, 大家都喜欢早下班, 今天要实现的功能, 怎么简单怎么搞, 不考虑团队中其他的一些同事将来在该处可能要扩展程序。
建议以后考评的时候, 不要仅仅关注程序猿实现的功能, 还要去看他写的程序的架构, 看程序的稳健性等诸多因素。 不然的话,每个人都值考虑当前自己的事情, 最后 大家只能在加班和熬夜中“奋战”, 通宵成为惯例, 离职的人越来越多, 剩下的人越来越苦逼。 其实, 一个经常通宵的团队, 几乎差不多就是比较烂的团队。
相关文章推荐
- 学会利用“配置文件”优化我们的代码结构
- HibernateCallBack原理以及利用回调接口优化代码结构 .
- 【代码优化】学会利用“配置文件”优化我们的代码结构
- HibernateCallBack原理以及利用回调接口优化代码结构
- JavaScript: 让函数式编程优化你的代码结构
- CSS网页实例 利用box-sizing实现div仿框架结构实现代码
- 利用Rational Rose进行C++代码和数据库结构分析
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
- 利用Rational Rose进行C++代码和数据库结构分析
- 利用VS“生成方法存根”—放空层次调用 专注写代码结构
- [BUC-2.10]利用分治的思想求无序数组中的最大值和最小值以及求第二大的值(分治的思想可以使得比较的次数1.5N-2)
- javascript中利用数组实现的循环队列代码
- 一小段利用adox获取表结构主键字段的代码
- javascript中利用数组实现的循环队列代码
- 【转】巧用CPU缓存优化代码:数组 vs. 链表
- PB动态数组实现机理1 --- 利用本身的结构来实现动态二维数组
- main主函数执行完后,可以利用atexit再执行一段代码
- 利用Rational Rose进行C++代码和数据库结构分析
- [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
- 利用onresize使得div可以随着屏幕大小而自适应的代码