2014-02-05 78 views
4

有很多靜態函數是不好的做法嗎?我使用Yii框架,並且我意識到我的模型類中有很多靜態函數。我把我所有與用戶有關的功能放到UsersModel中(我也對其他模型也做了同樣的處理),但是我最終得到了很多靜態函數。只是想知道你們如何處理這個問題。很多這些函數只是查詢生成器函數而不是延遲加載,因爲我需要提高數據庫性能。Yii和靜態函數

功能。例如:

User::getUserFromCampaign(1) 
User::getUsersNotInCamapaigns() 
User::isAdmin() 
+0

也許這個問題應該去programmers.stackexchange –

+0

靜態函數使得很難測試:http://googletesting.blogspot.com/2008/12/static-methods-are-死亡對testability.html。 – bblincoe

+2

'靜態'方法是一個痛苦的測試,維護,交換和沒有適當的面向對象的地方。所以是的,我會說這是非常糟糕的做法。 – PeeHaa

回答

1

實例化您的類是最好的測試,但沒有使用靜態某些任務沒有問題。

很多都是意見,如果你的代碼工作,它的運行效率和易於維護,那麼所有的花花公子!

此外還添加到Laravel門面評論。 Laravel確實實例化了這個類,一個外觀只是爲更大的圖片提供了一個簡化的界面,讓我們說..這正是laravel正在做的。最終結果是非常好的可讀代碼。

+0

它是超級可讀的......並且非常強大的單元可測試(http://laravel.com/docs/testing)。 – Leng

0

MVC是一個很好的設計模式,它有它的位置。工廠設計模式是另一個不錯的模式。如果您不熟悉Google,請致電Factory design pattern。簡而言之:FooFactory是一個生成Foo類對象的類(或者FooModel類,如果您願意的話)。

MVC和Factory並不相互排斥,所以您可以將很多這些靜態方法重構爲新的UserFactoryClass。

  • User::getUserFromCampaign(1)對我來說,雖然有點奇怪。我認爲1是一個廣告系列ID?那麼它返回的用戶是什麼?或者一個廣告系列只能有一個用戶?如果是這種情況,那麼UserFactory::getUserFromCampaign()將爲具有給定ID的活動中的用戶返回UserModel對象。

  • User::getUsersNotInCampaign(),我假設,返回一個UserModel對象數組?將它重構爲`UserFactory::getUsersNotInCampaign(),然後你就去。

  • User::isAdmin()根本不應該是靜態的。 if ($user->isAdmin()) ...,不if(User::isAdmin($user))...

+0

-1:請停止混淆「工廠方法」與適當的工廠反模式。另外..請標記您不同意的評論。 –

+0

我沒有標記一件事。事實上,你的評論讓我想知道我明顯的錯誤信息,我希望你能指點我關於正確的工廠的資源,他們的方式。 – Andrejovich

+0

好吧..第一個評論神奇地消失了(我只是假設這是你的行爲,對於那個錯誤感到抱歉)。由於兩個問題,靜態工廠方法被認爲是反模式。即時問題是由於使用靜態程序導致的緊耦合引起的。它也帶來了一個更長遠的問題:如果你開始在你的代碼庫中使用繼承,工廠方法會變成一個「複雜的黑洞」,因爲它開始吸引大量的創建邏輯。 –