2012-07-14 121 views
2

我一直在閱讀,使用全局變量是不好的編程設計,但這是否意味着全局常量也不好?替代全局變量/常量

有什麼替代方法,而不是全局變量/常量,以及聲明多個源文件中需要的常量的最佳方法是什麼?

+0

http://c2.com/cgi/wiki?GlobalVariablesAreBad – 2012-07-14 23:16:05

+0

如果使用錯誤,全局變量是不好的。並且大多數時間他們被濫用/東西可以在沒有的情況下以更好的方式實施。你可以看看singletons http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29但它們也可能被誤用 – cppanda 2012-07-14 23:17:17

+1

從我讀過的內容來看,Singletons和全局變量一樣糟糕嗎? – Carlj901 2012-07-14 23:21:18

回答

9

背後全局變量是壞的主要原因是共享的狀態,這很容易讓一個程序的不同部分通過的方式,你不打算操控共享的狀態,使與程序的其他部分意料之外干擾的依賴使程序更容易出錯,難以調試並且難以維護。

另一方面,常量除了它們污染全局名稱空間(這可能會在編譯時通過更改編譯單元中符號的含義而導致意想不到的後果)之外幾乎可以。如果你可以在特定的命名空間/範圍中聲明它們,那麼你將會很好。

4

全局變量的真正問題在於,它們鼓勵從代碼中的許多點進行更改。執行某些操作的函數也具有改變全局狀態的side effect(實際上,Functional Programming根本不允許副作用來避免此陷阱)。

該編程風格很難正確調試和維護。

保持數據接近它的使用位置,以便有一個定義良好的機制來改變它。

全局常量不會遇到同樣的問題。

0

全局變量導致實際問題來自大量(通常未知)的依賴於共享狀態的代碼量。這可能會(導致)難以理解和跟蹤等的交互。簡而言之,很多代碼會緊密耦合,這往往會導致問題。

全局常量大多是一個(潛在的)哲學問題。由於它們是恆定的,絕大多數來自全局變量的實際問題都不會出現。與此同時,我們完全有理由懷疑一個特定的常量是否應該是全局的。如果(例如)你在處理物理問題,將光速定義爲一個全局常量可能是有意義的。根據不同的領域,諸如Pi,e等等也可以作爲全局變量來理解。另一方面,如果你可以合理地限制需要這樣的事情少代碼,這通常是可取的。 Pi值是不會改變的,但類似

x = area(some_circle); 

往往比更可讀/理解:

x = some_circle.radius * some_circle.radius * Pi; 
+0

的確如此,但對於一個特定的免費函數是否應該是全局性的問題來說,這是合理的。 (從某種意義上說,自由函數總是包含全局常量。)如果在整個程序中只需要一個地方需要一個小函數,比如'area',但是可能還需要'diameter'等等,我寧願讓_π_成爲全球性的,並用它來定義他們需要的功能,並對每個功能進行快速評論。 – leftaroundabout 2012-07-15 03:40:17