5

私が以前持っていたもの:

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

{channel}最初のものは、パラメーターを配列に変換するために2 番目のものを呼び出すだけです。

メソッドに渡すチャネルのリストを作成しなければならないのは面倒だと判断し、2 つのオーバーロードをParamArray.

Public Sub Subscribe(ParamArray channels() As ChannelType)

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

ここでの「ベストプラクティス」は何ですか? ParamArray人々が何かを渡せるようにする柔軟性が気に入っていますがArgumentException、コンパイラエラーフィードバックを介して開発者が「フェイルファースト」するのを助けることはできません.メソッドが単体テストを作成していない可能性があります。1つのオプションは次のとおりです...

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

しかし、それは私をほぼ振り出しに戻し、混乱を招き、そのメソッドの実装をそれほど単純にする必要があるように感じます。

4

2 に答える 2

12

Another option to consider would be

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

The <Obsolete()> tag with a second parameter of True informs the compiler that attempting to use the marked method should result in a compilation error. Since the method in question would be used when, and only when, an attempt is made to invoke the method without any parameters, it would cause an error only at such times. Note that method will not be used if an attempt is made to pass the method a zero-element array of Integer; in that case, the normal ParamArray form would be used.

于 2012-10-09T23:17:40.080 に答える
6

あなたが言及したオプションが最良のオプションだと思います。パラメータにわかりやすい名前を使用すると、混乱が少なくなります。

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

もう1つのオプションは、実行時に強制することですが、あなたが言ったように、それほど速く失敗することはありません:

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 に答える