关于0bug商用之道的第三章的少用模板

对于作者的这个观点,我是有不同意见的。毕竟存在即道理。只是说在不同的场合有不同的作用罢了。

作者在使用跨平台跟嵌入式的微内存中,使用模板却是有一定的受限的。毕竟使用模板在一定程度上是比较占用内存。并且有些ide也是不怎么支持的。

但是这里我得举个反例,说一下模板的好处。

最近在做一个插件管理的借口。

一、描述一下场景:有多种不同类型的插件,假设只有有A和B两种类型的插件,每种类型的插件有n个。然后用户要使用A类型的插件时候我就列出A类型的所有插件供用户选择,反之亦然。但是使用的是嵌入式的wince系统,所以在管理插件方面,当每次用户要使用的时候才去导入插件,并获取插件的信息,这样子过程速度太慢用户体验不好。所以只能在程序运行起来的时候将所有插件的基本信息全部导进来。并且不管插件A或者插件B,它们的基本信息虽然有一定的差异,但是差不多。

二、管理插件的渐进过程:

  1、在写第一类插件的导入时候(即A类型插件),简单的写完成。然后在写第二类插件的时候发现跟第一类插件的代码很类似。这时候笔者就想能否统一一下代码,只写一份代码,供所有类型插件管理的使用。但是因为刚开始各类插件定义的接口不是很合理,所以在基本信息方面,各个接口也定义的五花八门。这里就提出了将所有类型的接口的基本信息全部弄成一样的。

  2、因为每个类型的接口它们是不同的接口,而为了统一接口就想到了模板的方法。首先在导入接口基本信息方面

template<typename CreateFuncType>
OnePlugInfo ImportGeneral(const FileName& plugFileName, const StrVal& createFuncName) {
  HINSTANCE ins = LoadLibrary(plugFileName);
  CreateFuncType createFunc = (CreateFuncType)GetProcAddress(ins, createFuncName);
  OnePlugInfo onePlugInfo = InitPlugInfo(createFunc());

  return onePlugInfo;
}

template<typename PlugType>
OnePlugInfo InitPlugInfo(PlugType* plugType) {
  // 一些初始化的操作
  return onePlugInfo;
}

如上代码所示,在分析某个插件的时候,每个插件有自己本身的创建导入函数,所以需要使用typename CreateFuncType来进行操作。但是在创建的时候不同的插件有自己本身不同插件类型,但是如果直接在本函数进行初始化则根本无法完成,于是笔者就想到了再通过传参让模板本身去推导对应的创建返回是什么类型。

这样子,在这里也就遵循了每个函数只做一件事的操作。如果不是因为遇到无法推导的问题,也许笔者可能直接在本函数里面写,而不会再去弄一个InitPlugInfo函数来进行初始化,毕竟里面操作的事情不算太多也就6~7行的样子。

三、总结

所以相对不使用模板的方式编码,使用模板的方式进行编码可以节省了很多代码,并且不那么容易出错,即使是出错也只是一处地方而已。并且为了使用统一的代码也会促使自己去统一所有插件的基本信息接口。并且编程的速度提高的N倍。

时间: 2024-12-09 12:24:08

关于0bug商用之道的第三章的少用模板的相关文章

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一、 除夕诗词概述 二、元日诗词概述 三、 元宵诗词概述 第二节:春节古诗词拾萃

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一. 除夕诗词概述 二.元日诗词概述 三. 元宵诗词概述 第二节:春节古诗词拾萃 一.腊祭诗词 二.祭灶诗词 三.除夕诗词 四.元旦诗词 五.人日诗词 六.元宵诗词 第一节:春节古诗词概述 中国的春节,作为除旧迎新的节日,时间相当长,从年前的腊月二十三,天空中就似乎弥漫了节日的气息.这种节日的气氛,在保持传统风俗较好的地方,甚至会持续到二月二龙抬头的时候,但欢度春节的高潮,应该说是自除夕始一直到上元之夜.因此,历代歌咏和反

《无码的青春》第三章 忘情水

其实明羽的悲痛一方面是不舍那三年的感情,另一方面前女友在分手后,一边告诉他还爱着他,一边却只用了三个月就另觅新欢,而我也不得不佩服这女人的适应能力.三个理工男自然是木讷之极,不知道如何安慰这受伤的孩子,只能默默的陪着他一杯杯的喝着酒.还不时冒出几句狗血的话, "要不要找几个兄弟把那个男的揍一顿!" "旧的不去新的不来." "你当初就该把生米煮成熟饭." "哎,明显是内存溢出,GC失效了." "这不是GC的问题,是多线

