5

私はObjective-Cを初めて使用し、例外が実際にはそれらを強制する適切な方法ではないことを考えると、クラスのrep不変条件を維持するための最良の方法を理解しようとしています。これが発生する良い例は、次のセッターメソッドを持つKochanのObjective-CでのプログラミングFractionの例として機能するクラスです。

-(void) setDenominator: (int) d {
    self.denominator = d;
}

したがって、担当者の不変の要求の一部を言いますself.denominator != 0。たとえば、Javaでは、その不変条件を強制する最も簡単な方法はIllegalArgumentException、0が渡された場合にifをスローすることですが、Objective-Cではそれは意味がありません。別の方法は、問題を報告するためにポインタ引数を追加するNSError**ことですが、それはやり過ぎであり、抽象化の性質に適していないようです-たとえば、データベース接続とは異なり、ゼロは期待していません通常の使用で発生する分母の割合。では、ここで最もクリーンなソリューションは何ですか?整数のエラーコードを返しますか?私が見逃している他の何か?

4

4 に答える 4

2

この答えをチェックしてください

CocoaおよびiOSプログラマーでは、回復不能なプログラマーエラーを示すために例外が使用されます。フレームワークによって例外がスローされた場合、フレームワークが、回復不可能であり、内部状態が現在定義されていないエラー状態を検出したことを示します。

このような場合、ゼロ除算につながるのは明らかに違法な回復不能な状態であるため、例外を発生させることは完全に合法です。

NSInvalidArgumentException具体的には、他の人が提案しているように、を上げることができます。

トピックをさらに深く掘り下げたい場合は、エラー処理プログラミングガイドを確認してください。

于 2012-12-06T23:16:59.110 に答える
2

使用できますNSAssert()

- (void)setDenominator:(int)d
{
    NSAssert(d != 0, @"denominator cannot be 0");
    self.denominator = d;
}
于 2012-12-06T23:02:48.040 に答える
1

ここで例外が不適切だと思う理由がわかりません。追加の制約がなければ、NSInvalidArgumentException を発生させるだけです。

于 2012-12-06T23:05:57.770 に答える
1

NSInvalidArgumentException例外を発生させNSAssertたり、.

[[NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil] raise];

于 2012-12-06T23:06:13.233 に答える