Кодекс Контракты цепочки вызовов? - PullRequest
4 голосов
/ 12 января 2012

В основном я смотрю на 2 разные ситуации:

Вызовы методов в одном классе:

public class MyClass
{
    public Bar GetDefaultBar(Foo foo)
    {
        Contract.Requires(foo != null);

        return GetSpecificBar(foo, String.Empty);
    }

    public Bar GetSpecificBar(Foo foo, string name)
    {
        Contract.Requires(foo != null);
        Contract.Requires(name != null);

        ...
    }
}

Вызовы методов в разных классах:

public class MyClass
{
    private MyBarProvider { get; set; }

    public Bar GetDefaultBar(Foo foo)
    {
        Contract.Requires(foo != null);

        return BarProvider.GetSpecificBar(foo, String.Empty);
    }

    //Object-Invariant ensures that MyBarProvider is never null...
}

public class MyBarProvider
{
    public Bar GetSpecificBar(Foo foo, string name)
    {
        Contract.Requires(foo != null);
        Contract.Requires(name != null);

        ...
    }
}

Мне интересно, нужно ли иметь дубликаты контрактов для любой из этих ситуаций? Я предполагаю, что может быть способ избежать этого в первом примере (все в пределах одного класса), но не во втором примере (разные классы). Кроме того, я должен избегать дублирования или это должно быть там?

1 Ответ

4 голосов
/ 12 января 2012

Я полагаю, что дублирование, о котором вы говорите, Contract.Requires(foo != null);.

Вы должны иметь эту строку в обоих методах, в обоих случаях. Если вы не включите его в вызывающую программу, вы получите «Требуется недоказанное» на сайте вызова, потому что вызывающая сторона вызывающего метода может передать нулевое значение. Если вы не включите его в вызываемый объект, контракт вызываемого не будет включать ненулевое требование, и анализатор контракта сочтет, что foo может быть нулевым. Это потому, что другой сайт вызова мог бы свободно передавать нулевое значение.

EDIT

Как указывает Ɖiamond ǤeezeƦ, вы можете использовать ContractAbbreviatorAttribute для рефакторинга повторяющихся вызовов по контракту в отдельный метод. Атрибут не является частью .NET Framework 4.0, но вы можете определить его самостоятельно. Для получения дополнительной информации см. Сообщение в блоге Терье Сандстрома о сверке нулевых проверок контрактов кода с FXCop: http://geekswithblogs.net/terje/archive/2010/10/14.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...