На comp.lang.c ++. Обсуждается вопрос о том, следует ли сохранять в рабочем коде утверждения, которые по умолчанию в C ++ существуют только в отладочных сборках.
Очевидно, что каждый проект уникален, поэтому мой вопрос здесь не столько ли следует хранить утверждения, а в каких случаях это рекомендуется / не является хорошей идеей.
Под утверждением я имею в виду:
- Проверка во время выполнения, которая проверяет условие, которое, если оно ложно, выявляет ошибку в программном обеспечении.
- Механизм, с помощью которого программа останавливается (возможно, после действительно минимальной работы по очистке).
Я не обязательно говорю о C или C ++.
Мое собственное мнение таково: если вы программист, но не владеете данными (что имеет место в большинстве коммерческих настольных приложений), вы должны оставить их включенными, потому что ошибочное утверждение показывает ошибку, и вы не должны идти с ошибкой, с риском повреждения данных пользователя. Это вынуждает вас тщательно тестировать перед отправкой и делает ошибки более заметными, что облегчает их обнаружение и исправление.
Каково ваше мнение / опыт?
Ура,
деревенщина
Смотрите связанный вопрос здесь
Отзывы и обновления
Привет, Грэм,
Утверждение является ошибкой, чистым и простым и поэтому должно обрабатываться как единое целое. Так как ошибка должна быть обработана в режиме релиза, тогда вам не нужны утверждения.
Вот почему я предпочитаю слово «ошибка», когда говорю об утверждениях. Это делает вещи намного понятнее. Для меня слово «ошибка» слишком расплывчато. Отсутствующий файл - это ошибка, а не ошибка, и программа должна с ней справиться. Попытка разыменования нулевого указателя является ошибкой, и программа должна признать, что что-то пахнет плохим сыром.
Следовательно, вы должны проверить указатель с утверждением, но наличие файла с нормальным кодом обработки ошибок.
Немного не по теме, но важный момент в обсуждении.
В качестве предупреждения, если ваши утверждения ломаются в отладчике, когда они терпят неудачу, почему бы и нет. Но существует множество причин, по которым файл не может существовать, которые полностью находятся вне контроля вашего кода: права на чтение / запись, заполнение диска, отключение USB-устройства и т. Д. Поскольку вы не можете контролировать его, я считаю, что утверждения не правильный способ справиться с этим.
деревенщина
Томас,
Да, у меня есть Code Complete, и я должен сказать, что я категорически не согласен с этим конкретным советом.
Скажем, ваш пользовательский распределитель памяти испортил и обнулил кусок памяти, который все еще используется другим объектом. Я получаю нулевой указатель, который регулярно разыменовывается в этом объекте, и один из инвариантов в том, что этот указатель никогда не равен нулю, и у вас есть пара утверждений, чтобы убедиться, что он остается таким. Что вы делаете, если указатель внезапно становится нулевым. Вы просто если () вокруг этого, надеясь, что это работает?
Помните, что мы говорим здесь о коде продукта, так что нет никакого взлома отладчика и проверки локального состояния. Это настоящая ошибка на компьютере пользователя.
деревенщина