我正在尝试重构一些代码,这些代码通过不同的参数组合,具体取决于对象所需的配置类型。例如:
public MyWidget(string server, string port)
{
...
}
public MyWidget(string server)
{
...
}
public MyWidget(bool createAThing,
string nameOfThingToBeCreated,
string server,
string port)
{
...
}
public MyWidget(bool createAThing, string nameOfThingToBeCreated)
{
...
}
...等
我不想使用属性,因为它感觉它隐藏了一些可能的依赖关系,例如如果已分配端口属性,则对象可能需要传入服务器。不要挂在示例参数上,这只是我从空中拉出的东西。
我查看了Builder模式,但这并不是我需要的。任何建议都会很棒!
我正在使用.NET 2.0
答案 0 :(得分:0)
您可以使用配置对象并将其传递给构造函数。 像这样:
public class WidgetOptions
{
public string Server { get; set; }
public string Port { get; set; }
...
}
public class MyWidget
{
public MyWidget(WidgetOptions options)
{
Server = options.Server;
Port = options.Port;
...
}
}
答案 1 :(得分:0)
实际上,如果目的是始终创建一个“有效”对象,使得对象不会处于半配置状态,那么Builder模式是合适的。构建器保存数据点,直到它们全部被分配,然后可以一次创建完全配置的对象。
但听起来你不相信你的开发人员阅读文档知道要配置什么...... 你确实提供了文档,对吧;)
在这种情况下,可能会提供一组构建器,每个构建器仅公开与最终对象所需的“模式”相关的属性。
所以这样的事情(伪代码和弥补,因为你没有提供关于你真正想要建模的任何hinst)
WidgetBuilder
+ whatever properties are common to all widget creation
+ MakeWidget
VectorWidgetBuilder : WidgetBuilder
+ get/set Lines
+ MakeWidget
BitmapWidgetBuilder : WidgetBuilder
+ get/set Image
+ MakeWidget
AnimatedWidgetBuilder : WidgetBuilder
+ get/set Images
+ get/set FrameRate
+ MakeWidget
这种变体的定义是将这些排列定义为各种WidgetOptions
,正如道德大师所称的那样,但每个选择的选项都是它自己的类。因此,您可能只有VectorWidgetOptions
,BitmapWidgetOptions
和AnimatedWidgetOptions
公开相关的属性集。