在 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 中维护代表不变量的主要内容,如果未能解决你的问题,请参考以下文章

软件构造第三章

对Objective-C中的委托有点困惑

Objective-C中的面向对象编程

在 Objective-c 中使用 swift 类

objective-c数组

Objective-C NSError 和 Java 错误