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