2014-01-13 64 views
2

我現在試圖擺脫我的服務器代碼中的上帝對象。上帝對象替換

在我的服務器設計開始時,我決定將Worldconst容器對象做爲單例。

但我的服務器是多線程的,單身人士沒有很好的解決方案。

所以我管理它,我把這個類作爲Core類實例移動。

例如:

class Core 
{ 
... 
private: 
World world; 
CExpTable exptable; 
... 
}; 

Core新連接是給對對象的Session類。

new Session(io_pool.getService(), world, exptable ...); 

我只需要該對象的一個​​實例。 但上帝的對象是壞的設計模式,所以我會問,我該如何重新設計該對象,以避免它,並且是單身模式設計好?

回答

3

首先,你可以閱讀很多關於單身人士爲什麼不好的帖子,例如this。關於爲什麼這種模式在大多數情況下並不真正有用,還有很多有效的觀點。

至於你的重構:最好的方法是一步一步走。大革命通常會產生錯誤。根據我的經驗,拆除神物並不是很難。

您可以進行如下操作:

  • 確定你想從神對象中提取
  • 設計這個責任的新接口一個小的責任:
    • 開始編寫單位 - 測試新類實現這個新接口。通過封裝在新對象中的神對象的實例進行測試,並且僅轉發調用
  • 具有一組單元測試,您可以從God對象中切出代碼片段到新對象

下一步是在新職責的上下文中用新接口替換god-object類的所有用法,然後重新執行。

如果你有一些狀態需要使用/由這些責任(如在您的示例World實例)來處理,那麼你就必須使它共享。例如,您可以將其轉換爲shared_ptr,因此可以將其保留在重構過程中的上帝對象中,並在新類中使用它。

+0

Soo,我只想創建World類的一個實例,但我不知道在哪裏存儲引用/指針,在我將所有存儲在God類中的所有內容都稱爲Core之前。你能解釋一下我如何在沒有神克或單身的情況下儲存世界級的實例嗎?謝謝。 – user3126089

+0

@ user3126089我已經用一種可能的解決方案更新了我的答案。 – BartoszKP

+0

會不會很好地給它從'上帝級'指向它喜歡新的會話(...,世界指針,...)? – user3126089