Я собираюсь использовать новую функцию .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(...)
. Я полагаю, что разницу также следует рассматривать в контексте этого вопроса?