2012-02-15 40 views
2

我打算在我的遊戲網站上添加類似Steam的成就。計算將由計劃的cron處理,結果存儲在典型的MySQL數據庫中。爲了方便起見,我正在考慮將所有各種計算方法傾倒到一個巨型STATS課程中。這些方法永遠不會被網站的任何其他方面所調用,只有這個特定的成就cron。班可能太大?

我需要擔心這個班級變得太大嗎?現在是2K左右LOC,但沒有理由它不能擴展到10K,50K或隨着時間的推移...

這是在共享主機順便說一句,所以內存的限制確實存在,在一定程度上...

回答

2

是,類可以肯定長得過大。

出現這種情況時,它通常是錯位的責任的標誌。太多的課程是AntiPattern called The Blob aka God class。這些類違反Single Responsibiliy Principle,並會對耦合和內聚產生負面影響。這反過來會使您的應用程序的可重用性降低,難以擴展和維護。

要正確劃分責任,考慮哪些數據則可以順理成章地組合在一起,然後使該到一個單獨的對象。過長的方法也是如此。將它們分開。如果您發現某個子例程在對象中佔用大量空間,請查看您是否可以將該代碼提升爲封裝該算法的策略。

在您的具體情況下,聽起來您可以從命令模式中受益,例如,有一個StatsCommander使用多個StatCommands(這是策略)。這就保持了將各種統計數據完全分開的邏輯。當你需要添加一個新的Stat時,只需添加一個新的策略/命令。

0

你爲什麼認爲這個班會變得太大?

如果你認爲同一類的多個實例可以使用,你可以使所有這些方法爲static(因此,所有的功能將只有一個實例。)

或創建它只有一個實例並讓其他人通過在原始實例之前使用&訪問同一實例。

或者你可以考慮使用Singleton Pattern

編輯

您可以考慮創建小班授課,並讓他們的現在的大類的成員。

這將保持你的代碼組織和相應的分類。

+0

我不這麼認爲。如果我確實這麼想的話,我可能會提出這樣一個問題:「班級可能變得太大,不是嗎?」*。 – Drew 2012-02-15 06:45:05

0

通過創建類更大,你只能有泄漏內存的缺點,因爲大部分的功能將無法使用,直到對象存在將保持仰臥在內存中,但問題是,如果你正在創建比它像辛格爾頓極少數的對象是完美的。

一個很好的事實是,沒有母校多少功能,你在一個類中的單一功能的執行需要同時在一個類中聲明一個單一的功能,並使用它。

我建議你實現代碼組織母校類之間的繼承,也做一個OOD它。所以,你會花更少的時間來修改和管理代碼。以封裝和多態:)的優勢

0

當寫一個類時,你問自己:「這是需要功能作爲一個實例或全局函數?」,這是最好的一個例子說明:

class House { 

    private $door; 
    private $window; 
    private static $adverb; 

    public function __construct(Door $door, Window $window) { 
     $this->door = $door; 
     $this->window = $window; 
    } 

    public function placeNewDoor($door) { 
     $this->door = $door; 
    } 
    public function placeNewWindow() { 
     $this->window = $window; 
    } 

    public static function advertiseNeighborhood() { 
     echo "Advertisment! " . self::$adverb; 
    } 

} 

會有很多房屋,每個房屋可能有DoorWindow。所以每個人都得到一個實例方法/屬性。但是,您只會宣傳您的Neighborhood一次(而不是每個房子),以便該功能是靜態的,並且可以通過House::advertiseNeighborhood訪問。

爲什麼我發表這個例子?如果有一個函數不需要實例化,它們應該保持爲static。它將防止實例化多個對象時內存泄漏。

至於你的實際問題,有一個非常大的班級是完全可以接受的,只要確保你不過度使用你的記憶。