在查看了许多开源项目之后,我注意到其中许多人对整个系统的初始化和取消初始化使用相同的想法。
他们中的许多人都有一个特定的类(可能是一个单调),该类加载资源,实例化所有其他类,子系统,将它们彼此连接并准备在运行时使用的对象结构。
为什么不在main()
中这样做呢?
此方法背后的想法是什么?是某种具有很多优点的高级编程模式吗?
答案 0 :(得分:2)
拥有经理类的原因有很多:
main
cannot be called在C ++中;如果所有内容都在类的构造函数中,则您的测试可以相当自由地调用它。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)。
后者是销售点应用程序的域模型,其中存储和注册是类。