2010-12-21 11 views
10

अत्यधिक अल्पकालिक वस्तुओं का उपयोग करते समय मुझे केवल एक विधि को कॉल करने की आवश्यकता है, मैं विधि कॉल को सीधे new पर श्रृंखलाबद्ध करने के इच्छुक हूं। इस का एक बहुत ही आम उदाहरण निम्नलिखित की तरह कुछ है:'नया ऑब्जेक्ट()। Foo() `का उपयोग न करने का कोई कारण नहीं है?

string noNewlines = new Regex("\\n+").Replace(" ", oldString); 

यहां मुद्दा यह है कि मैं Regex वस्तु की कोई आवश्यकता के बाद मैं एक प्रतिस्थापन किया है, और मैं इस व्यक्त करने के लिए सक्षम होना चाहते है एक लाइनर के रूप में। क्या इस मुहावरे के साथ कोई गैर-स्पष्ट समस्या है? मेरे कुछ सहकर्मियों ने इसके साथ असुविधा व्यक्त की है, लेकिन किसी भी चीज के बिना जो एक अच्छे कारण की तरह लग रहा था।

(मैं दोनों के रूप में सी # और जावा इस में चिह्नित किया है, के बाद से ऊपर मुहावरा आम है और दोनों भाषाओं में प्रयोग करने योग्य है।)

+4

केवल यही कारण है कि मैं ऐसा नहीं करूँगा यदि 'नया ऑब्जेक्ट()' लागू 'आईडीस्पोजेबल' है। स्पष्ट रूप से 'Regex' मुझे ठीक लग रहा है। – SwDevMan81

+0

@ SwDevMan81 - इसे एक उत्तर के रूप में रखना चाहिए था! – Reddog

+0

@Reddog - होना चाहिए :) – SwDevMan81

उत्तर

6

इस खास पैटर्न ठीक है - मैं इसे अपने आप अवसर पर इस्तेमाल करते हैं।

लेकिन मैं आपके उदाहरण में इस पैटर्न का उपयोग नहीं करता। दो वैकल्पिक दृष्टिकोण हैं जो बेहतर हैं।

बेहतर दृष्टिकोण: स्थिर विधि Regex.Replace(string,string,string) का उपयोग करें। new -स्टाइल सिंटैक्स के साथ अपने अर्थ को खराब करने का कोई कारण नहीं है जब एक स्थिर विधि उपलब्ध होती है जो वही काम करती है।

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

+0

किसी भी तरह मैंने इस तथ्य को अनदेखा किया कि एक स्थिर विधि है जो यह बहुत ही काम करती है। आपके दूसरे बिंदु के लिए, यह शायद ही कभी-कभी-कभी कहा जाता है, या फिर मैं * regex को सदस्य चर में स्थानांतरित कर दूंगा ताकि इसे बार-बार पुन: प्रयास करने से बचा जा सके। –

5

मुझे इसके साथ कुछ भी गलत नहीं दिख रहा है; मैं इसे अक्सर अपने आप करता हूं।

नियम का एकमात्र अपवाद डीबगिंग उद्देश्यों के लिए हो सकता है, कभी-कभी डीबगर में ऑब्जेक्ट की स्थिति को देखने में सक्षम होना आवश्यक होता है, जो इस तरह के एक लाइनर में मुश्किल हो सकता है।

+0

+1 अच्छा बिंदु__ – SwDevMan81

1

जब तक आप सुनिश्चित हों कि ऑब्जेक्ट की फिर से आवश्यकता नहीं है (या आप एक समान वस्तु के कई उदाहरण नहीं बना रहे हैं), तो इसमें कोई समस्या नहीं है।

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

1

मुझे लगता है कि ठीक है, और इसके विपरीत टिप्पणियों/कारणों का स्वागत करेंगे। जब वस्तु कम नहीं होती है (या अप्रबंधित संसाधनों का उपयोग करता है - यानी COM) तो यह अभ्यास आपको परेशानी में डाल सकता है।

2

