Кодовые контракты и исключительная ситуация
Я пытаюсь понять преимущества 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 ответа
- В зависимости от вашей версии VS(Premium или Ultimate, если я правильно помню), вы можете получить проверку во время компиляции.
Проблема с этим состоит в том, чтобы сделать статическую проверку счастливой. И я не уверен, стоит ли это усилий для большинства программ. Но, возможно, ограниченное подмножество, такое как нулевые проверки, может работать хорошо. - Из него можно автоматически генерировать документацию.
- Это более короткий код, что повышает вероятность его использования людьми.
Главное для меня. Я ленив, и если написание чеков станет легче, я с большей вероятностью добавлю дополнительные чеки. В частности, я обнаружил, что аргумент старого стиля null проверяет немного многословно. - Вы можете указать исключение, если хотите, так что вы получите то же внешнее поведение, что и со старыми проверками.
С другой стороны, не должно быть сложно проанализировать IL, распознающий старый стандартный шаблон для проверки предварительных условий, и использовать его для создания документации.
В дополнение к другим замечаниям, контракты могут применяться к интерфейсам (вы не могли бы сделать это с обычными исключениями) и принудительно наследоваться (что-то еще, что вам будет очень трудно делать с обычными исключениями).
Чтобы не дать ему скомпилироваться, вам нужна расширенная версия контрактов кода со статической проверкой: http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
Я собираюсь угадать, но из документов:
Надстройка Visual Studio позволяет указать уровень анализа кода, который будет выполняться. Анализаторы могут подтвердить, что контракты правильно сформированы (проверка типов и разрешение имен), и могут создать скомпилированную форму контрактов в формате промежуточного языка Microsoft (MSIL). Создание контрактов в Visual Studio позволяет вам воспользоваться преимуществами стандартного IntelliSense, предоставляемого инструментом.
Инструменты доступны здесь.