2012-07-16 31 views
0

我对懒惰实例化的最佳编码实践有疑问。可可懒惰实例化 - 最佳实践

我有一个自定义类(MainClass),它构成了我的视图控制器的模型。 MainClass的其中一个属性是另一个自定义类(SubClass)。 现在让我们说我想从我的视图控制器访问和设置一些SubClass的属性。 我应该在MainClass中实例化SubClass吗?

在MainClass中延迟实例化子类节省了我每次需要设置它的一个属性时检查SubClass是否存在(以及如果它不存在就创建它)的麻烦。

另一方面,虽然我失去了在我的视图中设置变量的能力,但只有存在SubClass时。让我更好地解释一下。假设我只想在SubClass.name存在的情况下设置我的文本字段的stringValue。每次我询问SubClass.name的存在时,MainClass都会懒惰地实例化SubClass,这是一种浪费。

什么是继续进行的最佳方式?

回答

0

如果这是造成这个问题的原因,或者您需要解释性能限制,您需要对美学做出决定。

是的,延迟初始化有优点和缺点。

优势

  • 你不支付对象,你从来不使用
  • 你不需要在对象上实际设置字段,你永远不会使用
  • 如果你需要它,你可以建立在最后一分钟的对象,这是通常优选在启动时构建它

缺点

  • (轻微)的复杂性 - 特别是如果你或同事不习惯成语
  • ,如果你忘记调用初始化()或等值的访问,你可以在某些语言变得棘手的错误,或者在崩溃其他

混合方法是可能的。对于重要任务,请使用延迟实例:

- (void) display { 
    [self initialize]; 
    [self display]; 
    } 

对于不重要的任务,只需检查初始化。

- (void) updateCaches { 
    if ([self isInitialized]) { 
     [self reloadCachedDataFrom: [self startDatabaseSession]]; 
    } 
} 

你不想建立自己的目的只是为了更新其高速缓存,但也许,如果对象是活的,你想继续前进并保持高速缓存温暖。所以,你看看你是否已经实例化了这个对象,并且只有在它已经被设置好的情况下才重新加载缓存。