यदि आपको बाद में ऑब्जेक्ट की आवश्यकता नहीं है, तो मुझे कोई समस्या नहीं दिखाई दे रही है - मैं इसे समय-समय पर भी करता हूं। हालांकि, यह स्पॉट करने में काफी मुश्किल हो सकता है, इसलिए यदि आपके सहकर्मी असुविधा व्यक्त कर रहे हैं, तो आपको इसे एक चर में रखना होगा ताकि टीम पर कोई कठोर भावना न हो। वास्तव में आपको चोट नहीं पहुंचाता है।

2

आपको सावधान रहना होगा जब आप IDisposable को लागू करने वाली वस्तुओं के तरीकों की श्रृंखला बना रहे हों। एक सिंगल लाइन चेन करना वास्तव में निपटान या {{} ब्लॉक का उपयोग करने के लिए कमरे नहीं छोड़ता है।

उदाहरण के लिए:

DialogResult result = New SomeCfgDialog(some_data).ShowDialog(); 

जिस पर निपटान कॉल करने के लिए कोई उदाहरण चर नहीं है।

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

0

एकमात्र संभावित समस्या जो मैं देख सकता था - अगर, किसी कारण से, नया रेगेक्स न्यूल था क्योंकि इसे सही ढंग से तत्काल नहीं किया गया था, तो आपको एक नल पॉइंटर अपवाद मिलेगा। हालांकि, मुझे अत्यधिक संदेह है कि चूंकि रेगेक्स हमेशा परिभाषित किया जाता है ...

+1

एक कन्स्ट्रक्टर विफल हो सकता है एकमात्र तरीका अपवाद फेंकना है, और यह निष्पादन में बाधा डालने के ऊपर ऊपर प्रचारित किया जाएगा। एक कन्स्ट्रक्टर * कभी वापस नहीं लौटाएगा। (कन्स्ट्रक्टर वास्तव में कुछ भी वापस नहीं लौटते हैं ...) – cdhowie

+1

'नया एक्स (...)' कभी भी 'शून्य' का मूल्यांकन नहीं कर सकता - यह एक अपवाद फेंक सकता है।हालांकि, आपके पास एक बिंदु है कि "जंजीर" अभिव्यक्ति में 'शून्य' * कहीं भी * (अन्य) एक कठोर-टू-एनपीई हो सकता है (जैसा कि स्टैक-ट्रेस केवल लाइन पर इंगित करता है, अपमानजनक नहीं अभिव्यक्ति): 'foo()। readnulls कभी()। bar() // aww, crum' –

1

समस्या पठनीयता है।

एक अलग लाइन पर "जंजीर" विधियों को रखना मेरी टीम के साथ पसंदीदा सम्मेलन प्रतीत होता है।

string noNewlines = new Regex("\\n+") 
          .Replace(" ", oldString); 
+0

+1 पठनीयता के लिए +1। –

1

इस शैली से बचने का एक कारण यह है कि आपके सहकर्मी किसी डीबग मोड में ऑब्जेक्ट का निरीक्षण करना चाहेंगे। यदि आप समान तत्कालता को जोड़ते हैं तो पठनीयता बहुत कम हो जाती है। उदाहरण के लिए:

String val = new Object1("Hello").doSomething(new Object2("interesting").withThis("input")); 

आम तौर पर मैंने आपके द्वारा वर्णित विशिष्ट उदाहरण के लिए एक स्थिर विधि का उपयोग करना पसंद करते हैं।

0

यदि आप उस ऑब्जेक्ट की परवाह नहीं करते हैं जिस पर आप विधि का आह्वान करते हैं, तो यह एक संकेत है कि विधि शायद स्थिर होनी चाहिए।

0

सी # में, मैं शायद ही विस्तार विधि regex रैप करने के लिए, लिखते हैं, ताकि मैं

string noNewlines = oldString.RemoveNewlines(); 

लिख सकता है विस्तार विधि लगेगा जैसे

using System.Text.RegularExpressions; 

namespace Extensions 
{ 
    static class SystemStringExtensions 
    { 
     public static string RemoveNewlines(this string inputString) 
     { 
      // replace newline characters with spaces 
      return Regex.Replace(inputString, "\\n+", " "); 
     } 
    } 
} 

कुछ मैं इतना लगता है अपने मूल उदाहरण से पढ़ने के लिए आसान है। यह भी काफी पुन: प्रयोज्य है, क्योंकि न्यूलाइन वर्णों को अलग करना अधिक आम गतिविधियों में से एक है।

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

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