2012-11-03 55 views
0

我有一個應用程序定義了常見對象類型的某些操作。PHP OO設計:擴展靜態類或實例類?

例如,您可以擁有論壇帖子和圖片。對於每個論壇帖子和圖片,您可以執行以下操作:推薦,評論,評分。

我已經當前定義的靜態類

class CoreObjectUtil 
{ 
    protected static $_objObjKey = null; 
    protected static $_objTypeKey = null; 

    public static function getComments (...) {...} 
    public static function getCommentsArray (...) {...} 
    public static function getRatings (...) {...} 
    public static function getRatingsArray (...) {...} 
} 

,然後將其子類這樣

class ForumPostUtil extends CoreObjectUtil 
{ 
    protected static $_objObjKey = 'forumpost'; 
    protected static $_objTypeKey = 'FP'; 
} 

提供了論壇帖子的相關功能。這兩個參數足以讓CoreObjectUtil中的泛型代碼知道爲這些函數適用的每種對象類型要做什麼。

要使用這些功能,我打電話在我的實例類selectPostProcess()類這樣的:

public function selectPostProcess ($data) 
{ 
    $data = ForumPostUtil::mergeRatings ($data); 
    $data = ForumPostUtil::mergeComments ($data); 
    ... 
} 

這種運作良好,並保持在CoreObjectUtil類集中與它的子類提供數據的主要代碼設置讓CoreObjectUtil中的代碼知道該怎麼做。

一種替代方法將是從CoreObjectUtil代碼移動到一個基本實例類,然後將其在我的實例類繼承。因此,而不是從CoreObjectUtil調用靜態方法,我會做$ this-> getComments()方法調用。

從功能類型的角度來看,任何一種方法都可以正常工作。然而,我很想知道面向對象的設計指南和經驗豐富的ObjectOriented開發人員對這兩種方法的看法。哪種方式更好,爲什麼?

我希望對此事有任何想法/見解。我可以在沒有問題的情況下以任何方式編寫代碼,但我很難決定採取哪條路線。

+2

一般的說法是:使用對象,而不是靜態類的功能。對象更加靈活。 – hakre

+0

當你進行全靜態類時,它甚至不是OOP。 「類」實際上就像變量和函數的名字空間一樣。基本上,這只是程序編程的另一種形式。 –

回答

0

你現在有一個代碼,我認爲,最程序的做法曾經冒充OOP即你現在有什麼是OOP的對面。使用class關鍵字不會使其成爲OOP。

首先,你應該忘記靜態,這不是它不好使用,但它很容易被濫用,如果功能可以屬於建模領域概念的對象,你必須首先嚐試(在你的案例論壇有關)。只有當這種方式沒有意義時,你纔會將它作爲實用程序類中的靜態方法。

說實話,你必須重新設計圍繞OOP心態尤爾的應用程序,這是與模型中的具體概念或過程,其中只有一個responsaiblity行爲定義類。更重要的是你不應該把業務對象(對論壇概念進行建模的對象)與持久性問題混合在一起,即不要將業務功能和數據庫訪問放在同一個對象中。使用單獨的類訪問存儲。

使用存儲庫模式將業務層與持久層分開。儘量不要將創建/更新功能與查詢IF混合在一起,從而使事情變得複雜。在這種情況下,使用專門用於查詢的單獨讀取模型。

您向我們展示的代碼是關於查詢的。你可以有一個簡單的DAO /庫(叫什麼你在這種情況下想要什麼)這樣

class ThreadViewData 
{ 
    public $Id ; 
    public $Title; 
    public $Comments; //etc 
} 

    class ThreadsQueryRepository 
    { 
     //we inject the db access object , this helps with testing 
     function _construct($db) { } 
     public function GetThread($id){ } //this returns a ThreadViewData 
    } 

的後處理功能,可以合併評分和評論服務。但是,也許合併功能更適合評級和評論對象。我不知道該域名實際上是否提供了有效的建議。

要點是,你必須思考不在函數中的對象,現在你所擁有的只是函數。

+0

謝謝您的詳細解答!我會根據您提供的想法重新設計。 – user13955