创建该类以实例化所有其他类和子系统的目的是什么

时间:2019-07-01 13:14:35

标签: c++ oop design-patterns

在查看了许多开源项目之后,我注意到其中许多人对整个系统的初始化和取消初始化使用相同的想法。

他们中的许多人都有一个特定的类(可能是一个单调),该类加载资源,实例化所有其他类,子系统,将它们彼此连接并准备在运行时使用的对象结构。 为什么不在main()中这样做呢?

此方法背后的想法是什么?是某种具有很多优点的高级编程模式吗?

4 个答案:

答案 0 :(得分:2)

拥有经理类的原因有很多:

  • 这使事情变得更加一致。如果项目的其余部分是用OOP风格的代码编写的,那么让主类也变得更好一点。
  • 在许多情况下,它可以简化测试。 main cannot be called在C ++中;如果所有内容都在类的构造函数中,则您的测试可以相当自由地调用它。
  • 它允许您同时拥有多个“全局”系统。显然,其实用性取决于项目,但是,例如,并行运行两个系统以确保一致性并非遥不可及。
  • 它可以提供一个更简单的API与库进行交互,因此影响多个子系统的函数可以成为管理器类上的方法,而不是为每个子系统获取参数的自由函数。在GUI库或游戏引擎之类的工具中,这特别有价值,其中可能需要向多个子系统注册一个简单的操作(例如,添加按钮)才能正常工作(渲染,鼠标输入处理) ,键盘输入处理)。
  • 可以更轻松地与其他后端交换子系统。例如,如果您有一个后端使用OpenGL渲染,而另一个后端使用DirectX渲染,则可以使它们都实现相同的“渲染子系统”接口,并在编译时以整个级别更改整个系统。程序,而不必更改每个提及或使用typedef并依靠包括正确标题的人员。

哪些应用程序取决于项目及其目标,当然还有其体系结构的其他部分。如果您对为什么某个特定库会如此工作感到好奇,则应询问该库的维护者。

答案 1 :(得分:0)

使功能模块保持短路有助于清除和调试,因此最好使主模块保持短路。

工厂模式,在初始化期间注册对象,这随后会在程序中生成对象。如果要将新对象集成到您的系统中,例如新插件

,此模式也适用。

答案 2 :(得分:0)

该类称为“组合根”,与支持依赖项注入的软件模块一起使用。

通过将各个部分之间的依赖关系拉入一个单独的模块中,从而将各个部分相互独立,该模块将整个应用程序定义为一个整体。

可能从这里开始:What is a composition root in the context of Dependency Injection

答案 3 :(得分:0)

  

此方法背后的想法是什么?是某种具有很多优点的高级编程模式吗?

其中的分析部分有时称为用例(功能),称为“启动”。 Craig Larman's book on OOAD将其称为初始域对象惯用语(不是一种模式):

  

应用程序如何启动?

     

启动 用例的 startUp initialize 系统操作抽象地表示了启动应用程序时执行的初始化阶段。若要了解如何为此操作设计交互图,必须首先了解可能发生初始化的上下文。应用程序如何启动和初始化取决于编程语言和操作系统。

     

在所有情况下,通用的设计习惯是创建初始域对象或一组对等的初始域对象,它们是创建的第一个软件“域”对象。可以在开始的 main 方法中或在从 main 方法调用的 Factory 对象中显式进行此创建。

     

通常,初始域对象(假设为单数形式)一旦创建,就负责创建其直接子域对象。例如,被选择为初始域对象的 Store 可能负责创建 Register 对象。

     

例如,在Java应用程序中, main 方法可以创建初始域对象,也可以将工作委托给创建它的 Factory 对象。

他稍后提供以下用于选择域对象的指南:

  

在域对象的包含或聚合层次结构的根或根附近选择一个类作为初始域对象。这可能是外观控制器(例如Register),也可能是一些其他对象,其中包含所有或大多数其他对象(例如Store)。

后者是销售点应用程序的域模型,其中存储和注册是类。