Должен ли я использовать класс Debug в .net?

Я много читал о классе отладки в последнее время.

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

Мне также интересно, как те из вас, кто действительно использует класс Debug, делают это. Вы вообще пишете операторы Debug.Assert или согласен с Эдом Каймом, что вам следует использовать только Debug.WriteLine и Debug.Fail.


person Matthew Vines    schedule 09.07.2009    source источник
comment
Ссылка Эда Кайма, похоже, мертва - у Wayback Machine есть резервная копия, для всех, кто интересуется: http://web.archive.org/web/20090106003614/http://www.sharplogic.com/blogs/ed/PermaLink,guid,976a0613-da9b-433e-b909-07d37ce407b2.aspx   -  person johnny    schedule 11.10.2011


Ответы (8)


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

При этом я все еще использую некоторые операторы отладочной печати для улучшения моей отладки (через Debug.WriteLine), особенно в числовом коде ... Я признаю, что это возврат к старой отладке printf, но часто это все еще самый быстрый способ отследить проблему, особенно ту, которая не отображается в отладчике (из-за проблем с синхронизацией, потоковой передачи и т. д.).

person Reed Copsey    schedule 09.07.2009
comment
Вы все еще удаляете их, когда выясняете проблему? Я использую их так же, как операторы printf. Записываю их, выясняю, что делаю не так. Напишите для него модульный тест и удалите операторы Debug. - person Matthew Vines; 09.07.2009
comment
Я часто так делаю, но не всегда. У меня много случаев, когда мне нужны распечатки во время разработки, всегда, но не во время выпуска / доставки. - person Reed Copsey; 09.07.2009

Лично я вообще редко использую класс Debug для каких-либо программ. Я прочитал много комментариев и предложений, например, от Джона Роббинса (автора Отладка приложений .NET 2.0 и Bugslayer столбцы) о том, почему вы должны утверждать проактивно, особенно параметры для методов.

Проблема в том, что я должен был написать такой код:

Public Sub Test(source As Object)

  Debug.Assert(source IsNot Nothing, "source is Nothing")

  ' Do something....
End Sub

Это хорошо работает во время разработки с отладочными сборками, но я все равно делаю это:

Public Sub Test(source As Object)

  If source IsNot Nothing Then

  ' Do something....

  End If
End Sub

Если есть шанс, что «источник» будет ничем, я все равно сделаю проверку «Если». Я не собираюсь оставлять вызов assert в сборке релиза.

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

Что касается ведения журнала отладки, то я просто использую вызовы Trace и SysInternals DebugView или текстовые файлы для регистрации вывода вызовов трассировки.

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

person Jason Evans    schedule 09.07.2009
comment
Точно. Я видел слишком много случаев, когда Debug.Assert использовался для перехвата ошибок, но разработчики пропустили граничные условия, а затем неправильно обработали данные в коде выпуска. - person Paul Sonier; 09.07.2009

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

Преимущества Debug.Assert по сравнению с написанием отдельного метода тестирования - это компактность и тот факт, что проверка находится именно в том месте, где она должна быть, а не отдельным методом.

person Richie Cotton    schedule 09.07.2009
comment
хотя приличный обработчик исключений должен использоваться рука об руку с debug.assert imo. Я использую его как способ показать, какие тесты должен пройти метод, чтобы быть действительным. - person John Nicholas; 09.07.2009
comment
@MrTortoise: Согласен. Операторы отладки не должны заменять использование обработчика исключений, а просто служить дополнительным инструментом. - person Richie Cotton; 09.07.2009

Мое собственное мнение таково, что Debug.Assert и Debug.Fail часто используются неправильно, чтобы «скрыть» ошибки от конечных пользователей. Я лучше напишу в журнал ошибок или выдаю исключение, если это будет оправдано.

person Greg    schedule 09.07.2009
comment
Совершенно мое мнение. Я видел (недавно), что этот материал использовался таким образом, чтобы точно скрывать ошибки от разработчиков, что было очень весело, когда мы подошли к производству. - person Paul Sonier; 09.07.2009

Я не могу сказать вам, стоит ли вам это делать, но я могу предложить время, когда я его использую.

Я использую Debug, когда мне нужна дополнительная информация о функции / переменной / процессе / результате, но я знаю, что после его выпуска эта информация больше не актуальна. Я использую Debug.Writeline, например, для проверки правильности хронологии процесса, или Debug.Assert, чтобы убедиться, что значение соответствует тому, каким оно должно быть.

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

person Rob Elliott    schedule 09.07.2009

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

Как бы то ни было, я считаю, что log4net невероятно полезен и надежен для ведения журналов. Я бы порекомендовал использовать его вместо использования класса Debug в любое время.

person Paul Sonier    schedule 09.07.2009

Мы очень часто используем Debug.Assert - для каждого важного предположения, которое вы сделаете, наличие Assert не повредит.

Довольно полезная, но старая статья - здесь

person Madeleine    schedule 09.07.2009

Тест Debug.Assert для контракта. Небольшое преимущество в том, что его нет в коде выпуска. Это не относится к случаю исключения if +.

Я использую Debug.WriteLine для событий пользовательского интерфейса, потому что отладчик мешает (например, события обновления вызываются снова при переключении из окна VS в окно приложения).

person pero    schedule 09.07.2009