2012-07-16 54 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]]; 
    } 
} 

你不想建立自己的目的只是爲了更新其高速緩存,但也許,如果對象是活的,你想繼續前進並保持高速緩存溫暖。所以,你看看你是否已經實例化了這個對象,並且只有在它已經被設置好的情況下才重新加載緩存。