我正在构建一个应用程序,随着时间的推移,我有越来越多的对象在启动时初始化。转移,一些较新的对象依赖于其他对象,所以我得到某种spaggetti初始化,其中创建对象然后传递给其他构造函数。我怀疑我弄错了。
例如,我有一个WinForm接受“Controller”类和2个事件。需要告诉控制器WinForm中是否存在DataGridView,因此它有一个方法
Controller::SetDataGridReference(DataGridView^ dgv)
是否有一种通用方法在启动时实例化对象然后将这些对象引用到彼此?
我被告知将所有必需的类作为构造函数参数是一个很好的做法,但坦率地说,我不知道如何在这里做到这一点。
我并不认为语言很重要
答案 0 :(得分:5)
这看起来像是使用依赖注入(DI)的教科书案例。它肯定有助于您的意大利面条代码,甚至可以协助单元测试。如果您想逐步迁移到DI,您可能需要考虑重构具有类似关系的对象,并使用几组工厂类来处理所有样板链初始化以及集中管理所有代码库中的所有内容。
我可以推荐Google Guice作为Java的优秀DI框架。即使您不使用Java,也可以将DI模型与其他语言的DI框架进行比较
答案 1 :(得分:2)
根据问题的具体情况,可以选择可能两种模式:
答案 2 :(得分:1)
使用控制器设计模式。
也就是说,创建一个将在程序初始化时实例化的SINGLE类,称为Controller。在该类的构造函数上,创建所有其他对象。无论需要任何其他对象的对象应该在其构造函数上接收所述对象作为参数。没有人,绝对没有任何其他对象应该在他们的构造函数上创建任何东西。将所有内容作为参数传递给构造函数。另外,在Controller类的析构函数/ dispose中以相反的顺序调用所有对象的析构函数/ dispose方法。这不会减少你的代码,但是如果以后能够更好地理解和调试它。
答案 3 :(得分:1)
Dependency Injection应该有帮助:在应用程序启动时,您可以选择构建完整(或某种)对象图。应用程序的入口点将实例化您选择的DI容器,您只需要根对象。
例如Google Guice带有一个非常漂亮的Object grapher。
答案 4 :(得分:0)
对于对象互动,我会选择Mediator。看看这个定义:
“定义一个封装一组对象如何交互的对象.Mediator通过保持对象明确地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。”
对于实例化,我会考虑依赖注入。请记住,您可以自由地使用和混合设计模式来实现您的目标。