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

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

概述我有点困惑为什么在好奇的重复模板模式(CRTP)设计模式上有如此多的“讨厌”,例如我正在阅读“Game Programming Gems 3”,并且有一个名为autoLists的设计.这使用CRTP创建每种类型对象的数组. 我的问题: 为什么这是一件坏事?特别针对AutoLists的想法,但一般来说CRTP的答案就足够了. 我的目的是在实体组件系统中使用它,这样我就可以轻松地分离每种类型的组件. 我有点困惑为什么在好奇的重复模板模式(CRTP)设计模式上有如此多的“讨厌”,例如我正在阅读“Game Programming Gems 3”,并且有一个名为autoLists的设计.这使用CRTP创建每种类型对象的数组.

我的问题:

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

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

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

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

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

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

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

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

总结

以上是内存溢出为你收集整理的奇怪的重复模板模式(CRTP),AutoLists和C.全部内容,希望文章能够帮你解决奇怪的重复模板模式(CRTP),AutoLists和C.所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1219853.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存