第三章 魔法传送(下)依旧是1100

第三章 魔法传送(下)  “fuck!不在这个世界,一切就白忙活了!没有雷霆之子,雷霆之国真的要亡国了吗?”雷昂着急了,原本偏黑的脸立刻变白了.   “唉,我也没办法呀,天神就不给雷霆之国一条活路吗!”此时奥尔夫显得苍老了更多,原本的银发都要掉光了,脸更加惨白,双眼深深地凹进去,脸上的皱纹已经数不清了.毕竟他耗去150岁的生命呀!  “没有其他办法吗?”这是一直没说话的二长老奥兰多发了句话.她是为女性,也一百多岁了,是奥尔夫的妻子,她有深绿色的眼睛,皮肤极白,头发是浅蓝色的,即使100多岁,看起

【书评:Oracle查询优化改写】第三章

BLOG文档结构图 一.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 _b_tree_bitmap_plans介绍 ② 11g新特性Native Full Outer Join 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2 实验环境介绍 oracle:11.2.0.3  .8.1.7.0.0 OS: RHEL6.5 一.3 前言 前2章的链接参考相

0321《软件工程》前三章总结(初稿)

第一章  软件工程:挑战与魅力共存 软件工程是用工程化的方法做软件开发,是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程. 软件工程的挑战 1.复杂性.软件工程师通常一次只能看到30至80行源代码,随着系统的成长和模块的增多,这些代码会以几何级数的速度增长. 2.不可见性.工程师看不到自己的源代码如何具体地在用户的机器上被执行的,商用软件出现了错误,工程师可以看到程序在出错的一瞬间留下痕迹,但是几乎无法完整重现程序到底出了什么问题. 3.易变性.修改软件容易,可是正确地修改软

jQuery系列 第三章 jQuery框架操作CSS

第三章 jQuery框架操作CSS 3.1 jQuery框架的CSS方法 jQuery框架提供了css方法,我们通过调用该方法传递对应的参数,可以方便的来批量设置标签的CSS样式. 使用JavaScript设置标签的样式相对来说比较麻烦,而如果需要批量的设置多个标签的样式那需要写很多代码,使用jQuery可以为我们简化该过程.     使用原生的方式来设置标签的样式(代码示例) 1 <body> 2 <div>我是div标签</div> 3 <button id=

Windows核心编程之核心总结(第三章 内核对象)(2018.6.2)

学习目标 第三章内核对象的概念较为抽象,理解起来着实不易,我不断上网找资料和看视频,才基本理解了内核对象的概念和特性,其实整本书给我的感觉就是完整代码太少了,没有多少实践的代码对内容的实现,而且书本给的源码例子,有太多我们不知道的知识,并且这些知识对本章主要内容来说是多余的,所以我们理解起来也非常困难.为了更好的学习这章,我补充了一些辅助性内容.这一章的学习目标:1.Windows会话和安全机制2.什么是内核对象?3.使用计数和安全描述符4.内核对象句柄表5.创建内核对象6.关闭内核对象7.跨进

《程序员是怎样跑起来的》第三章

第三章是计算机进行小数运算时出错的原因.主要也是讲了这个原因,读完之后了解到这个原因,是因为有一些十进制数的小数无法转换成二进制数.就会出现错误.因为无法正确表示的数值,最后都变成了近似值.计算机这个功能有限的机器设备,是无法处理无限循环小数的,因此,在遇到循环小数时,计算机就会根据变量数据类型所对应的长度,将数据从中间截断或者四舍五入. 此章又详细介绍了双精度浮点数(64位)和单精度浮点数(32位),又对此加深了理解.对于此前不知道的正则表达式,了解到按照特定的规则来表示数据的形式即为正则表达

实现 RSA 算法之改进和优化(第三章)(老物)

第三章 如何改进和优化RSA算法 这章呢,我想谈谈在实际应用出现的问题和理解. 由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯.) 在讲第一章的时候我提到过两个函数在真实应用时舍弃掉的,为何这样说呢? 因为在实际应用中,生成了数据规模N和两把密钥E与D即可进行RSA算法的运作,在应用RSA时只需要一个a^b%c幂模运算函数,所以优化点集中在了数据类型和数据加密解密速度上. 注意RSA函数有个特点,就是根据源数据产生的密文一定是属于n内的,