2012-10-09 22 views
5

少なくとも1つのパラメータを必要とする:ParamArrayはを使用して、私が持っていた何

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

最初のものは、単に配列にそのパラメータを変換するために{channel}と第二1を呼び出します。

メソッドに渡すチャンネルのリストを作成する必要があり、2つのオーバーロードをParamArrayという1つのメソッドに結合するのが難しいと判断しました。

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 

Trueの2番目のパラメータを持つ<Obsolete()>タグが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

プライマリチャネルと追加チャネルがある場所に問題がある場合は、最初に述べたオプションが完璧です。 –

関連する問題