Когда следует использовать assert()?
При разработке большого проекта программирования на С++ со многими разработчиками мы столкнулись с проблемами с ненадлежащим использованием assert() в коде, что приводит к низкому качеству, когда утверждение действительно происходит, и продукт выходит из строя.
Вопрос в том, какие хорошие принципы применимы для использования assert() соответственно? Когда правильно использовать assert(), а когда нет? Есть ли список критериев, которые должны пройти каждое утверждение, чтобы быть законными? Как мы можем поощрять правильное использование assert()?
В качестве первой трещины в этом я бы сказал, что assert() следует использовать только для документирования условия, которое, как считается, невозможно достичь, и которое должно быть идентифицировано как отказ assert() во время выполнения, когда оно когда-либо возникают из-за нарушения программных допущений.
Могут ли люди сделать это лучше? Каков ваш опыт работы с assert()?
Ответы
Ответ 1
Используйте Исключения для условия ошибки, которое исходит от снаружи (вне метода или вне программы), например, проверки параметров и отсутствующих/дефектных внешних ресурсов, таких как файлы или соединения или пользовательский ввод.
Используйте Утверждения, чтобы указать внутренние дефекты, такие как ошибки программирования, условия, которые не должны возникать, например. инварианты класса/метода и недопустимое состояние программы.
Ответ 2
Вы должны использовать assert для проверки всех условий, которые никогда не должны происходить:
- Предпосылки для входных параметров
- Результаты промежуточных вычислений
- Постусловия состояния объекта
Но вы должны включать эти утверждения только в отладочные сборки или при явной активации для выпуска (не в сборках, выпущенных для клиентов).
Ответ 3
Я использую утверждения для проверки состояния нежелательной программы:
- Предпосылки функции
- Иногда я вставляю их в макрос после каждого вызова API:
glDrawArray(); checkOpenGLError();
- checkOpenGLError() будет вызывать getGLError(), если включен
- целостность структуры данных: assert (something == null);
- Иногда мне нужен GDB (iOS SDK 3.2). Я использую утверждения, чтобы доказать это.
EDIT:
"нежелательное состояние программы" исключает ошибки, которые, естественно, происходят во время выполнения, например, неспособность открыть выбранный пользователем файл из-за разрешений или отказа HD. В этих случаях нецелесообразно использовать утверждения.
Ответ 4
В настоящее время много кода имеет множество внешних зависимостей и соединений. В наши дни я не привык к традиционным утверждениям, я предпочитаю исключения. Я не чувствую, что могу предположить, что "это никогда не произойдет", и проверки можно безопасно удалить в сборке без отладки.