2009-10-29 114 views
6

我已經在各種地方讀過全局變量的變量,即帶有靜態成員的公共靜態類,被認爲違背了面向對象的哲學,並且不是很好的設計。 (例如,我已經看到如下評論:「如果你使用的是全球性的,那麼你的做法是不正確的。」或者這樣的話)全局變量v C#中的設置

但是,如果你使用Settings機制Visual Studio,例如「Settings.Default.MySetting」等等,這在整個應用程序中是全局可用的,所以這與使用公共靜態類有什麼不同?

此外,使用單例對象也可以獲得相同的結果,但這至少可以引發各種意見。 (VB模塊,任何人?),但我想教自己如何正確地做這個OO malarky,所以,如果全局變量從面向對象的角度來看味道不好,什麼是什麼?是另一種選擇?

我對使用'設置'功能的人的意見特別感興趣。這被認爲是很好的面向對象設計?

謝謝你的任何意見。

回答

14

靜態方法和其他成員本身並不錯。只是那些對OO概念不太熟悉的人往往會將靜態方法,屬性和字段放到代碼中,而不會意識到後果。

一般來說,對於像配置設置,幫助程序和實用程序類,抽象工廠,單身人士等具有靜態成員的東西是完全可以接受的。

1

公共靜態類或成員並不總是一個壞主意(即使它不是完美的OO)。許多優秀的面向對象設計使用公共靜態成員來完成Loggers或Settings等任務(正如您所指出的那樣)。一個很好的例子是如何以OO的方式做到這一點是Static Gateway

1

像gotos這樣的全局變量是所有初學者都應該避免的,但對於高級程序員來說是非常有用的。

我會說,如果你不覺得自信,並且你沒有一個明確的,合理的理由,爲什麼它是一個很好的應用,不要使用它們。在恢復全局變量之前掌握OO。

0

設置機制...嗯...

我看那些主要作爲環境的一部分。像操作系統或時間,但對於應用程序。它們並不像你在INIT期間聲明的那樣是「變量」。

但是,您可以在它們周圍包裝一個對象,並且只能通過該對象訪問它們,而不是在運行時需要它們時讀取它們。我沒有對它進行測試,但它可能是一種性能上的洗牌(或者如果你沒有做好內存管理,那麼對它們進行原始測試就是消極的)。

最終,隨着應用程序的成熟,像這樣的事情最終會讓對象纏繞在它們周圍。我的規則是,每當我開始思考時,「不,這太簡單了,太原子了,不需要一個對象......」這是我把它作爲一個對象的線索。

2

在C#中,您將很難與優秀的OO設計相媲美,因爲您無法擺脫OO。它不像C++那樣可以混合和匹配結構化的OO編程 - 這種類型的爭論經常發生的領域。 類中的靜態成員是OO。微軟的生成設置也是如此,因爲代碼生成會爲它們創建OO封裝,或者至少爲它們周圍的「對象容器」創建OO封裝。所以他們從來都不是全局變量,因爲它在C#中不存在 - 它們只是類中的靜態成員 - 沒有那些非OO。

如果參數是關於單身對靜態成員,那麼它將一個OO參數與另一個OO參數對齊。

然後總是有哲學觀點和實踐觀點。在大多數國家,理想哲學觀點的實施並不是真正值得的,除了學術研究之外。現實世界需要真正的解決方案和混合解

+2

很難過?是。難以停止一個堅定的,無能的開發者嗎?決不。我已經失去了我看到某種方式實施的次數,這種方式比設計的方式更加困難和不那麼正確。 (如果我說我從來沒有犯過這樣的事情,我會撒謊的。) – 2009-10-29 19:20:56

+0

好點的格雷格D.你應該看到我過去的代碼snafus! – 2009-10-29 19:23:41