C++:组织程序子系统的正确方法是什么?
想象一下,您有一个大型的应用程序项目,代码被分割成一系列子系统,实现为从CBaseSubsystem派生的类。C++:组织程序子系统的正确方法是什么?
这里已经说到我的第一个问题:
- 这是个好主意,组织子系统,如类[从基类派生]
然后,你有你的子系统类。现在,您需要在某处创建它们的实例。但是哪里?
这是个好主意,有存储在一个全局变量中的每个子系统的实例,例如:
extern CEventSystem* g_EventSystem;
应该在哪里实例被实际创建?所有在一个主要()类似的功能?
或者是更好的避免全局变量完全和组织的情况下,在
CSubsystemManager
类或类似的?使用将单班是一个合适的方法呢?
如果您需要一种方法来访问每个子系统的情况下,我会避免使用“外部”,并以一个单,让您可以访问CSubsystemManager的一个实例,而不是去。经理本身可以负责实例化和管理你的子系统对象。
非常相似this。我会避免Singleton,因为这是绝对没有必要的,并带来many other issues。
在类似于主的例程中创建实例。如果某个东西需要某个系统,请通过某种方式提供对它的访问权限,无论是直接传递给该东西的某个参数还是提供对这些系统的访问权限的一个容器(IE:CSubSystemManager)。您可能不需要编写CSubSystemManager。
避免全球状态,还有它有一个耻辱的理由。
+1用于突出显示全局状态的危险并阻止Singleton反模式。 – mavam 2011-08-08 10:23:38
我的解决方案将创建一个singleton Registry,AbstractFactory和Factory的组合。
//in base module
class ISubsystem{} //an interface for a subsystem
//in module code
Registry::instance()->registerFactory("subsystem1",new Subsystem1Factory());
//in user code
IFactory* factory = Registry::instance()->getFactory("subsystem1");
ISubsystem* subsystem = factory->createObject(...); //you can implement whatever policy in factory impl. (like singleton etc.)
但是,每一个子系统要与相互通信时,就需要“找到”通过分系统管理的另一个 - 也不会是什么问题? – Jarx 2011-03-01 20:56:22
这取决于查找功能的价格。您可以将子系统实例存储在一个由int索引的向量中(您可以为每个子系统类型定义一个枚举值)。或者,您可以在对象构造中查找相关的子系统,并在类变量中存储引用。这样,你只能做一次查找。 – Stephan 2011-03-01 21:51:40
后一个听起来像是一个合理的解决方案,是的,谢谢 – Jarx 2011-03-01 22:09:22