1

我正在尝试重构一些代码,这些代码根据对象需要的配置类型传递不同的参数组合。例如:

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)
{
...
}

...ETC

我不想使用属性,因为感觉它隐藏了一些可能的依赖关系,例如,如果分配了端口属性,则对象可能需要传入服务器。不要挂断示例参数,这只是我从空中抽出来的东西。

我查看了 Builder 模式,但这并不是我所需要的。任何建议都会很棒!

我正在使用 .NET 2.0

4

2 回答 2

0

实际上,如果目的是始终创建一个“有效”对象以使该对象永远不会处于半配置状态,那么 Builder 模式是合适的。构建器保存数据点,直到它们全部被分配,然后可以一次性创建一个完全配置的对象。

但是听起来您不相信您的开发人员会阅读文档以了解要配置的内容……您确实提供了文档,对;)

在这种情况下,也许提供一组构建器,每个构建器只公开与最终对象所需的“模式”相关的属性。

所以像这样的东西(伪代码和编造的,因为你没有提供任何关于你真正想要建模的暗示)

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它只是暴露了相关的属性集。

于 2012-08-01T13:29:53.213 回答
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;
         ...
    }
}
于 2012-07-31T20:16:32.663 回答