2011-06-09 28 views
4

讓我更加精確。在我的winforms項目中,創建類來管理/創建程序的每個部分。我做了更多的控制我的代碼。例如。我有一個管理我的DataGridView控件的類。我將它命名爲gridManager,並在其中設置所有屬性,顏色等,並且我還有方法來更改這些設置(例如changeBackgroundColor()等)。 我還爲splitContainer中的每個面板都有這種類型的類。在這些類中,我初始化每個控制面板的子項,我將它們添加到該面板中設置所有屬性等等。每當我可以很好的練習時,都使用靜態類嗎?

我寫了所有內容,讓您更好地瞭解這些課程的目的。

現在我的問題是:這是不是很好的做法,使這個類是靜態的?所有的控件和方法都是靜態的?

起初,我讓他們非靜態的,但是當我想呼籲(EG)從選項改變顏色的方法表格,我不得不要麼通過MainForm中作爲一個參數或不喜歡這樣寫道:

(Application.OpenForm[0] as MainForm).gridManager.changeColor(); 

它的靜態版本使它更容易。但它讓我懷疑它是否是一件好事。 呃很多解釋,我希望我的不完美的英語不會讓它更難以理解。 :)

回答

7

全局可變狀態通常是一個壞主意。

靜態方法/類適用於簡單的無副作用函數。 MathEnumerable就是很好的例子。

另一方面,您想要在靜態字段內進行控制。這些是可變狀態,因此應該避免。例如,如果你明天想要表單的兩個實例,則需要兩個經理類的實例。但它是靜態的,你現在需要用它重寫所有的代碼。

3

像任何事情一樣,靜態類有折衷。這兩個「負」那些腦海中出現

  1. 不能從靜態類
  2. 你不能(容易)模擬靜態類測試

但它聽起來像是繼承在你的情況下,無論如何你都不會繼承這些類,所以在這種情況下可能會沒事。

編輯這是假設你正在做一些類似控制工廠的事情。
例如: var grid = GridManager.CreateGrid(options);

如果你正在做的事情一樣

var data = GridManager.GetDataFromGrid(myGrid) 

我可能會重新考慮。

0

靜態類有它們的位置,但這可能不是其中之一,除非它是一個快速和骯髒的應用程序。如果你想對你的代碼進行自動化測試,如果被測代碼使用靜態類作爲首選項,這幾乎是不可能的。

使用singleton模式可能會更好。這樣您就可以在自動化測試過程中替換實施。

+0

我甚至會盡可能地避免標準單例模式。國際海事組織最好將它註冊爲你的DI容器中的單身人士。這樣,你就不會假設什麼東西是消費代碼中的單例。 – CodesInChaos 2011-06-09 21:21:48

0

您最好使用鏈接到該網格對象的普通類來做到這一點。如果你需要另一個網格對象,你可能需要實例化另一個實例。控制器不是靜態類的最佳人選。

0

它既不好也不壞,它只是某些任務的常見模式。

一般來說,您將使用靜態方法來實現與類類型相關的功能,但不依賴任何實例數據來工作,而經典用法就像工廠類型方法,它返回類的初始化實例其附屬於。

public SomeClass = SomeClass.CreateWithSomeInit(parms); 
0

靜態類當然有它們的位置,但我認爲只要有可能就使用它們是一個不好的建議。

OOP的整個概念是圍繞實例構建的,因此大多數時候應該使用非靜態類。原因?主要是靈活性。根據其內部狀態,可以讓兩個執行相同操作的實例稍微不同。您可以有更多相同概念的實現,並且可以輕鬆切換它們。你可以使用像Inversion of Control容器這樣的東西。等等。

相關問題