2011-07-13 42 views
2

我知道,只有在一個地方纔能使用類對象時,它是糟糕的編程和體系結構。但是我也被警告過要創建一個功能強大且可以做得太多的對象。那麼我該如何解決這個問題呢?這裏是我的意思的一個例子 - 請不要把這些東西當作字面意思,因爲這只是一個例子。如何防止上帝對象?

無論如何,我有一個對象,我正在使用這是相當複雜的。很多信息都存儲在這個對象中,它可以對數據執行很多操作。所以,讓我們稱這個對象爲地球。

Public Class Planet 
Private _population As UInteger = 0 
Public ReadOnly Property Population() As UInteger 
    Get 
     Return _population 
    End Get 
End Property 

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1) 
    _population += numberOfPeople 
End Sub 
End Class 

到目前爲止還不夠簡單。但是我可以繼續研究這個對象可能執行的許多事情。因此,爲了防止事情變得過於複雜,我打破了白天和夜間發生的「活動」,創建了另外兩個對象:日夜(這兩個都沒有顯示)。所以現在我有一個更新的星球類。

Public Class Planet 

Private _population As UInteger = 0 

Private _day As New Day 
Private _night As New Night 

Public ReadOnly Property Day() As Day 
    Get 
     Return _day 
    End Get 
End Property 

Public ReadOnly Property Night() As Night 
    Get 
     Return _night 
    End Get 
End Property 

Public ReadOnly Property Population() As UInteger 
    Get 
     Return _population 
    End Get 
End Property 

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1) 
    _population += numberOfPeople 
End Sub 

End Class 

現在,這兩個類 - 日夜 - 將永遠行星類之外使用。這是一個很好的方式來組織我的方法和這個「父」類Planet的屬性嗎?我會怎樣整齊地組織類似的?

我讀過關於重構,但我不認爲這有助於我的情況。我喜歡這樣的想法,我可以調用一個Planet對象,如下所示:Earth.Night.BlowUpMoon

+0

好標題:-)。 –

+0

我相信這是一個實際的術語,當一個班級變得太強大或知道如何做得太多時。 –

回答

2

從可發現性角度考慮。如果其他人使用你的物體,他們是否知道他們必須去一個特定的時間來炸燬月球,這與BirthdayCard.September25th.Send()相同?任何通過「別人」我都會在6個月內包括你。你是爲組織而組織的嗎?還是你以一種合理的方式將類似的方法和屬性組合起來?

+0

我肯定以一種合理的方式添加方法和屬性,但我想確保這是一個很好的設計。我覺得我錯過了一些東西,因爲我曾經被告知不要創建一個對象,如果它只能在一個地方使用。我開始認爲這是沒有道理的,但我也看到使用一個對象來組織可能是糟糕的設計技巧。 –

+0

在.Net中,一切都是一個對象,因此您始終創建一次性對象。但我認爲你的意思是一堂課,對吧?下載Reflector並檢查.Net框架本身,您將在父類中看到許多用於存儲相關屬性的私有類。 'System.Uri'有2個類,1個結構和6個對這個類是私有的枚舉。使用上面的示例,我個人不會認爲'Night'對象能夠'BlowUpMoon()',我只是沒有看到這種關係。 –

1

重構您的課堂並將其分成幾個較小的課程,每個課程都有一個single responsibility。不要緊,他們每個人只能使用一次 - 代碼仍然會更好,更容易理解,並且可測試性更強。

2

雖然你的例子很有意思,但這種情況在領域驅動設計中很常見。你的星球類將是一個aggregate - 一個管理自己的內部實體的根對象。在聚合邊界之外,所有交互都通過根集合對象進行。