巧用成员函数指针

前面一段时间在宠物模块重构的时候,惊叹这个模块的好几个函数长度居然有达到3000行,在重构这块的时候用,利用函数指针写了一个小的工具模板。函数指针与成员函数指针,在一些进阶应用中时有涉及,比如常见的EventMap,这里介绍一个经常用成员函数指针来对长长switch的进行的重构手法。
先简单的说明一下函数指针与成员函数指针:



 


在一个初始的设计当中,往往容易出现如下的函数结构:

  
 在开始的时候,这个结构还是相当的美观的,随着开发的深入,这个函数增长超出你的想象,而且结构越来越混乱,哪些该放在switch里面 ,哪些改放在 switch前面,哪些该放在switch后面,也让你越来越纠结。在工作当中,我接手的一个模块就很多地方有这种冗长的接口,记得一个处理宠物使用道具的接口,总共有15个switch分支(总共有15种道具可对宠物使用),接口函数的总长度达到3568行,全部是逻辑代码,这个函数从前面看到后面最终也不知道自己再看什么了。为了分解这个接口,用了一个函数指针表来存储入口,然后根据选项计算接口地址。最终用模板来表达这个概念,在同一个类里面把算法封装到各个子接口,然后把算法子接口存储在一张表里面,根据选择项调用不同的算法接口。

 




上面代码中可以非常清晰的看到用一个IClassFunctionMap::DoEventHandle接口处理策略分配。而具体的处理工作都分布在ExEventHandle_1 , ExEventHandle_2...中,而且这个策略是一个动态变化的,

可以在需要的时候通过接口IClassFunctionMap::AddEventHandle和接口IClassFunctionMap::DelEventHandle改写策略map,



后记,上面的实现可以考虑用一个固定大小的数组来替代map(C++虚函数表就是一个127的数组),优化执行效率。

Sign, Clown , 2010.06.30 . 19:45 . HDPY

[本文原创,转载请注明出处,在文章末尾提供原文链接http://www.cnblogs.com/JefferyZhou/,否则一旦发现,将按字节每人民币收费,绝不论价]

 

//装载 ps。。。这作者声明太厉害类。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值