2014-01-26 46 views
1

我們都知道全局變量是可以避免的,但是將它們放入命名空間是一個解決方案還是另一種形式的相同問題?擁有像數組這樣的東西,任何人都可以在命名空間中訪問和更改它仍然很糟糕嗎?
是否有任何的替代品,當你有一個變量:命名空間中的變量如何比全局變量更好

  • 這並不在現有的類屬
  • 需要由一個以上的現有類使用
  • 並不需要有一個實例(它們應該都是修改同一個)

命名空間使得更容易理解是否有必要使用像這樣的更多變量,所有這些都與相同的想法有關。他們還使得追蹤更容易。這些是唯一能讓他們比擁有全球性更好的東西嗎?我並不是在淡化他們的重要性,只是好奇而已。
思考這個問題,在C#全局靜態類成員基本上是這樣的情況。

編輯:終於製作了一個新的類畢竟(並通過它通過參考像正常一樣)。有可能會增長,所以我覺得這個班很好。另外寫出命名空間後,它只是感覺這種情況的一個可怕的解決方案。

+4

「需要由多個現有類使用」 - 然後將實例傳遞給所有需要它的成員函數。 – 2014-01-26 17:12:23

+0

另外請注意,有一個「經典」的坐席,其中一個全局變量不僅僅是必需的。例如:需要在不同調用之間重新生成信息的函數。這可以通過函數的局部靜態變量完美實現。 – Manu343726

回答

1

全局(至少)有三個獨立的困難。他們:

1)防止其他人使用相同的名稱(或者如果他們這樣做,他們遮住了你的名字,這可能會讓人困惑)。把東西放在命名空間中對此有所幫助。 2)難以同時推理所有直接修改全局的代碼。除了匿名命名空間之外,命名空間對此沒有幫助,因爲它們可用於將對全局的訪問限制爲一個TU。使用私有靜態類成員,可能有一些使用friend,可以幫助。非可變全局變量也有幫助。 3)難以同時推斷所有間接修改全局的代碼,因此難以推斷全局的當前狀態應該在程序中的任何指定點。非可變全局變量的幫助。只要緩存過期得到正確處理,其狀態您不關心的全局變量(例如,它可能不會影響代碼的正確性,無論給定結果是否已被緩存)。命名空間不起作用。在私有數據成員中「隱藏」全局狀態,同時仍然離開公共訪問者不會有幫助。

那麼,命名空間是否有助於解決全局變量的困難?一點點,但不多。

如果您意識到全局變量的其他困難,那麼您可以自己評估名稱空間是否有幫助。如果你沒有意識到全局的困難,那麼你不會因爲有人告訴你每個人都知道他們是壞人而避免他們作爲宗教信仰來做任何好事。一種方法可以讓人知道要問某個願意教你一些東西的人,而不是試圖嚇到你成爲一名優秀的程序員。另一種方法是使用它們,看看你遇到了什麼麻煩,如果有的話。

0

我相信這確實只是同一問題的一部分。爲什麼不考慮將這個變量放入一個命名空間,

問題)這個變量/數組是否可以包含在一個類的生命週期中,而任何其他需要它的類都包含一個指向這個變量的指針/引用。

允許類通過指針訪問的變量,你可以把它幾乎相同的方式作爲全局變量,只要確保它傳遞到構造函數,或者有一個二傳手它

一般來說你

正常類想要封裝一個對象狀態,並用函數來操作它。在另一方面命名空間可以被認爲更作爲用於解決即具有類似std命名空間任務的相關功能分組...

std::cout << "msg here" << std::endl; 

有在這個例子中包含該命名空間中的功能在屏幕上打印緩衝區並清空輸出

+1

請注意,您可能無意中使用了OP詢問的具體內容。 'std :: cout'是一個具有命名空間範圍和靜態持續時間的變量。 –

0

當我們以OOP風格設計程序時,我們將其定義爲實體的交互。實體在實現細節中隱藏自己的狀態,並提供接口(使交互成爲可能)。將所有實體定義爲類已被證明是有效的。如果我們擁有全局變量,那麼我們就會妥協美,打破原則,在任何階級之外都擁有實體狀態。命名空間在這種情況下不能幫助我們。