在閱讀了關於這個主題的SO線程之後:我想出了爲什麼全局變量/單例不好的原因。我可以在這種情況下使用全局變量嗎?
- 隨着代碼的增長,越來越多的函數將修改該全局狀態,全局狀態越來越難理解。
- 它使單元測試更難。
- 它隱藏了依賴關係。
- 如果有一天事實證明你的全局變量實際上不是一個單一的對象/變量,你將不得不重寫代碼。
我想用C++做一個遊戲,並且會有一個「高度圖對象」,它表示我的遊戲中的世界景觀爲高度圖。此高度圖可以更改。我想爲它使用全局對象。 (我不希望遇到靜態初始化順序問題,因爲不會有任何其他靜態變量引用此高度圖對象)。
現在,我知道全局狀態不好,全局可變狀態更糟糕,因爲上述原因。但是看起來確實非常麻煩:做一個main()
作用域的高度圖對象,並將該高度圖對象傳遞給每一個想要使用它的函數。
如果我100%確定應用程序中只有一個高度圖,該怎麼辦?另外,由於這是一個小型的獨立項目,我相信我能夠理解每個功能對全球狀態所做的事情?我不明白在這種情況下如何使用全局變量會影響單元測試。如果我想使用模擬高度圖,在調用我想測試的函數之前,我不能僅僅執行globalHeightmap = generateMockHeightmap();
嗎?
最有可能的情況是,高度圖只是您的函數在其中運行的上下文的一部分。它應該與其他情況分組,而不是單獨處理。 – 2012-07-08 04:38:06
「但是看起來確實很麻煩,可以做另一種選擇」如果這看起來很麻煩,那麼你的代碼架構不好。 – 2012-07-08 04:38:07
只是舉一個David Schwartz正在談論的具體例子 - 創建一個包含高度圖的類,並使需要訪問高度圖的函數成爲此類的成員,以便您不必通過高度圖明確。 – 2012-07-08 06:44:46