2012-10-09 112 views
5

我曾經有:使用一個ParamArray,但至少需要一個參數

Public Sub Subscribe(channel As ChannelType) 
Public Sub Subscribe(channels As IEnumerable(Of ChannelType)) 

第一個只是調用第二個與{channel}其參數轉換爲數組。

我決定創建一個傳遞給該方法的通道列表很尷尬,並選擇將兩個過載組合成一個方法,該方法需要一個ParamArray

Public Sub Subscribe(ParamArray channels() As ChannelType) 

'Usage 
Subscribe(ChannelType.News) 
Subscribe(ChannelType.News, ChannelType.Sports) 
Subscribe() 'Oops... this is valid 

這裏的「最佳實踐」是什麼?我喜歡ParamArray只是讓人們傳遞東西的靈活性,但它無法通過編譯器錯誤反饋幫助開發人員「更快地失敗」......這意味着像ArgumentException這樣的東西在這裏不存在問題,因爲人們使用此方法可能不會編寫任何單元測試。其中一個選項是以下...

Public Sub Subscribe(channel As ChannelType) 
Public Sub Subscribe(channel As ChannelType, ParamArray channels() As ChannelType) 

但我覺得這樣使我幾乎回到原點,是混亂的,並要求我執行該方法的不那麼簡單。

回答

11

要考慮的另一個選擇是

Module ParamArrayTest 
    Sub ShowThings(ParamArray MyThings() As Integer) 
     For Each thing As Integer In MyThings 
      Debug.Print("{0}", thing) 
     Next 
    End Sub 

    ' Don't try to call without parameters: 
    <Obsolete("Must have at least one parameter", True)> Sub ShowThings() 
     Throw New ArgumentException("Must specify at least one parameter") 
    End Sub 

    Sub Test() 
     ShowThings(3, 4, 5) 
     ShowThings() 
    End Sub 
End Module 

<Obsolete()>標籤與True第二個參數通知嘗試使用標記的方法應該R上的編譯器編譯錯誤。由於當且僅當嘗試調用沒有任何參數的方法時纔會使用有問題的方法,因此只會在這種情況下導致錯誤。請注意,如果嘗試將方法傳遞給Integer的零元素數組,則不會使用該方法;在這種情況下,將使用正常的ParamArray表格。

+0

這很聰明! –

+0

我認爲這個答案得到它......對不起@元騎士!我喜歡我如何獲得編譯器反饋,並且能夠簡單地遍歷ParamArray而不必使用ParamArray對單個項進行連接來迭代我的參數,從而獲得了直接的易用性。 –

+2

@JeffBridgman:請注意,與具有單獨參數的方法不同,此代碼使代碼可以傳入包含所有參數的數組,而不必傳遞第一個項目和包含其餘數組的數組;因此,雖然它可以禁止使用空參數列表進行調用,但它在編譯時不能禁止使用空數組進行調用。 – supercat

6

我認爲你提到的選項是最好的選擇。使用你的參數更清晰的名稱將使它不那麼混亂:

Public Sub Subscribe(mainChannel As ChannelType, ParamArray otherChannels() As ChannelType) 

另一種選擇是在運行時執行,但正如你所說的不會那麼快失敗:

Public Sub Subscribe(ParamArray channels() As ChannelType) 
    If channels.Count = 0 then 
     Throw new InvalidOperationException("At least one channel is needed") 
    End If 
End Sub 
+0

很好的答案!如果我有一個主要頻道和附加頻道的問題域,那麼您提到的第一個選項將是完美的! –

相關問題