我正在使用C#开发一个复杂的桌面客户端,主要用于一些科学分析工作。我项目的类层次结构非常复杂。问题是,在客户入口时,用户应该能够修改大量参数。
但是,许多参数在类层次结构中非常深(我的意思是组合层次结构,而不是继承)。因此,关闭到顶层的类必须在构造函数中占用大量参数,因为它们从底层的不同类中一直传递。
处理此类问题的最佳做法是什么?我有3个想法:
全局静态变量:只需创建一个Constants
类,并将这些参数存储为静态字段,如Constants.FOO
,Constants.BAR
。
Singleton类:创建一个单例类,并在程序入口处初始化它。获取Constants.GetInstance().FOO
之类的这些参数。
对于每个类,在构造函数中接收较低级别的参数,这使得构造函数签名冗长且复杂。例如,中级常用类可能在构造函数中占用15个参数。
如果我经常使用全局变量或单例,代码将变得非常耦合。但是如果我不使用它们,必须一次又一次地沿着类层次结构传递和接收许多参数。那么复杂的商业软件如何解决这个问题呢?
例如,程序在最顶层创建一个LevelOne
对象。 LevelOne
包含LevelTwoA
和LevelTwoB
等字段。 LevelTwoA
对象包含LevelThree
等字段。然后,如果用户想要在创建LevelTen
时指定LevelOne
字段的值,则LevelTen
的值必须从LevelOne
的构造函数传递到{{1} }}
以LevelNine
为例,如果用户想要在创建Car
Radius 的Gear
,该怎么办? >? Car
对象必须位于整个层次结构的底层。但是,Gear
不应在其构造函数中将Car
作为参数,因为它太过于无足轻重。
答案 0 :(得分:1)
感谢所有关于我的问题的评论和答案。依赖注入正是解决方案。我花了一个下午学习依赖注入是如何工作的。类不应该在构造函数中生成其他类(依赖项),而应该从参数中接收一个类。
您还需要一个或多个配置文件/类来提供所有参数的值。然后创建一个注入器/工厂,根据配置创建所有需要的对象/依赖项。
答案 1 :(得分:0)
我会创建一个builder来构建合成部分并将它们很好地融合在一起。