Рефакторинг кода валидации параметров метода к контрактам - проблема обращения утверждений - PullRequest
2 голосов
/ 12 сентября 2011

Старый проверочный код обычно проверяет логическое условие и выдает исключение, если оно истинно.

Вместо этого Contract.Requires(...) делает обратное (чтобы пройти проверку, нам нужно отменить старое условие).

Я перефразирую старый код и иногда вижу некоторые довольно сложные логические выражения, инвертировать их не так просто, и просто делать Contract.Requires(!(*old statements*)) кажется плохим и очень запутанным.

Если в нем что-то естькак Contract.RequiresNot() рефакторинг будет гораздо более понятным и понятным.

Мы также не можем добавить метод статического расширения.Если кто-то сталкивался с этой проблемой и нашел какое-то хорошее решение, я хотел бы услышать это.

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Вы можете сохранить результат old statements в логической переменной с правильным именем.Это поможет избавиться от запутанных скобок, а также послужит для самостоятельного документирования вашего кода =)

1 голос
/ 12 сентября 2011

Вы можете попробовать оставить старые унаследованные проверки на месте и добавить вызов Contract.EndContractBlock сразу после проверки.Из MSDN:

Большая часть кода содержит проверку некоторых параметров в виде кода if-then-throw.Инструменты контракта распознают эти операторы как предварительные условия в следующих случаях:

Когда в этой форме появляются операторы if-then-throw, инструменты распознают их как устаревшие операторы require.Если никакие другие контракты не следуют последовательности if-then-throw, завершите код методом Contract.EndContractBlock .

if ( x == null ) throw new ...
Contract.EndContractBlock(); // All previous "if" checks are preconditions

Обратите внимание, что условие в предыдущем тесте является отрицательным предварительным условием,(Фактическим предварительным условием будет x! = Null.) Отрицательное предварительное условие строго ограничено: оно должно быть записано так, как показано в предыдущем примере;то есть он не должен содержать других предложений, а тело предложения then должно быть одним оператором throw.Тест if подчиняется правилам чистоты и видимости (см. Правила использования ), но выражение throw подчиняется только правилам чистоты.Однако тип создаваемого исключения должен быть таким же видимым, как и метод, в котором происходит контракт.

...