2011-09-22 86 views
7

比方說,我有以下方法:請求對象,有什麼優點和缺點?

public Stream GetMusic(string songTitle, string albumName) { ... } 

我的一位同事相信,這種不好的方法簽名。他希望我使用請求對象,這會將方法簽名轉換爲:

public Stream GetMusic(SongRequest request) { ... } 

我真的不明白這一點。我看到的唯一好處是將來可以更容易地添加參數。我們不需要更改方法簽名,但Request對象仍然需要更改。

就我個人而言,我不認爲這是一個好主意。使用參數可以明確該方法運行的要求。另外,這迫使我們創造另一個不多的對象。

使用Request對象有哪些優缺點?你在項目中使用它,爲什麼?

+0

在未來添加「更容易」的新參數的好處將在以後導致您更改方法的合同並可能影響現有客戶端。因此,如果合同變更,請務必明確,因爲客戶應該知道這一點。 –

+0

只是一個觀察,你可能想排除你自己/同事的意見,以避免問一個主要問題。 –

+0

不。.NET框架不這樣做,足夠說。 –

回答

2

您正在使用GetMusic(...)方法獲取數據。如果是這樣的話,那麼在沒有真正需要的情況下可能會過多地使用額外的實體。

事實上,在只有一個輸入參數的情況下,您可以使用自定義類。但是,如果該類是唯一使用的地方,那麼如果SongSignature作爲類名稱說明,則必須使用,特別是,但這是使用「參數包」的錯誤做法,因爲它具有可讀性。

此外,如果有人愚蠢說SongSignature必須是一個結構,在這個結構有一個指向某個數據裏面的方法來改變,那指針永遠不會真正改變,因爲每次GetMusic被調用時,它會副本房產包

即使它是一個類,你必須爲這個類的訪問更改爲public,一般來說這不是直傳的參數從一個函數的函數和取得成果的最好方法,因爲你有已經從該方法獲得流。

假設以下情況:

如果在一個團隊一個程序員替換類SongRequest參數,第二程序員沒有發現它作爲參數傳遞給函數(因爲它在LUCKS信息一個類的名稱),並在下一次迭代時將其更改爲結構,第三個程序員以這種方式使用此方法,它必須是一個類(例如,在SongRequest內使用了類引用)。因此,no一個人確實知道爲什麼有些東西不能工作,因爲他們每個人都有圓頂right事情......沒有理由使用類作爲本地使用,而不是隱式聲明參數。

一般來說,你有一個很好的機會在未來獲得這樣的情況,這是因爲:

  • 你是不是誰改變你的代碼(即GetMusic
  • 有人可以查看代碼,並找到一個類'SongReqest'很有用(所以情況變得更糟 - 從本地使用到全局使用類)
  • 添加SongReuest類可以爲您添加額外的依賴關係方法(有人更改此類,最有可能是您功能不會編譯)
  • 使用SongRequest作爲property bag如前所述僅鎖定它作爲類的用法。使用這個類
  • ,你的方法可能永遠不會使用SongRequest同學分享它與其他函數調用的參數(原因是什麼?)
  • 最後,只爲傳遞參數的特定功能,提供了額外的內存開銷的足跡,因爲如果這種方法經常被調用,那麼一方面它會在內存中創建大量不必要的對象而不得不進行垃圾回收,另一方面,如果很少使用這種方法,創建一個類將是不實際的將幾個變量傳遞給單個呼叫

只有一個真正的原因使用類而不是兩個字符串參數:你的程序員喜歡這樣的調用,並希望使所有代碼「比以前更漂亮」,更單調,儘管事實上這不是很實用和有用。

我永遠不會建議你讓代碼看起來像這樣,直到你想讓它看起來更好。

一般來說,我想使用自定義類傳遞函數的參數是一種不好的做法。

+0

令人驚歎的迴應!謝謝Artur! – Martin

+0

@Martin:不客氣! –

+0

你不能把它定義爲一個壞習慣,有場景的地方是有道理的......「這取決於」 – Jowen

2

還有就是要傳遞一個對象的一個​​主要優點 -

如果用作參數的對象,如SongRequest,對象可以負責其自身的驗證。這樣可以大大簡化每個使用該對象的方法中的驗證,因爲幾乎只需要檢查null,而不是檢查每個參數。

此外,如果您有很多參數,生成單個對象通常會更簡單。如果您發現您需要多重過載來管理不同的參數組合,那麼情況尤其如此。

這就是說,每種情況都是獨一無二的。對於每種情況,我都不會推薦一種方法。

+2

如果在一個團隊中一個程序員用一個類「So​​ngRequest」替換參數,第二個程序員沒有發現它被用作一個函數的參數(因爲它在一個類的名字中傳遞信息),並在下一次迭代時將它改爲一個結構,第三個程序員使用這種方法,它必須是一個類(例如在'SongRequest'裏面使用了類的引用)...結果沒有人確實知道爲什麼某些東西不能工作,因爲他們每個人都有圓頂*正確的東西......沒有任何藉口可以使用類本地使用,而不是隱式聲明參數 –

+0

從經驗說起,通過它的聲音:) –

+3

@ArturMustafin:將類型從'class'更改爲'struct'是一個重大變化。如果不考慮它的使用方式,就不應該這樣做,而且應該在創建時,通過深思熟慮來確定設計。在這個數量級的事實發生變化之後,總是應該查看所有類型的引用,所以,IMO,如果有合理的設計方法,這應該不會發生。 –

相關問題