在运行某些方法之前检查条件时,我需要一些最好的实践建议。 让我们考虑以下实现:
@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;
也很难看。
那么你有什么最好的实践可以避免这种情况吗? (除了创建一个宏来代替代码行,这是非常相同的丑陋)
提前帮助你。
答案 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];
}
}