2010-01-01 34 views
2

因此,我的客戶iphone應用程序在過去的幾個星期裏從5個左右的班級放到了25個以上。有了這麼大的(對於iphone來說)類結構,我一直在使用Singleton類訪問全局變量。問題是,無論何時我需要訪問我正在處理的類之外的變量,我都可以選擇修改代碼以將引用傳遞給變量,或者將其引入單例中。當然,將它扔到單身人士中的代碼和努力要少很多,但是現在單身人士似乎開始看起來像不相干的全局變量。Objective-C:什麼時候知道你在濫用全局變量的SIngleton方法

我的問題是維護一個大型單例對象與不相關的全局變量是多合適的,通常是在「非平凡的」iphone應用程序中通過類共享數據的「最佳實踐」方式?

非常感謝您的建議!

回答

6

我已經在解耦設計的背景下完成了這個問題的detailed analysis。我試着總結一下我的觀點:

  1. 如果你的Singleton帶有重要的全局狀態,不要使用Singleton。這包括持久性存儲,如數據庫,文件等。
  2. 在類名不依賴於單例對象的情況下,應該注入依賴關係。將Singleton實例注入類中的需求證明了該模式的錯誤用法(請參見第1點)。
  3. 假設Singleton的生命週期與應用程序的生命週期相同。大多數Singleton實現都使用延遲加載機制來實例化自己。這是微不足道的,它們的生命週期不太可能改變,否則你不應該使用Singleton。
+0

太棒了!謝謝! – ennuikiller 2010-01-01 19:44:25

-1

Apple/NeXT定義了許多單身人士,每個單身人士都有自己的關注點,並且通常被稱爲某件事的「經理」。在某些情況下,比如NSWorkspace,他們似乎無法爲自己找出答案。

1

您可能會考慮的一件事就是將這些值放入應用程序委託所擁有的字典中。你存儲什麼樣的東西?

2

一般來說,你不應該在項目中需要很多單例或全局變量。儘管如此,你沒有提供關於你實際在做什麼的很多信息。他們是一種氣味,他們不被禁止。

您可能想要查看其他方法。例如。實現這些類共享的協議,以根據需要傳輸特定位數據(然後每個人都可以獲得自己的副本),或使用綁定/ KVO保持這些類之間的值同步。

如果你在課堂上得到一個混雜的混搭,現在是時候把這個課堂分成幾個類。如果你得到很多隻有一到兩個班級使用的小型IVAR班級,最好把它合併回其中一個班級,或者把這三個班級的所有功能分開,並將它們分開。

還請記住,你不需要有一個單身人士。一個類已經是一個(元)對象,其中一個實例已經存在,所以你可以只使用一個沒有實例的類方法。在一個類上使用Singleton實例的主要動機是你可以用一個子類的實例替換一個單例,而不需要爲超類必須知道的代碼編寫代碼(例如,對於不同的文件系統或平臺,NeXT可能有不同的NSWorkspace子類)。

相關問題