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



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

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

这种方法背后是哪种想法?是一些具有很大优势的高级编程模式吗?

有几个理由可以拥有经理类:

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

哪些适用于项目及其目标,以及其其他架构。如果您对任何特定图书馆为什么会喜欢它的原因感到好奇,则应要求库的维护者。

这种方法背后是哪种想法?是一些具有很大优势的高级编程模式吗?

分析部分有时被称为用例(功能(,称为"启动"。Craig Larman在OOAD上的书称其为初始域对象成语(不是一个模式(:

应用程序如何启动?

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

在所有情况下,一个常见的设计成语是创建初始域对象或一组对等初始域对象,这些域是创建的第一个软件"域"对象。此创建可能在starting main 方法中明确发生,也可以在 factory 对象中从 main 方法中调用。

通常,最初的域对象(假设创建单个情况(是为创建其直接子域对象的原因。例如,选择作为初始域对象的A store 可能负责创建A register 对象。

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

后来给出了选择域对象的以下指南:

选择作为初始域对象,一个或附近域对象的集合或聚合层次结构的类。这可能是一个立面控制器,例如寄存器或其他被认为包含所有其他或大多数对象的对象,例如商店。

后者是指销售点申请的域模型,其中商店和注册是类。

保持功能模块的短路有助于清晰有助于因此,调试,因此优选的主模块可以保持短路。

工厂模式,在初始化过程中注册对象,进而在程序中稍后产生对象。如果要将新对象集成到您的系统中,则此模式也是合适的,例如新插件

该类称为"构图根",与支持依赖注入的软件模块一起使用。

它允许零件通过将它们之间的依赖关系拉到一个单独的单独模块中,从而将零件彼此独立。

可能从这里开始:在依赖注入

的上下文中,什么是构图根。

最新更新