Debug.Assert-s использует то же сообщение об ошибке.Должен ли я повысить его до статической переменной? - PullRequest
1 голос
/ 12 июня 2010

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

Debug.Assert(kosherBaconList.SelectedIndex != -1, "An error message along the lines - you should not ever be able to click on edit button without selecting a kosher bacon first.");

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

private static readonly mustSelectKosherBaconBeforeEditAssertMessage = 
    "An error message along the lines - you should not ever be able to " +
    "click on edit button without selecting a something first.";
...
Debug.Assert(
    kosherBaconList.SelectedIndex != -1, 
    mustSelectKosherBaconBeforeEditAssertMessage)

или

if (kosherBaconList.SelectedIndex == -1)
{
    AssertMustSelectKosherBaconBeforeEdit();
}
...
[Conditional("DEBUG")]
private void AssertMustSelectKosherBaconBeforeEdit()
{
    // Compiler will optimize away this variable.
    string errorMessage = 
        "An error message along the lines - you should not ever be able to " +
        "click on edit button without selecting a something first.";

    Debug.Assert(false, errorMessage);
}

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

Ответы [ 3 ]

3 голосов
/ 12 июня 2010

Используйте первую (повторяющуюся) форму.

Причины этого:

  • Это меньше работы. Утверждения предназначены только для отладки, поэтому повторение не добавляет неэффективности в сборку выпуска. Не тратьте время на попытки сделать код «красивым» или «элегантным», когда он уже отлично читается и функционален.

  • Я бы сказал, что на самом деле он короче, более читабелен и легче поддерживается, чем ваши альтернативы.

  • Когда вы нажимаете Assert в своем отладчике, очень полезно иметь полное сообщение в коде, чтобы вы могли видеть, что означает assert. Многие программисты используют Assert (kosherBaconList.SelectedIndex! = -1); без всякого объяснения, что хорошо, если вы написали код, но когда вы нажимаете чей-то Assert, вы не представляете, что это означает . то есть я знаю, что назвал ваш метод "неправильным", но какого черта я должен исправить, чтобы назвать его "правильным"? Следовательно, сообщение assert должно указывать, в чем заключается проблема, и что нужно сделать человеку, который смотрит на вызов Assert (), чтобы исправить ее. И вы хотите, чтобы это было прямо перед вами, когда ваш отладчик останавливается в середине вашего теста.

  • Иногда вы обнаружите, что полезно добавить дополнительную информацию, относящуюся к контексту, в котором запускается assert, поэтому вам не нужно фактически отлаживать код, чтобы определить, какой из ваших 3 «идентичных» утверждений не удалось. По этой причине я часто использую текст подтверждения как «BaconManager.Cook: Вы должны выбрать ...» и «BaconManager.Wrap: Вы должны выбрать ...».

  • Если вы включите текст в вызов Assert, он не будет скомпилирован в вашу сборку выпуска. Но как только вы сделаете это статической переменной, вы включите (неиспользуемую) строку в сборку релиза, забив ее ненужным отладочным мусором.

Подпрограмма может быть использована, если вы хотите проверить более одного условия для проверки действительности вашего объекта, т.е.

[Conditional("DEBUG")] 
private void AssertValidity() 
{ 
    Debug.Assert(kosherBaconList.SelectedIndex != -1, "Nothing selected in kosher bacon list"); 
    Debug.Assert(kosherBaconList.COunt > 0, "kosher bacon list is empty!"); 
} 
1 голос
/ 12 июня 2010

Проще говоря, я бы пошел на static mustSelectKosherBaconBeforeEditAssertMessage = " ".И, возможно, даже для встроенных строк, если было несколько небольших отличий.

Ваш AssertMustSelectKosherBaconBeforeEdit() выглядит слишком похоже на преждевременную / микрооптимизацию.

0 голосов
/ 12 июня 2010

Еще одно предложение: вместо статической переменной сделайте это:

private const string mustSelectKosherBaconBeforeEditAssertMessage = 
    "An error message along the lines - you should not ever be able to " +
    "click on edit button without selecting a something first.";

Больше о const против статического только для чтения: http://blogs.msdn.com/b/csharpfaq/archive/2004/12/03/274791.aspx

Разница в том, что значениестатическое поле только для чтения устанавливается во время выполнения и, таким образом, может быть изменено содержащим классом, в то время как значение поля const установлено на постоянную времени компиляции.

Также здесь: http://msdn.microsoft.com/en-us/magazine/cc300489.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...