Что делает метод Assert ()? Это все еще полезно?

StackOverflow https://stackoverflow.com/questions/163538

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

В отладочной компиляции Assert принимает логическое условие в качестве параметра и показывает диалог ошибки, если условие ложно. Программа выполняется без прерывания, если условие выполняется.

Если вы компилируете в Release, все Debug.Assert автоматически пропускаются.

Другие советы

От Code Complete

  

8 защитного программирования

     

8.2 Утверждения

     

Утверждение - это код, который используется во время разработки - обычно подпрограмма   или макрос & # 8212 ;, который позволяет программе проверять себя во время работы. Когда   утверждение верно, это означает, что все работает, как ожидалось.   Если значение равно false, это означает, что обнаружена непредвиденная ошибка в   код. Например, если система предполагает, что информация о клиенте   файл никогда не будет иметь более 50 000 записей, программа может   содержат утверждение, что количество записей меньше или равно   до 50000. Пока количество записей меньше или равно   50000, утверждение будет молчать. Если он встречает больше, чем   50000 записей, однако, он будет громко утверждать & # 8221; что есть   ошибка в программе.      

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

Утверждение обычно принимает два аргумента: логическое выражение, которое   описывает предположение, что это должно быть правдой, и сообщение   показывать, если это не так.      

(& # 8230;)

     

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

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

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Assert также дает вам еще одну возможность посмеяться над навыками проектирования пользовательского интерфейса Microsoft. Я имею в виду: диалог с тремя кнопками Abort, Retry, Ignore и объяснение того, как их интерпретировать в строке заголовка!

Assert позволяет вам утверждать, что условие (post или pre) применяется в вашем коде. Это способ документировать ваши намерения, и отладчик информирует вас в диалоговом окне, если ваше намерение не достигнуто.

В отличие от точки останова, Assert идет вместе с вашим кодом и может использоваться для добавления дополнительной информации о вашем намерении.

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

Debug.Assert (x > 2)

вызовет перерыв, только если вы запускаете " отладку " сборка, а не сборка релиза. Вот полный пример такого поведения здесь

Прежде всего, метод Assert () доступен для классов Trace и Debug .
Debug.Assert () выполняется только в режиме отладки.
Trace.Assert () выполняется в режиме отладки и выпуска.

Вот пример:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Запустите этот код в режиме отладки, а затем в режиме выпуска.

 введите описание изображения здесь

Вы заметите, что в режиме отладки ваш оператор code Debug.Assert завершается ошибкой, вы получаете сообщение, показывающее текущую трассировку стека приложения. Этого не происходит в режиме Release, поскольку условие Trace.Assert () истинно (i == 4) .

Метод

WriteLine () просто позволяет записать информацию в вывод Visual Studio. введите описание изображения здесь

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

Это не позволяет кому-либо использовать ваш код безрассудно. Но это также позволяет этому головокружительному пути перейти к производству и не давать неприятного сообщения клиенту (при условии, что вы собираете сборку Release).

Утверждения широко используются в Проектировании по контракту (DbC), который, как я понимаю, был представлен / одобрен Мейером, Бертандом. 1997. Создание объектно-ориентированного программного обеспечения.

Важной особенностью является то, что они не должны вызывать побочных эффектов, например, вы можете обработать исключение или предпринять иные действия с помощью оператора if (защитное программирование).

Утверждения используются для проверки предварительных / заключительных условий контракта, отношений клиент / поставщик - клиент должен убедиться, что предварительные условия поставщика выполнены, например. отправляет & # 163; 5, и поставщик должен убедиться, что пост-условия выполнены, например. доставляет 12 роз. (Просто простое объяснение клиента / поставщика - можете принять меньше и поставить больше, но об утверждениях). C # также вводит Trace.Assert (), который может использоваться для кода выпуска.

Чтобы ответить на вопрос, да, они все еще полезны, но могут добавить сложность + читабельность к коду и время + трудно поддерживать. Должны ли мы все еще использовать их? Да, Мы все будем их использовать? Вероятно, нет, или не так, как описывает Мейер.

(Даже курс OU Java, на котором я изучал эту технику, показывал только простые примеры, а остальная часть кода не применяла правила утверждения DbC для большей части кода, но предполагалось, что она используется для обеспечения правильности программы!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top