2009-09-29 19 views
9

मुझे पठनीयता पसंद है।विस्तार के तरीके - IsNull और IsNotNull, अच्छा या बुरा उपयोग?

तो, मैं कुछ मिनट पहले (x =! Null) प्रकार वाक्यविन्यास के लिए एक विस्तार mothod के साथ आया, जिसे IsNotNull कहा जाता है। Inversly, मुझे भी एक IsNull विस्तार पद्धति बनाई गई है, इस प्रकार

if(x == null) becomes if(x.IsNull()) 

और

if(x != null) becomes if(x.IsNotNull()) 

हालांकि, मुझे चिंता मैं विस्तार तरीकों का दुरुपयोग कर सकता हूँ। क्या आपको लगता है कि यह विस्तार तरीकों का बुरा उपयोग है?

+0

इसके लिए जाओ यह यह किसी भी कम नहीं है http://stackoverflow.com/questions/790810/is-extending-string-class-with-isnullorempty-confusing – Vadim

+7

की तरह एक बहुत कुछ है, और यह है कोई स्पष्ट नहीं। –

+0

+1 पावेल - अच्छी तरह से डाल दिया। –

उत्तर

11

यह किसी भी अधिक पठनीय नहीं लगता है और कोड को पढ़ने के लोगों को भ्रमित कर सकता है, सोच किसी भी तर्क है कि वे में से अनजान हैं, हो, तो उन तरीकों।

मैंने एक PerformIfNotNull (Func विधि) (साथ ही एक ओवरलोड जो एक कार्रवाई करता है) का उपयोग किया है, जिसे मैं पूरे ब्लॉक को बदलने के लिए त्वरित लैम्ब्डा अभिव्यक्ति पास कर सकता हूं, लेकिन यदि आप जांच के अलावा कुछ भी नहीं कर रहे हैं शून्य के लिए ऐसा लगता है कि यह कुछ भी उपयोगी नहीं है।

2

यह करने के लिए पूरी तरह से मान्य है लेकिन मुझे नहीं लगता कि यह अविश्वसनीय रूप से उपयोगी है। चूंकि विस्तार विधियां केवल कंपाइलर चालबाजी हैं, इसलिए मैं उन्हें "दुर्व्यवहार" के किसी भी उपयोग को कॉल करने के लिए संघर्ष करता हूं क्योंकि वे किसी भी तरह से फ्लाफ हैं। जब वे पठनीयता को नुकसान पहुंचाते हैं तो मैं केवल विस्तार विधियों के बारे में शिकायत करता हूं।

2

मिसाल नहीं है, में के रूप में ज्यादा के रूप में स्ट्रिंग वर्ग IsNullOrEmpty है

+2

हां, लेकिन इसका ऑर्गेक्टी हिस्सा अतिरिक्त कार्यक्षमता प्रदान करता है, ऐसा लगता है कि यह किसी भी लाभ के लिए अधिक टाइपिंग जोड़ रहा है। – Davy8

+1

मुझे व्यक्तिगत रूप से IsNullOrEmpty पसंद है क्योंकि यह 'ol दो पक्षियों एक पत्थर दृष्टिकोण है। – CmdrTallen

+0

@ डेवी 8 - अच्छा बिंदु –

1

आप सीएलआर आंतरिक संचालन के लिए विधि कॉल ओवरहेड भी शुरू कर रहे हैं। जेआईटी इसे दूर कर सकता है, लेकिन ऐसा नहीं हो सकता है। यह सुनिश्चित करने के लिए एक माइक्रो-पर्फ नाइटपिक है, लेकिन मैं सहमत हूं कि यह विशेष रूप से उपयोगी नहीं है। जब कोई महत्वपूर्ण पठनीयता सुधार होता है, तो मैं इस तरह की चीजें करता हूं, या अगर मुझे कुछ अन्य व्यवहार चाहिए जैसे "एक ArgumentNullException फेंक दें और तर्क नाम पास करें" जो कि बार-बार इनलाइन करने के लिए गूंगा है।

0

यह समझ में आता है कि, उदाहरण के लिए, मान लीजिए कि जब भी एक्स शून्य है (बस विस्तार विधि में करें) तो आप अपवाद फेंकना चाहेंगे। हालांकि, मैं इस विशेष मामले में मेरी निजी वरीयता स्पष्ट रूप से जांचना है (एक शून्य वस्तु शून्य होना चाहिए :-))।

3

मुझे लगता है कि अविश्वसनीय रूप से उपयोगी नहीं मिल रहा है, लेकिन इस:

someString.IsNullOrBlank() // Tests if it is empty after Trimming, too 
someString.SafeTrim()   // Avoiding Exception if someString is null 

क्योंकि उन तरीकों वास्तव में कई चेकों क्या करने वाले से आप को बचाने के लिए। लेकिन एक विधि कॉल के साथ एक भी चेक की जगह मुझे बेकार लगता है।

+4

'string.IsNullOrWhiteSpace' .NET 4 (http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace(VS.100).aspx) में एक नई विधि है। –

+0

+1 यह बहुत अच्छा है! – Botz3000

0

पैटर्न का पालन करने के लिए यह एक विधि के बजाय एक संपत्ति होनी चाहिए (लेकिन निश्चित रूप से एक्सटेंशन के साथ काम नहीं करता है)।

सिस्टम में डेटा मान। डेटा नामस्थान में एक ISNull प्रॉपर्टी है जो यह निर्धारित करती है कि मान में DbNull मान है या नहीं।

डेटारो क्लास में एक IsNull विधि है, लेकिन यह निर्धारित नहीं करता है कि DataRow शून्य है, यह निर्धारित करता है कि डेटा पंक्ति में से किसी एक फ़ील्ड में DbNull मान होता है या नहीं।

1

इसके बजाय मैं की तरह कुछ के साथ जाना चाहते हैं:

static class Check { 
    public static T NotNull(T instance) { 
     ... assert logic 
     return instance; 
    } 
} 

तो इस तरह इसका इस्तेमाल:

Check.NotNull(x).SomeMethod(); 
y = Check.NotNull(x); 

व्यक्तिगत रूप से यह बहुत स्पष्ट क्या चतुर होना चाहिए और निम्न अनुमति देने के लिए की तुलना में चल रहा है है:

if(((Object)null).IsNull()) ... 
+0

मुझे लगता है कि यह संदिग्ध है, उपयोगकर्ता को याद रखना चाहिए कि Check.NotNull (x) एक ही प्रकार का उदाहरण लौटाएगा! मेरे लिए जब मैं कोड में Check.NotNull (x) पढ़ता हूं तो मुझे सच/गलत परिणाम प्राप्त होने की उम्मीद है। –

2

मैं इस तर्क से पूरी तरह सहमत नहीं हूं कि यह "भ्रमित हो सकता है"।

कुछ हद तक मैं देख सकता हूं कि क्या मतलब है, "सामान्य समझ" के बाहर उद्यम करने का कोई कारण नहीं है - हर कोई वस्तु को समझता है! = शून्य।

लेकिन विजुअल स्टूडियो में, हमारे पास अद्भुत टूल हैं जहां आप कुछ अतिरिक्त जानकारी प्रकट करने के लिए विधि पर होवर कर सकते हैं।

अगर हम कहें कि एक्सटेंशन-विधि को एक अच्छी व्याख्या के साथ एनोटेट किया गया था, तो मुझे लगता है कि भ्रम का तर्क अलग हो गया है।

विधियां ISNotNull() और IsNull() बिल्कुल बताएं कि वे क्या हैं। मुझे लगता है कि वे बहुत ही उचित और उपयोगी हैं।

सभी ईमानदारी में यह "आपको क्या पसंद है" का विषय है। यदि आपको लगता है कि विधियां आपके प्रोजेक्ट के संदर्भ में इसे और अधिक पठनीय बनाती हैं, तो इसके लिए जाएं। यदि आप अपनी परियोजना में सम्मेलन तोड़ रहे हैं, तो मैं विपरीत कहूंगा।

मेरे पास इस विषय पर समान विचार हैं और आपने मेरे काम के स्थान पर कई बहुत अनुभवी डेवलपर्स से पूछा है। और उनमें से कोई भी एक अच्छे कारण के साथ नहीं आया है (सिवाय इसके बारे में क्या बताया गया है - यहां पर) जो बताएगा कि आपको ऐसा क्यों नहीं करना चाहिए।

:-)

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