如果为null,则指示构造方法使用默认值

时间:2018-02-23 16:16:05

标签: c# design-patterns default-value

我正在设计一个带有类似这样的构造函数的API包装器:

public class Client(string username, string password, int timeout = 60)

来电者看起来像这样:

class Program 
{
    private static int? Timeout => GetFromConfig("Timeout");

    static void Main(string[] args)
    {
        Client client = new Client(Username, Password, Timeout);
        // do things...
    }
}

如果超时为空,我想使用客户端的默认超时(60)。

我知道几个选项:

1)在Main

中使用条件逻辑
static void Main(string[] args)
{
    if (Timeout == null) 
    {
        Client client = new Client(Username, Password);
    }
    else 
    {
        Client client = new Client(Username, Password, Timeout);
    }
}

我不喜欢这个解决方案,因为1)它是很多代码,2)当我添加条件参数时,代码会呈指数级增长(例如,如果我将int MaxFailedRequests = 5添加到Client()的签名,我的if / else块增长到4个街区。)

2)处理Client()

中的空值
public class Client(string username, string password, int? timeout) 
{
    _timeout = timeout ?? 60;
}

我不喜欢这个解决方案,因为默认值不再在构造函数的签名中公开(这可以作为优秀的/免费文档)。

3)使用默认值

处理Client()中的空值
public class Client(string username, string password, int? timeout = 60) 
{
    _timeout = timeout ?? 60;
}

我不喜欢这个解决方案,因为1)它不会立即显现出如何处理null(需要更多文档),以及2)默认值是重复的(如果有人修改了一个但是忘了修改另一个则会发臭)。 / p>

4)在Main

中使用null运算符和usedefaultparam关键字
static void Main(string[] args)
{
    Client client = new Client(Username, Password, Timeout ?? usedefaultparam);
    // ...
}

我喜欢这个解决方案,因为如果我添加更多可选参数,它很容易阅读和增长。

我不喜欢它,因为usedefaultparam关键字似乎不存在。

因此我的问题是:

是否存在类似选项4的内容?如果没有,是否有一个我没想到的更好的第五种模式?

1 个答案:

答案 0 :(得分:3)

调用者应该为timeout参数提供值,或者使用Client类'构造函数中定义的默认值。

如果您希望能够使用在调用者类的Client类中定义的默认值,则应该从Client类中公开它。例如,你可以使用常量:

public class Client
{
    public const int DefaultTimeout = 60;

    public Client(string username, string password, int timeout = DefaultTimeout)
    {
        //...
    }
}

<强>号码:

static void Main(string[] args)
{
    Client client = new Client(Username, Password, Timeout ?? Client.DefaultTimeout);
    // ...
}