如何处理具有复杂类层次结构的大量参数?

时间:2016-04-07 15:16:57

标签: c# design-patterns singleton global-variables

我正在使用C#开发一个复杂的桌面客户端,主要用于一些科学分析工作。我项目的类层次结构非常复杂。问题是,在客户入口时,用户应该能够修改大量参数。

但是,许多参数在类层次结构中非常深(我的意思是组合层次结构,而不是继承)。因此,关闭到顶层的类必须在构造函数中占用大量参数,因为它们从底层的不同类中一直传递。

处理此类问题的最佳做法是什么?我有3个想法:

  1. 全局静态变量:只需创建一个Constants类,并将这些参数存储为静态字段,如Constants.FOOConstants.BAR

  2. Singleton类:创建一个单例类,并在程序入口处初始化它。获取Constants.GetInstance().FOO之类的这些参数。

  3. 对于每个类,在构造函数中接收较低级别的参数,这使得构造函数签名冗长且复杂。例如,中级常用类可能在构造函数中占用15个参数。

  4. 如果我经常使用全局变量或单例,代码将变得非常耦合。但是如果我不使用它们,必须一次又一次地沿着类层次结构传递和接收许多参数。那么复杂的商业软件如何解决这个问题呢?

    例如,程序在最顶层创建一个LevelOne对象。 LevelOne包含LevelTwoALevelTwoB等字段。 LevelTwoA对象包含LevelThree等字段。然后,如果用户想要在创建LevelTen时指定LevelOne字段的值,则LevelTen的值必须从LevelOne的构造函数传递到{{1} }}

    LevelNine为例,如果用户想要在创建Car Radius Gear,该怎么办? >? Car对象必须位于整个层次结构的底层。但是,Gear不应在其构造函数中将Car作为参数,因为它太过于无足轻重。

2 个答案:

答案 0 :(得分:1)

感谢所有关于我的问题的评论和答案。依赖注入正是解决方案。我花了一个下午学习依赖注入是如何工作的。类不应该在构造函数中生成其他类(依赖项),而应该从参数中接收一个类。

您还需要一个或多个配置文件/类来提供所有参数的值。然后创建一个注入器/工厂,根据配置创建所有需要的对象/依赖项。

答案 1 :(得分:0)

我会创建一个builder来构建合成部分并将它们很好地融合在一起。