Зачем использовать "assert" в проекте? (и зачем использовать его так много раз)

Я читал пример кода ListAdder, и сразу после переменной есть много утверждений, или они использовались почти в каждом методе, например:

self.formatter = [[[NSNumberFormatter alloc] init] autorelease]; assert(self.formatter != nil);

или же:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   #pragma unused(tv)
   #pragma unused(indexPath)
   UITableViewCell *    cell;

   assert(tv == self.tableView);
   assert(indexPath != NULL);
   assert(indexPath.section < kListAdderSectionIndexCount);
   assert(indexPath.row < ((indexPath.section == kListAdderSectionIndexNumbers) ? [self.numbers count] : 1));

Мне было интересно, какой смысл это делать?

Спасибо

3 ответа

Решение

Это реализация Проекта по контракту, или DbC.

Цель C не имеет встроенной поддержки предварительных условий, постусловий и инвариантов DbC, но особенно пост- и предусловия могут быть реализованы довольно хорошо с помощью макросов.

Вот некоторые другие подходы для реализации DbC в Цели C:

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

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

Делать это или нет - предмет спора. Это может быть слишком далеко.

Другие вопросы по тегам