iOS最佳实践 - 在运行方法之前检查一些条件

时间:2014-02-01 22:01:05

标签: ios conditional-statements

在运行某些方法之前检查条件时,我需要一些最好的实践建议。 让我们考虑以下实现:

@interface Foo : NSObject {
    NSObject *_anObject;
}

@end

@implementation Foo

- (id)aMethod
{
    if (!_anObject) return nil;

    // do something

    return obj;
}

- (id)aMethod2
{
    if (!_anObject) return nil;

    // do something

    return obj;
}

即使这个实现工作得很好,我发现这些冗余的检查代码if (!_anObject) return nil;也很难看。

那么你有什么最好的实践可以避免这种情况吗? (除了创建一个宏来代替代码行,这是非常相同的丑陋)

提前帮助你。

2 个答案:

答案 0 :(得分:1)

嗯,几点想法。我认为这很大程度上取决于你// do something的作用。

如果这只是一些方法,我认为你所做的是完全可读的。我同意一个宏只会在阅读代码时增加混乱。

要记住的另一件事是在Objective-C中你可以安全地调用nil对象的方法,所以也许没有必要进行检查?或者你可以尝试一个null object-ish模式。通常用于防止空指针引用,这在这里不是问题,但是如果_anObject在aMethod1和aMethod2中有意义的话,你可能会有一个空白对象返回正确的东西。

另一个想法,如果你真的在所有功能之前检查nil,也许你需要提升一个级别?听起来我有两节课。那么用NilObjectFoo子类化Foo,只为所有方法(或其他)返回nil?然后在创建Foo时,检查是否有_myObject,如果没有,则创建一个NilObjectFoo。然后使用该对象的其余代码并不关心,并且您不会使用一堆零检查将Foo对象弄乱。

也许一个更具体的例子会有所帮助?

答案 1 :(得分:0)

如果我正确地读了你(而且我可能没有),我会认为检查你属于其他地方。即G:

- (void)fooMethod{
    if (_anObject){
       // do whatever you need to do to the object, then:
       NSObject *foo = [self aMethod];
    }
}


- (id)aMethod{
    // prepare the object you want
    return obj;
}

这看起来更加坚固,因为你可能需要在其他地方使用aMethod的结果,即使_anObject是nil也会减少责任。如果你想要一个方法从不同的方法创建几个对象,所有这些都取决于_anObject的状态,你只需要一个外部if而不是你上面描述的模式:

- (void)fooMethod{
    if (_anObject){
       NSObject *foo = [self aMethod];
       NSObject *bar = [self anotherMethod];
    }
}