我正在阅读示例代码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个条件保持不变。
断言检查程序员对如何调用代码的假设。如果假设错误,断言将失败并抛出异常。这会使代码尽早失败。
是否这样做是一个争论点。