2012-10-09 9 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 

True का एक दूसरा पैरामीटर के साथ <Obsolete()> टैग संकलक कि उल्लेखनीय विधि का उपयोग करने आर चाहिए प्रयास कर सूचित एक संकलन त्रुटि में esult। चूंकि प्रश्न में विधि का उपयोग किया जाएगा, और जब केवल, किसी भी पैरामीटर के बिना विधि को आमंत्रित करने का प्रयास किया जाता है, तो यह केवल इस समय त्रुटि उत्पन्न करेगा। ध्यान दें कि विधि को Integer की शून्य-तत्व सरणी को पास करने के लिए प्रयास किए जाने पर विधि का उपयोग नहीं किया जाएगा; उस स्थिति में, सामान्य ParamArray फॉर्म का उपयोग किया जाएगा।

+0

वह चालाक है! –

+0

मुझे लगता है कि यह जवाब यह हो जाता है ... क्षमा करें @ मेटा-नाइट! मुझे यह पसंद है कि मैं कंपाइलर फीडबैक कैसे प्राप्त करता हूं और मुझे 'पैरामरे' के साथ एक ही आइटम को अपने तर्कों पर दोहराने के बजाय 'पैरामरे' पर फिर से शुरू करने में सक्षम होने के साथ उपयोग की सीधी-आगे आसानी मिलती है। –

+2

@ जेफब्रिडमैन: ध्यान दें कि यह कोड, अलग तर्क के साथ दृष्टिकोण के विपरीत, कोड को किसी भी सरणी में पास करने के लिए संभव बनाता है जिसमें पहले आइटम और शेष सरणी को पास करने के बजाय सभी पैरामीटर शामिल होते हैं; नतीजतन, जबकि यह एक खाली तर्क सूची के साथ आमंत्रण को अस्वीकार कर सकता है, यह समय खाली संकलन के साथ आमंत्रण को अस्वीकार नहीं कर सकता है। – 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

अच्छा जवाब! अगर मुझे कोई समस्या-डोमेन था जहां प्राथमिक चैनल और अतिरिक्त चैनल थे, तो आपके द्वारा उल्लिखित पहला विकल्प सही होगा! –

संबंधित मुद्दे