Кодовые контракты и исключительная ситуация


Я пытаюсь понять преимущества Code Contracts. Я написал следующий код (из введения в PEX + Code Contract), чтобы копать его.

public static string TrimAfter(string value, string suffix)
        {
            // <pex>
            Contract.Requires(suffix != (string)null);
            Contract.Requires
                (value.IndexOf(suffix) >= 0 && value.Length >= value.IndexOf(suffix));
            Contract.Requires(value != (string)null);
            // </pex>

            int index = value.IndexOf(suffix);
            if (index < 0)
                return value;

            return value.Substring(0, index);
        }

Я вызвал этот метод с нулевыми аргументами, и он был скомпилирован. Так что мне не понятно, почему это лучше, чем бросать исключения. Ребята, не могли бы вы объяснить, есть ли у Code Contracts какие-либо дополнительные функции?:) Заранее спасибо.

4 ответа

Решение
  1. В зависимости от вашей версии VS(Premium или Ultimate, если я правильно помню), вы можете получить проверку во время компиляции.
    Проблема с этим состоит в том, чтобы сделать статическую проверку счастливой. И я не уверен, стоит ли это усилий для большинства программ. Но, возможно, ограниченное подмножество, такое как нулевые проверки, может работать хорошо.
  2. Из него можно автоматически генерировать документацию.
  3. Это более короткий код, что повышает вероятность его использования людьми.
    Главное для меня. Я ленив, и если написание чеков станет легче, я с большей вероятностью добавлю дополнительные чеки. В частности, я обнаружил, что аргумент старого стиля null проверяет немного многословно.
  4. Вы можете указать исключение, если хотите, так что вы получите то же внешнее поведение, что и со старыми проверками.

С другой стороны, не должно быть сложно проанализировать IL, распознающий старый стандартный шаблон для проверки предварительных условий, и использовать его для создания документации.

В дополнение к другим замечаниям, контракты могут применяться к интерфейсам (вы не могли бы сделать это с обычными исключениями) и принудительно наследоваться (что-то еще, что вам будет очень трудно делать с обычными исключениями).

Чтобы не дать ему скомпилироваться, вам нужна расширенная версия контрактов кода со статической проверкой: http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

Я собираюсь угадать, но из документов:

Надстройка Visual Studio позволяет указать уровень анализа кода, который будет выполняться. Анализаторы могут подтвердить, что контракты правильно сформированы (проверка типов и разрешение имен), и могут создать скомпилированную форму контрактов в формате промежуточного языка Microsoft (MSIL). Создание контрактов в Visual Studio позволяет вам воспользоваться преимуществами стандартного IntelliSense, предоставляемого инструментом.

Инструменты доступны здесь.

Другие вопросы по тегам