Зачем использовать "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:
- http://www.roard.com/contracts/
- http://lists.apple.com/archives/objc-language/2006/Sep/msg00000.html
- Язык программирования D имеет DbC, и вот попытка Мишеля Фортинса использовать тот же стиль DbC, но для цели C: http://michelf.com/weblog/2010/dobjc-preliminary-design/
Суть утверждений заключается в том, чтобы убедиться, что ошибки обнаруживаются немедленно и легко диагностируемыми способами, а не в виде легкого неправильного поведения в дальнейшем. В этом случае разработчик этого кода хочет гарантировать выполнение 4 условий после выполнения кода.
Утверждения проверяют предположения программиста о том, как будет вызываться код. Если допущения неверны, утверждение не выполнится и возникнет исключение. Это делает код неудачным как можно раньше.
Делать это или нет - предмет спора. Это может быть слишком далеко.