为什么要在项目中使用"断言"?(以及为什么使用它这么多次)



我正在阅读示例代码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));

我在想,这样做有什么意义?

谢谢

这是契约式设计(DbC)的实现。

Objective C没有对DbC的前置条件、后置条件和不变量的本机支持,但是后置条件和前置条件可以用宏很好地实现。

这里有一些在Objective C中实现DbC的其他方法:

  • http://www.roard.com/contracts/
  • http://lists.apple.com/archives/objc-language/2006/Sep/msg00000.html
  • D编程语言有DbC,这里是Michel Fortins在相同风格的DbC的尝试,但对于Objective C: http://michelf.com/weblog/2010/dobjc-preliminary-design/

断言的意义在于确保bug能够立即以易于诊断的方式显示出来,而不是在以后出现细微的错误行为。在这种情况下,该代码的开发人员希望在代码运行后保证4个条件保持不变。

断言检查程序员对如何调用代码的假设。如果假设错误,断言将失败并抛出异常。这会使代码尽早失败。

是否这样做是一个争论点。

相关内容

  • 没有找到相关文章

最新更新