2012-09-11 45 views

回答

4

無論在哪裏使用全局變量,它們通常是bad

爲什麼全局變量應儘可能避免不必要的

  • 非局域性 - 源代碼是最容易理解的,當它的各個元素的範圍是有限的。全局變量可以被程序的任何部分讀取或修改,這使得很難記住或推論每種可能的用途。
  • 無訪問控制或約束檢查 - 可以通過程序的任何部分獲取或設置全局變量,並且任何有關其使用的規則都可輕易破解或遺忘。 (換言之,get/set訪問器通常比直接數據訪問更受歡迎,而對於全局數據來說,get/set訪問器更受歡迎。)通過擴展,缺少訪問控制極大地阻礙了在您希望運行不可信代碼的情況下實現安全(如使用第三方插件)。
  • 隱式耦合 - 具有許多全局變量的程序通常在一些變量之間有緊密耦合,變量和函數之間有耦合。將耦合的項目分組到一致的單元通常會導致更好的程序。
  • 併發問題 - 如果全局變量可以被多個執行線程訪問,則同步是必要的(並且經常被忽略)。將模塊與全局變量進行動態鏈接時,即使在幾十個不同的上下文中測試的兩個獨立模塊是安全的,組合系統也可能不是線程安全的。
  • 名稱空間污染 - 全局名稱無處不在。如果您認爲自己使用本地語言(通過拼寫錯誤或忘記聲明本地語言),則可能在不知情的情況下最終使用全局語,反之亦然。此外,如果您必須將具有相同全局變量名稱的模塊鏈接在一起,如果幸運的話,將會出現鏈接錯誤。如果你不走運,鏈接器將簡單地將同一個名稱的所有用法作爲同一個對象。
  • 內存分配問題 - 某些環境具有內存分配方案,使得全局分配變得棘手。在「構造函數」具有除分配以外的副作用的語言中尤其如此(因爲在這種情況下,可以表示兩個全局變量相互依賴的不安全情形)。另外,在動態鏈接模塊時,可能不清楚不同的庫是否有自己的全局實例或全局變量是否共享。
  • 測試和封閉 - 利用全局變量的源代碼更難以測試,因爲在運行之間無法輕鬆設置「乾淨」環境。更一般地說,利用任何類型的全球服務(例如讀取和寫入文件或數據庫)而沒有明確提供給該源的源很難以相同的原因進行測試。對於通信系統,測試系統不變量的能力可能需要同時運行多個系統的「副本」,這受到任何使用共享服務(包括全局內存)的嚴重阻礙,這些共享服務不作爲測試的一部分提供共享。
+0

好點,但也有一些是不相關的紅寶石(例如使用全球而不是偶然的地方) –

相關問題