2011-11-11 131 views
2

我真的很喜歡能夠組織我的對象,像這樣SourceDocument對象內部的對象。對象 - 屬性最佳實踐

方法#1

Dim doc As New Process.Document() 
doc.Source.Type = "URL" 
doc.Source.Data = "http://myOtherDomain/MyOtherPage.htm" 

< View #1 PasteBin Full Code>

但是,它是一個更好的做法,做這樣的事情?

方法2

Dim doc As New Process.Document() 
doc.SourceType = "URL" 
doc.SourceData = "http://myOtherDomain/MyOtherPage.htm" 

< View #2 PasteBin Full Code>

我想問的原因是因爲它,因爲你這得到與第一種方法有點混亂:

Process.Document.DocumentSourcedoc.Source

我認爲在方法#1中,Process.Document.DocumentSource是冗餘文檔兩次,希望有一種方法可以隱藏該組件的用戶在智能感應下拉列表中可以選擇的對象。

但是在另一面,如果你有很多屬性,最好能將它們分組到子對象中,比如方法#1,這樣你就沒有一百個屬性全部列在智能感應下拉列表。

回答

2

Law of Demeter說方法#2是要走的路,只有這兩個選項。

第三種方法可能是提供Source對象而不是設置doc.Source.XYZ

// C# -- don't know VB.Net 
var source = new DocumentSource(); 
... 

doc.Source = source; 

第四種方法將有效地構造注射如果需要Source

var source = new DocumentSource(); 
... 
var doc = new Process.Document(source); 
+0

「德米特法則」的鏈接正是我所期待的。我不認爲自己有任何實際上試圖抵禦我的情況的危險,但是我希望儘可能採用最佳實踐,並且這似乎是不會使用方法1的好例子。 我認爲我應該將相同的規則應用於'Process.Documents.add(doc)'行,對嗎? 這給我帶來了另一個問題。我應該把所有的對象,比如'DocumentSource'和'DocumentCollection'放在最高的命名空間級別嗎?並將它們稱爲'ProcessDocumentSource'等? – EdenMachine

+0

RE調用'.add':是的。 –

+0

RE其他職業:你可能希望他們在更高的水平。 –

2

第一種方法很好,不應該搞亂Intellisense。 Process.Document.DocumentSource是一種類型(因爲您使用的是嵌套類),而doc.Source是屬性。

也就是說,通常建議而不是使用嵌套類,特別是如果它們是公共的。我認爲還有一個FxCop規則。將中的ProcessDocumentSource中的Document等級清除出去會很好地清理問題。

1

我試着將它們組織成邏輯實體。如果TypeData屬於邏輯實體Source屬性,我可能會使用您的方法#1。如果TypeData與文檔更相關,我會將其存儲在那裏。

什麼似乎是對你最正確的,應該是你的最終選擇。在這種情況下。方法#1似乎適合我。特別是如果Source也具有其他屬性。