【问题标题】:Best way to return error when initing model object?初始化模型对象时返回错误的最佳方法?
【发布时间】:2012-06-04 00:49:01
【问题描述】:

我有一个代表三角形的模型对象。有一些 init 方法采用不同的已知参数组合。然后它求解剩余的值(边长和角度)。目前,如果给定参数为 nil 或超出此三角形类型的适当范围,我的初始化程序将返回 nil。然而,为了向用户提供适当的反馈,控制器对象还必须检查不正确的输入值,例如角度 > 90 度等。这对我来说很臭,因为这些规则应该在模型中定义一次。所以我的想法是有一个 NSError 对象被设置为控制器应该向用户显示的字符串。我只是不确定将其传达给控制器的最佳方式。如果发生错误,我的 init 方法是否应该返回此 NSError 而不是 Triangle 实例?这似乎是错误的。或者我是否将一个指向 NSError 对象的指针作为参数传递给 init,并在发生错误时填充它?如果我这样做,我是否仍然从三角形对象的 init 返回 nil,因为它不可用,还是我只是部分初始化三角形并返回它?

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    您应该遵循其他 Cocoa 对象使用的相同约定,如 Apple 的 Error Handling Programming Guide 中所述:

    • 添加一个参数,该参数采用NSError** 作为方法的最后一个参数。
    • 发生错误时,如果该参数不是NULL,则使用NSError 对象填充它并返回nil
    • 对于init 方法,您还应该在返回nil 之前先[self release](除非您使用的是ARC)。

    【讨论】:

      【解决方案2】:

      如果您想要详细的错误消息,则:

      1. 抛出异常。这正是他们的目的。

      2. 提供只验证输入的方法,如

      + (NSError *)errorFromValidationOfSide:(float)a size:(float)b;

      在创建对象之前调用它。这样您就可以在内部共享任何验证代码,而不会在对象之外复制它。

      您怀疑,让您的init 方法返回除正确类型的工作对象以外的任何内容是一个坏主意。在 init 上获取 NSError 指针是可以的,但对我来说似乎有点笨拙。

      【讨论】:

        猜你喜欢
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2014-02-22
        • 1970-01-01
        • 2018-03-09
        • 2011-11-24
        • 1970-01-01
        相关资源
        最近更新 更多