Контракты кода: мы должны указать Контракт. Требует (…) операторов избыточно в делегировании методов?

Я намереваюсь использовать новую.NET 4 функции Code Contracts будущей разработки. Это заставило меня задаться вопросом, должны ли мы указать эквивалентный Contract.Requires(...) операторы избыточно в цепочке методов.

Я думаю, что пример кода стоит тысячу слов:

    public bool CrushGodzilla(string weapon, int velocity)
    {
        Contract.Requires(weapon != null);

        // long code

        return false;
    }

    public bool CrushGodzilla(string weapon)
    {
        Contract.Requires(weapon != null);   // specify contract requirement here
                                             // as well???

        return this.CrushGodzilla(weapon, int.MaxValue);
    }

Для времени выполнения, проверяющего, это не имеет значения очень, поскольку мы будем в конечном счете всегда поражать проверку требования, и мы получим ошибку, если это перестанет работать.

Однако считается плохой практикой, когда мы не указываем требование контракта здесь во второй перегрузке снова?

Кроме того, будет функция времени компиляции, проверяя и возможно также времени проектирования, проверяя контрактов кода. Кажется, что это еще не доступно для C# в Visual Studio 2010, но я думаю, что существуют некоторые языки как Spec#, которые уже делают. Эти механизмы, вероятно, дадут нам подсказки, когда мы напишем код для вызова такого метода, и наш аргумент в настоящее время может или быть null.

Так интересно, будут ли эти механизмы всегда анализировать стек вызовов, пока они не найдут метод с контрактом, который в настоящее время не удовлетворяется?

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

9
задан Community 23 May 2017 в 12:06
поделиться

2 ответа

Я думаю, что было бы лучше указать все контракты для каждого из общедоступных методов. Контракт - это больше, чем просто «то, что проверяется», это еще и документация. Если вы вызываете метод, но не знаете, какой контракт применяется, было бы странно опустить ошибку контракта ниже: это указывало бы на ошибку в методе, который вы вызываете, а не в вашем ] метод.

Обратите внимание, что если вы используете C # 4 в своем проекте, вы можете рассмотреть возможность использования дополнительных параметров и именованных аргументов, чтобы избежать большого количества перегрузок. Конечно, это бесполезно, если вам нужно вызвать код с языка, который их не поддерживает.

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

14
ответ дан 4 December 2019 в 11:41
поделиться

Также будет функция проверки времени компиляции и, возможно, также проверка времени разработки кодовых контрактов. Кажется, он еще не доступен для C # в Visual Studio 2010 ...

Он доступен, но для его работы вы должны использовать версию VS2010 Ultimate .

Предупреждение : это немного спекулятивно, но, судя по тому, что я узнал с его помощью, кажется правильным;

Вам нужно распространить ограничения с помощью ваших методов вручную, как вы это делали.

Единственная информация, которую Code Contracts может видеть извне метода, - это то, что вы ей сообщаете. Он может проверять предположения и утверждения внутри метода, но этот анализ не распространяется.Другими словами, CC не может «видеть насквозь» ваши методы, поэтому он автоматически не знает, что CrushGodzilla (string) потребует, чтобы weapon не было нулевым.

При использовании статического анализа он выполнит проверки в CrushGodzilla (строка) и поймет, что оружие не может быть нулевым, используя внешнюю информацию о ] CrushGodzilla (string, int) , и он предложит вам добавить ненулевое предварительное условие Требует . (Невозможность распространения - это тот факт, что эти знания не будут использоваться для анализа остальной части программы.)

На самом деле я нигде не нашел, что документирует этот статический анализатор очень хорошо, несмотря на то, что я посмотрел.

4
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: