2010-08-03 14 views
8

हम सी # 3.0 के साथ .NET 2.0 ढांचे का उपयोग करते हैं (मुझे लगता है कि यह सी # का अंतिम संस्करण है जो ढांचे के 2.0 संस्करण पर चल सकता है, अगर मैं गलत हूं तो मुझे सही करें)।पैरामीटर जांच का अच्छा तरीका?

क्या सी # में कुछ बनाया गया है जो इस प्रकार के पैरामीटर सत्यापन को अधिक सुविधाजनक बना सकता है?

public ConnectionSettings(string url, string username, string password, 
          bool checkPermissions) 
{ 
    if (username == null) { 
     throw new ArgumentNullException("username"); 
    } 

    if (password == null) { 
     throw new ArgumentNullException("password"); 
    } 

    if (String.IsNullOrEmpty(url)) { 
     throw new ArgumentException("Must not be null or empty, it was " + 
      (url == null ? url : "empty"), "url"); 
    } 

    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

पैरामीटर मान्यता उस तरह हमारी जनता के तरीकों में की खोजबीन करना एक आम पैटर्न और "लगभग बॉयलरप्लेट" कोड का एक बहुत में परिणाम हो जाता है।

यदि कुछ भी नहीं बनाया गया है। क्या कोई महान मुफ्त पुस्तकालय है जिसका हम उपयोग कर सकते हैं?

+0

मुझे लगता है कि एक अशक्त संदर्भ अपवाद से बचने के लिए बदल रहा है इस लाइन की जरूरत है? (url == null? Url: "खाली"), "url"); से (url == null? "Null": "खाली"), "url"); – w69rdy

+0

आप एक आस्पेक्ट ओरिएंटेड प्रोग्रामिंग टूल की तलाश में हैं। मुझे पता है कि वहाँ कुछ बाहर हैं, जो दृश्य स्टूडियो के साथ एकीकृत करते हैं और संकलन समय पर आपके असेंबली आईएल में कोड इंजेक्ट करते हैं। लेकिन मुझे लगता है कि आज सुबह मेरा Google काम नहीं कर रहा है। – Will

+0

आपको अधिकांश कार्यक्षमता प्रदान करने के लिए कुछ दृढ़ता विधियों को खारिज करने में सक्षम होना चाहिए, लेकिन मैं सहमत हूं, इसके लिए कुछ सिंथेटिक चीनी होना अच्छा लगेगा। मैं स्ट्रिंग के दो मामलों के लिए दो अलग-अलग अपवादों को फेंकने में विशेष रूप से बीमार हूं। INullOrEmpty – cristobalito

उत्तर

4

मैं सामान्य रूप से स्थिर सहायक तरीकों बनाने ...

जैसे

public static void CheckNotNull(object value, string parameterName) 
{ 
    if(value == null) { throw new ArgumentNullException(parameterName); } 
} 

मतलब है कि आप नीचे दिए गए कुछ चीज़ों के लिए अपना कोड डाउन कर सकते हैं और बस इसे थोड़ा सा बना देता है।

CheckNotNull(username, "username"); 
CheckNotNull(password, "password"); 

या आप एक विस्तार पद्धति के रूप में लपेट कर सकते हैं:

public static void CheckNotNull<T>(this T value, string parameterName) 
{ 
    if(value == null) { throw new ArgumentNullException(parameterName); } 
} 

और तरह का उपयोग करें:

username.CheckNotNull("username"); 
password.CheckNotNull("password"); 

और अगर तुम सच में फैंसी महसूस कर रहे हैं, तो आप शायद पूछताछ कर सकता है प्रतिबिंब का उपयोग कर पैरामीटर नाम। प्रतिबिंब थोड़ी धीमी है, इसलिए आप केवल यह करेंगे यदि आप अपवाद फेंकने जा रहे थे, लेकिन यह आपको हर समय शाब्दिक पैरामीटर नाम टाइप करने से बचाता है।

+0

अभी भी एक स्ट्रिंग में पैरामीटर नाम डालने की आवश्यकता है (जिसे आपने आसानी से छोड़ा है)। –

+0

बेन, वास्तव में यह एक गलती थी लेकिन डाउनवोट से पहले तय की गई थी। – Ian

+0

और अब मैं डाउनवोट को कम करता हूं जो मुझे लगता है कि आपने इसे ठीक कर दिया है। –

2

आप इसे अनुबंधों का उपयोग करके कर सकते हैं लेकिन यह वही अवधारणा है।

यह किसी भी तरह से अच्छा अभ्यास होना चाहिए, क्योंकि यह स्पष्ट रूप से दिखाता है कि सार्वजनिक विधि पर अनिवार्य फ़ील्ड क्या हैं।

2

यह नेट फ्रेमवर्क में निर्माण नहीं कर रहा है, लेकिन आप ऐसा करने का Fluent Argument Validation

3

Here's a nice fluent way उपयोग कर सकते हैं।

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

public static class Extensions 
{ 
     public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class 
     { 
       if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null"); 
     } 
} 

internal class Test 
{ 
     public Test(string input1) 
     { 
       input1.ThrowIfArgumentIsNull("input1"); 
     } 
} 
+0

Giorgi पहले से ही इस विधि का उल्लेख किया है। इसके अलावा ... आपके पास अभी भी उस पैरामीटर नाम के साथ उस बदसूरत स्ट्रिंग है। –

2

जियोर्गी द्वारा उल्लिखित धाराप्रवाह पैरामीटर सत्यापन के समान विचार, लेकिन यह पैरामीटर को अनावश्यक रूप से नामकरण से बचाता है, और तार जो कोड रीफैक्टरिंग टूल द्वारा स्वचालित रूप से अपडेट नहीं किए जा सकते हैं।

http://charlieflowers.wordpress.com/tag/parameter-validation/

4

आप Post Sharp की तरह एक इल बुनकर इस्तेमाल कर सकते हैं, मन में सी # 5 में एक सेवा के रूप कि संकलक रखने में बनाया गया सामान इस तरह का कर देगा।

व्यक्तिगत तौर पर मैं इस दृष्टिकोण जब तक की सिफारिश नहीं होगा समस्या बहुत बड़ी है और इसे सुलझाया जाना चाहिए। आमतौर पर ऊपर बताए गए कुछ आवेषण और जांच पूर्व शर्त एक सर्वोत्तम अभ्यास है।

ईजी:

public ConnectionSettings(
    [NotNullOrEmpty] string url, 
    [NotNull] string username, 
    [NotNull] string password, 
    bool checkPermissions) 
{ 
    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

तुम भी code contracts साथ सामान इस तरह का है कि आपकी कुछ अमीर स्थिर विश्लेषण करने के लिए अनुमति होगी एकीकृत कर सकते हैं।

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