35

人们采取什么方法(如果有的话)来管理您班级中的保护条款爆炸?例如:

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
    {
        throw new ArgumentNullException("var1");
    }

    if (items == null)
    {
        throw new ArgumentNullException("items");
    }

    if (count < 1)
    {
        throw new ArgumentOutOfRangeException("count");
    }

    ... etc ....
}

在我目前正在处理的项目中,有许多类在公共方法上有一组类似的保护子句。

我知道 .NET 4.0 代码合同,但目前这不是我们团队的选择。

4

5 回答 5

60

我见过的很多项目都使用静态Guard类。

public static class Guard {
    public static void ArgumentIsNotNull(object value, string argument) {
        if (value == null)
            throw new ArgumentNullException(argument);
    }
}

在我看来,它使代码更干净。

Guard.ArgumentIsNotNull(arg1, "arg1");
于 2009-10-20T23:40:52.643 回答
4

如果您不想走代码合同路线,简化它的一种方法是删除大括号:

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
        throw new ArgumentNullException("var1");

    if (items == null)
        throw new ArgumentNullException("items");

    if (count < 1)
        throw new ArgumentOutOfRangeException("count");

    ... etc ....
}

除此之外,如果您反对 .Net 4.0 还不是黄金时间,还有一些方法可以模拟代码合同:

http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx

于 2009-10-20T23:35:49.930 回答
4

您可能会考虑重构以引入 Null Object

于 2009-10-21T00:03:50.630 回答
4

同时这里有一篇很棒的文章:http: //haacked.com/archive/2013/01/05/mitigate-the-billion-dollar-mistake-with-aspects.aspx/

我会考虑使用NullGuard.Fody,因为我对 Fodys 减少样板代码的能力感到兴奋

于 2015-02-07T08:06:08.250 回答
4

减少(不完全删除)保护子句数量的一种方法是了解它们存在的原因。很多时候,我们要防范对参数类型有效但对接受它们的方法无效的值。换句话说,方法是在参数类型定义的域的子集上定义的。

这类情况的解决方案是尝试定义一个子类型(例如,更严格的接口)并接受该类型作为参数。您可以在本文中找到一个说明性示例:为什么我们需要保护子句?

当然,这种技术并不适用于所有情况。所有引用类型至少允许空引用。因此,我们的大多数方法都将在域的一部分上定义,而这又需要一个针对 null 的保护子句。

但从积极的方面来说,这种技术有助于提高人们对接收比预期更普遍的论点的方法的认识。给该孔配管有助于改善总体设计。

于 2015-08-19T20:16:49.120 回答