加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

奇怪的重复模板模式(CRTP),AutoLists和C.

发布时间:2020-12-16 10:23:52 所属栏目:百科 来源:网络整理
导读:我有点困惑为什么在好奇的重复模板模式(CRTP)设计模式上有如此多的“讨厌”,例如我正在阅读“Game Programming Gems 3”,并且有一个名为autoLists的设计.这使用CRTP创建每种类型对象的数组. 我的问题: 为什么这是一件坏事?特别针对AutoLists的想法,但一般
我有点困惑为什么在好奇的重复模板模式(CRTP)设计模式上有如此多的“讨厌”,例如我正在阅读“Game Programming Gems 3”,并且有一个名为autoLists的设计.这使用CRTP创建每种类型对象的数组.

我的问题:

为什么这是一件坏事?特别针对AutoLists的想法,但一般来说CRTP的答案就足够了.

我的目的是在实体组件系统中使用它,这样我就可以轻松地分离每种类型的组件.

解决方法

我已经在C,Java和C#中广泛使用了CRTP及其一些变体,并且从“同事反馈”中我可以告诉你一件事:许多人根本不理解它,并且自动变得敌对“这样过于复杂废话”.

直到有人使用它几次,人们才真正发现很难看到它的好处 – 就像他们看到的任何其他“复杂”“新”机制一样.

确实有时它被用在错误的地方,并且必须特别小心地使用它 – 但这是任何重要工具的生命.就像多继承一样 – 很多人讨厌它.但你怎么能讨厌锤子呢?没有什么可恨的,只要正确使用它并在真正有益的地方使用,而不仅仅是因为你可以.

首先,重新考虑一下你是否真的需要使用它.模板基类是否真的需要知道确切的派生类型?虚拟成员还不够吗?没有它可以逃脱吗?您的案例有哪些好处?它是否会使“更高级代码”更短,更易读,更明显或更具可扩展性或更不容易出错?

在许多情况下,您会发现基础不需要知道确切的派生类型,您可以用更多的虚拟方法替换它.但这可能会使整个代码对于更多用户来说更加复杂.另一方面,对于CRTP,最终的机制更多是“自动化”,有时实际上并不是有益的.

对于实体类,通常CRTP的某些变体实际上有一个原因:如果你的基础暴露了一些返回“类似”对象的实用方法,你经常希望这些方法返回精炼的“MyObject *”而不是“ObjectBase *”,那就是没有它很难实现.但是,真正的问题是:这些方法真的应该在实体的基类中而不是在“工厂”,“经理”或“存储上下文”中吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读