2010-03-08 135 views
1

我正在使用幫助類的Web應用程序工作。這些類保存了各種操作的功能,例如表單處理。Singleton類和使用繼承

有時我需要這些類在我的應用程序中的多個位置,現在我做的方式是創建一個新的對象。我無法傳遞變量,這將是太多的工作。

我想知道爲此使用單例類。這樣我確信一次只能運行一個實例。

但是我的問題是,當我使用這種模式時,我應該爲所有對象創建一個單例類,這會導致很多代碼複製。

我可以改爲創建一個superHelper的超類,它是一個單例類,然後讓每個助手擴展它。

這種設置工作,還是有另一種選擇?

如果有效,有人對如何編寫superHelper類有任何建議。

謝謝你們

+0

你的助手類是否保持任何狀態,或者他們的方法是靜態的嗎? – 2010-03-08 13:37:57

+0

一些持有聲明,有些可以用作靜態,我不認爲這個評論幫助了很多 – 2010-03-10 14:18:44

回答

0

我無法通過變量,這將是太多的工作。

你確定嗎?人們傾向於高估傳遞依賴的努力。如果你在構造函數中這樣做,通常很簡單。

這就是說,你可以把共享功能放在全局範圍內,以不同的方式在php中。最簡單的是使用全局函數。例如。一個不屬於任何類的函數。另一種選擇是使用靜態類方法。這兩個非常相似;除了它們的語法外,它們基本上具有相同的屬性。稍微寬鬆的耦合解決方案是將函數作爲方法放在(抽象)基類上,即具體的類繼承自。這共享所有子類之間的功能。

上述解決方案的共同之處在於它們具有編譯時耦合。您不能在運行時更改依賴項,這會使您的應用程序變得非常嚴格。他們的主要好處是他們攜帶的複雜程度低。

如果你想要一個寬鬆的耦合應用程序,你可以嘗試用一個變量來替換硬依賴關係,以提供一個間接級別。簡單的做法是創建一個對象,並在整個應用程序中進行全局共享。有許多方法可以在PHP中執行此操作,例如單例或全局範圍內的變量(您可以使用global關鍵字或$GLOBALS陣列訪問此方法)。

雖然全局變量提供了一個間接的級別,但它們也傾向於引入很多複雜性,因爲它們使得很難弄清楚應用程序中依賴於對方的部分。出於這個原因,他們經常被有經驗的程序員避免。如果變量具有狀態,則尤其如此;如果共享對象是無狀態的,則問題不太普遍。

避免全局變量風險的唯一方法是使用局部變量。例如。傳遞依賴關係。這可能有點麻煩,但以我的經驗來看,它通常並不像問題那樣嚴重。至少,好處通常超過問題。也就是說,有一些技巧可以使疼痛輕鬆起來;值得注意的是依賴注入容器,這是自動工廠,負責照顧所有的線路。他們雖然有自己的複雜程度,但對於大型應用程序來說,它們肯定是一個很好的解決方案。

+0

謝謝你的迴應,我明白每一點的優點和缺點。我將嘗試僅在本地變量中傳遞助手。 – 2010-03-10 14:22:17

-1

雖然有時是必要的,單身是邪惡的(因爲它們是全局狀態)。儘量避免它們,如果你能幫助它。

編輯:如果你不能避免單身人士,至少參數化該狀態的引用。換句話說,在一個類中,將單例傳遞給它的構造函數或那些使用單例的方法。

簡單地將您的代碼庫引用到您的單例中會危及您單獨測試類的能力。

如果您的單身人士有狀態,您的測試將突然變爲有狀態,並且您的測試可能開始「級聯失敗」,因爲他們的先決條件由於先前的測試失敗而被破壞。

+0

解釋downvote的評論將不勝感激。 – 2010-03-08 14:19:05

+0

我沒有downvote。我認爲所有的迴應都很好,因爲我不確定首先使用單身模特。 – 2010-03-10 14:17:52

0

不能擴展一個單獨的類。請記住,在單例類中,構造函數是私有的,所以如果構造函數是私有的,那麼如何擴展這個類呢?我們都知道我們創建了一個我們稱之爲構造函數的類的對象,而在子類構造函數中,它隱式地稱爲父構造函數。所以在這種情況下,私人構造函數不能在子類中調用。