在 Objective-C 中维护代表不变量
Posted
技术标签:
【中文标题】在 Objective-C 中维护代表不变量【英文标题】:maintaining rep invariants in Objective-C 【发布时间】:2012-12-06 22:53:45 【问题描述】:我是 Objective-C 的新手,并试图找出维护类的 rep 不变量的最佳方法是什么,因为异常并不是真正执行它们的适当方式。一个很好的例子就是Fraction
类,它是 Kochan 的 Objective-C 编程 中的一个例子,它有这个 setter 方法:
-(void) setDenominator: (int) d
self.denominator = d;
所以说你的代表不变要求的一部分self.denominator != 0
。例如,在 Java 中,强制执行该不变量的最直接方法是在传递 0 时抛出 IllegalArgumentException
,但这在 Objective-C 中没有意义。另一种方法是添加一个NSError**
指针参数来报告问题,但这看起来既过分,又不适合抽象的性质——不像数据库连接,我们不期望在正常使用中出现零分母分数。那么这里最干净的解决方案是什么?返回一个整数错误代码?我还缺少什么?
【问题讨论】:
【参考方案1】:你可以使用NSAssert()
:
- (void)setDenominator:(int)d
NSAssert(d != 0, @"denominator cannot be 0");
self.denominator = d;
【讨论】:
【参考方案2】:查看this answer
在 Cocoa 和 ios 程序员中,异常用于表示 不可恢复的程序员错误。当抛出异常时 框架,它表示框架检测到错误 不可恢复且内部状态为 现在未定义。
在这种情况下,这显然是一个非法的不可恢复状态,会导致除以零,因此引发异常是完全合法的
具体来说,您可以按照其他人的建议提出NSInvalidArgumentException
。
如果您想深入了解该主题,请查看Error Handling Programming Guide
【讨论】:
【参考方案3】:我不明白为什么你认为例外在这里是不合适的。除非有任何额外的限制,否则我只会引发 NSInvalidArgumentException。
【讨论】:
【参考方案4】:您可以引发 NSInvalidArgumentException
异常和/或放置 NSAssert
,后者将导致程序退出调试模式,这很好,因此如果您滥用 api,您可以在开发中捕获它。
[[NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil] raise];
【讨论】:
以上是关于在 Objective-C 中维护代表不变量的主要内容,如果未能解决你的问题,请参考以下文章