2014-11-19 2 views
3

Я использую Code Contracts в C#, но мне немного любопытно, что я должен вводить для параметра userMessage. Приведу небольшой пример.C# Code Contracts userMessage Параметр

У меня есть следующее утверждение в моем коде:

Contract.Assert(IsValidReferenceData(refData)); 

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

Первоначально я думал

Contract.Assert(IsValidReferenceData(refData), "Payment Reference is not valid"); 

Но потом я подумал, что userMessage является полной противоположностью к булеву состоянию, поэтому я переписал его как:

Contract.Assert(IsValidReferenceData(refData), "Payment Reference is valid"); 

Поэтому сообщение и условия являются одна и та же. Однако это может смутить людей, когда они видят отчет об исключениях, а затем подумают: «Держитесь, если ссылка действительна, то почему было выбрано исключение?».

Наконец, я мог бы подумал, почему бы не сделать нейтральное заявление, в котором говорится, что должно быть правдой:

Contract.Assert(IsValidReferenceData(refData), "Payment Reference must be valid"); 

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

ответ

2

Стоит отметить, что, хотя нет никаких руководящих принципов для пользовательских сообщений на отсутствие коды контрактов, существует xUnit test pattern называется Expectation Описывая сообщение, который соответствует вашему последнему примеру.Отвечая на вопрос о том, что должно было произошло в сообщении об утверждении, вы выполняете обе свои цели: читаемость кода + предоставление полезного, самоочевидного отладочного сообщения.

3

Кодовые контракты (утверждения, пред и послесловия и инварианты) предназначены для обнаружения внеполосных условий работы, для которых ваш код не предназначен для обработки. Они не должны использоваться в качестве первой точки проверки, и в результате Contracts не должен касаться контекстуализированных пользовательских сообщений. Валидация восходящего потока в уровнях представления/обслуживания должна была идентифицировать любой недопустимый вход пользователя или клиента клиента.

Учитывая, что сообщение будет отображаться только в случае отказа контракта, что теоретически не должно происходить в производственном коде, это означает, что целевая аудитория пользователя будет YOU или другим разработчиком, поэтому сообщение должно чтобы помочь вам в быстрой отладке (если вам нужно сообщение вообще - трассировка стека и номер строки, как правило, достаточно, ИМО). Возможно, имя параметра userMessage, возможно, является неудачным выбором.

4

Таким образом, имея код .Net я решил посмотреть, что они используют в качестве параметра, это результат:

"hashcode >= 0" 
"Race condition detected in usages of Hashtable - multiple threads appear to be writing to a Hashtable instance simultaneously! Don't do that - use Hashtable.Synchronized." 
"Invalid MaxPrimeArrayLength" 
"Missing case in GetRandomizedEqualityComparer!" 
"We increment our current index by 8, so our buffer size must be a multiple of 8" 
"key shouldn't be null!" 
"Size is not zero" 
"Didn't set Console::_out or _error appropriately!" 
"Setting the foreground color before we've read the default foreground color!" 

Гораздо больше здесь: http://pastebin.com/zPgU1ALe

основном ответить: написать все, что вы хотите , это сообщение предназначено для быстрого отладки, а не для ваших пользователей api.

Смежные вопросы