5

我曾经拥有的:

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让人们传递东西的灵活性,但它无法通过编译器错误反馈帮助开发人员“更快地失败”......这意味着像 an 这样的东西ArgumentException在这里是不可能的,因为人们消费它方法可能不会编写任何单元测试。一种选择如下...

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

但我觉得这让我几乎回到了原点,令人困惑,并且要求我对该方法的实施不那么直截了当。

4

2 回答 2

12

另一个要考虑的选择是

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编译器尝试使用标记的方法会导致编译错误。由于所讨论的方法将在并且仅当尝试在没有任何参数的情况下调用该方法时才使用,因此仅在这种情况下才会导致错误。请注意,如果尝试向方法传递 ; 的零元素数组,则不会使用方法Integer。在这种情况下,ParamArray将使用标准形式。

于 2012-10-09T23:17:40.080 回答
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
于 2012-10-09T18:41:21.827 回答