C++:组织程序子系统的正确方法是什么?

问题描述:

想象一下,您有一个大型的应用程序项目,代码被分割成一系列子系统,实现为从CBaseSubsystem派生的类。C++:组织程序子系统的正确方法是什么?

这里已经说到我的第一个问题:

  • 这是个好主意,组织子系统,如类[从基类派生]

然后,你有你的子系统类。现在,您需要在某处创建它们的实例。但是哪里?

  • 这是个好主意,有存储在一个全局变量中的每个子系统的实例,例如:
    extern CEventSystem* g_EventSystem;

  • 应该在哪里实例被实际创建?所有在一个主要()类似的功能?

  • 或者是更好的避免全局变量完全和组织的情况下,在CSubsystemManager类或类似的?使用

  • 将单班是一个合适的方法呢?

如果您需要一种方法来访问每个子系统的情况下,我会避免使用“外部”,并以一个单,让您可以访问CSubsystemManager的一个实例,而不是去。经理本身可以负责实例化和管理你的子系统对象。

+0

但是,每一个子系统要与相互通信时,就需要“找到”通过分系统管理的另一个 - 也不会是什么问题? – Jarx 2011-03-01 20:56:22

+0

这取决于查找功能的价格。您可以将子系统实例存储在一个由int索引的向量中(您可以为每个子系统类型定义一个枚举值)。或者,您可以在对象构造中查找相关的子系统,并在类变量中存储引用。这样,你只能做一次查找。 – Stephan 2011-03-01 21:51:40

+0

后一个听起来像是一个合理的解决方案,是的,谢谢 – Jarx 2011-03-01 22:09:22

如果你想谈理论,而不是提供再具体问题考虑在其中可以实现为一系列不同对象类型的类似的操作子系统的FactorySingletonStrategy的可能性相结合方面进行设计。

主要子系统厂本身是一个单,其目的是希望明显。使用延迟评估来只允许根据需要加载所需的子系统对象。您可能需要考虑为每个子系统提供一个引用计数机制,以便在不再需要时将其删除。一些子系统本身可能是单身人士,并且/或者也可以实施策略模式来为一系列类别类型提供特定服务。 此服务可能是例如验证,渲染,序列化等。

以这种方式构建您的应用程序是否是一个“好主意”的价值判断不是我说的。我宁愿让更老的智慧对此说话。

非常相似this。我会避免Singleton,因为这是绝对没有必要的,并带来many other issues

在类似于主的例程中创建实例。如果某个东西需要某个系统,请通过某种方式提供对它的访问权限,无论是直接传递给该东西的某个参数还是提供对这些系统的访问权限的一个容器(IE:CSubSystemManager)。您可能不需要编写CSubSystemManager。

避免全球状态,还有它有一个耻辱的理由。

+0

+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.)