2012-07-08 98 views
1

在閱讀了關於這個主題的SO線程之後:我想出了爲什麼全局變量/單例不好的原因。我可以在這種情況下使用全局變量嗎?

  1. 隨着代碼的增長,越來越多的函數將修改該全局狀態,全局狀態越來越難理解。
  2. 它使單元測試更難。
  3. 它隱藏了依賴關係。
  4. 如果有一天事實證明你的全局變量實際上不是一個單一的對象/變量,你將不得不重寫代碼。

我想用C++做一個遊戲,並且會有一個「高度圖對象」,它表示我的遊戲中的世界景觀爲高度圖。此高度圖可以更改。我想爲它使用全局對象。 (我不希望遇到靜態初始化順序問題,因爲不會有任何其他靜態變量引用此高度圖對象)。

現在,我知道全局狀態不好,全局可變狀態更糟糕,因爲上述原因。但是看起來確實非常麻煩:做一個main()作用域的高度圖對象,並將該高度圖對象傳遞給每一個想要使用它的函數。

如果我100%確定應用程序中只有一個高度圖,該怎麼辦?另外,由於這是一個小型的獨立項目,我相信我能夠理解每個功能對全球狀態所做的事情?我不明白在這種情況下如何使用全局變量會影響單元測試。如果我想使用模擬高度圖,在調用我想測試的函數之前,我不能僅僅執行globalHeightmap = generateMockHeightmap();嗎?

+2

最有可能的情況是,高度圖只是您的函數在其中運行的上下文的一部分。它應該與其他情況分組,而不是單獨處理。 – 2012-07-08 04:38:06

+0

「但是看起來確實很麻煩,可以做另一種選擇」如果這看起來很麻煩,那麼你的代碼架構不好。 – 2012-07-08 04:38:07

+0

只是舉一個David Schwartz正在談論的具體例子 - 創建一個包含高度圖的類,並使需要訪問高度圖的函數成爲此類的成員,以便您不必通過高度圖明確。 – 2012-07-08 06:44:46

回答

1

就像你現在可能關於你項目的特徵一樣,我幾乎可以向你保證,在將來的某個時刻,你需要修改依賴於這個全局變量的代碼。在這一點上,全局變量可能會回來,並且讓你更難找出所需的更改,因爲狀態不是隱藏的(例如,如果意外更改狀態而不是從中讀取狀態,那麼整個程序將受到影響在未來的某個隨機點)。我不能誇大程序維護和調試的重要性,以儘量減少狀態變化點,全局變量與這個目標幾乎是相反的。

只是爲您的單元測試覆蓋全局狀態圖似乎很脆弱。如果你需要恢復舊狀態,或者在測試狀態之間進行變異,會怎麼樣?然後,你會得到一堆保存/設置/恢復代碼。

如果您想要將線程模型添加到您的應用程序會怎麼樣?使用全局狀態將使這個過渡變得複雜得多。

如果有人從現在起一年內幫助您完成項目,該怎麼辦?他們能夠理解代碼嗎? 從現在開始能夠理解它(我知道我總是試着編寫明顯的代碼並添加註釋,因爲我可能是一年後回來並不再記得某件事的人機制)。

最後,如果非全局變量方法看起來太多工作或太複雜,可能意味着您的替代方法太複雜或需要另一個想法/返工。沒有理由不能將高度圖存儲到在適當的高級別遊戲對象中創建的對象,並根據需要傳遞/存儲在較低級別的對象中。

相關問題