管理模块类的最佳选择

时间:2011-07-30 11:15:01

标签: c++ design-patterns modularity coupling

我的游戏基础包含一系列模块,按类组织,在需要时创建,更新和交互。

一些示例可能是:CWindowManagerCGraphicsManagerCPhysicsManager等。

我不得不说我目前使用全局指针(extern CWindowManager* g_WindowManager;),我知道这可能是一件坏事。

无论如何,事情是这些模块需要动态创建和删除,当然也需要按正确的顺序创建和删除。还有像CPhysicsManager这样的模块依赖于场景的问题,因此在切换场景然后再次创建场景时会删除它们。

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

我并不害怕重构,但我真的不能想到什么是全局变量的最佳选择。

我考虑过创建一个CModuleManager类并将模块的实例存储在那里作为成员,然后从CModule基类派生。虽然我无法真正想到这将如何发挥作用。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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