【问题标题】:Best option for managing module classes管理模块类的最佳选择
【发布时间】:2011-07-30 11:15:01
【问题描述】:

我的游戏库由一系列模块组成,按类组织,在需要时创建、更新和交互。

一些示例可能是:CWindowManagerCGraphicsManagerCPhysicsManager 等等。

不得不说我目前对它们使用全局指针 (extern CWindowManager* g_WindowManager;),我很惭愧,而且我知道这可能是一件坏事。

无论如何,问题是这些模块需要动态地创建和删除,当然是按照正确的顺序。还有一个问题是CPhysicsManager这样的模块是依赖于场景的,所以在切换场景时会被删除,然后重新创建。

现在,我想放弃使用全局变量来处理我的游戏中的模块。

我不害怕重构,但我真的想不出什么是全局变量的最佳替代方案。

我考虑过创建一个 CModuleManager 类并将模块的实例作为成员存储在其中,然后从 CModule 基类派生。虽然我真的想不出这将如何详细工作。

这似乎是软件开发,尤其是游戏开发中的常见问题,所以:

- 与简单地使用全局指针相比,管理模块的最佳选择是什么?

【问题讨论】:

  • 看起来你的问题是特定于 C++ 的,所以考虑重新标记它,C++ 人可能会帮助你

标签: c++ design-patterns modularity coupling


【解决方案1】:

使用全局数据时需要考虑的一些事项:

  • 多线程。如果全局数据可以被不同的线程同时访问,您需要小心。
  • 可测试性。如果您正在编写单元测试,则需要在任何代码访问全局数据之前初始化全局数据。

使用全局数据的另一种方法是将每个类/方法所需的对象实例作为参数传递。这样做的好处是类的所有依赖项都可以从 API 中看到。它还使编写单元测试变得更加容易。缺点是如果您在各处传递对象,代码可能会变得混乱。

您拥有 ModuleManager 的想法听起来像服务定位器模式 - 我认为这是一个可行的解决方案。此链接可能会有所帮助:http://gameprogrammingpatterns.com/service-locator.html

如果选择继续使用全局指针,那么在 C++ 中可以使用智能指针 (auto_ptr) 来实现动态删除全局数据。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 2012-08-26
    • 2010-12-14
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多