प्रश्न 1:
क्या यह नए स्ट्रीमराइडर (फ़ाइलनाम) को वापस करने के कारण है; लूप के लिए अंदर? या तथ्य यह है कि आपको इस मामले में लूप की आवश्यकता नहीं है?
स्ट्रीमरडर का इससे कोई लेना-देना नहीं है। foreach
और के बीच मंशा के स्पष्ट संघर्ष के कारण प्रतिमान-विरोधी उभर कर आता है if
:
का उद्देश्य क्या है foreach
?
मुझे लगता है कि आपका उत्तर कुछ इस तरह होगा: "मैं बार-बार किसी विशेष कोड को निष्पादित करना चाहता हूं"
आप कितनी फाइलें प्रोसेस करने की उम्मीद कर रहे हैं?
चूँकि आप किसी विशेष फ़ोल्डर में केवल एक विशिष्ट फ़ाइल नाम (एक्सटेंशन सहित) रख सकते हैं, यह साबित करता है कि आपका कोड एक लागू फ़ाइल खोजने के लिए है ।
यह इस तथ्य से भी पुष्टि की जाती है कि आप तुरंत एक मूल्य लौटा रहे हैं। आप वास्तव में दूसरे मैच के बारे में परवाह नहीं करते हैं, भले ही यह मौजूद हो।
ऐसी परिस्थितियां हैं जहां यह एक विरोधी पैटर्न नहीं है।
- यदि आप उपनिर्देशिका (
Directory.GetFiles(".", SearchOption.AllDirectories)
) में भी देखते हैं , तो एक ही फ़ाइल नाम के साथ एक से अधिक फ़ाइल ढूंढना संभव है (विस्तार सहित)
- यदि आप आंशिक फ़ाइल नाम से मेल खाते हैं (उदाहरण के लिए हर फ़ाइल जिसका नाम शुरू होता है
"Test_"
, या हर "*.zip"
फ़ाइल।
ध्यान दें कि इन दोनों मामलों के लिए आपको वास्तव में कई मैचों की प्रक्रिया करने की आवश्यकता होगी और इसलिए तुरंत मूल्य वापस नहीं करना चाहिए।
प्रश्न 2:
दूसरा उदाहरण तय करने के लिए, क्या आप इसे बिना स्टेटमेंट के फिर से लिख सकते हैं, और इसके बजाय स्ट्रीम-राइडर को एक ट्राइ-कैच ब्लॉक के साथ घेर लें, और अगर यह फाइलनॉटफाउंड एक्ससेप्शन फेंकता है तो आप इसे उसी के अनुसार कैच ब्लॉक में हैंडल करते हैं?
अपवाद महंगे हैं। उनका उपयोग उचित प्रवाह तर्क के बदले कभी नहीं किया जाना चाहिए। अपवाद हैं, क्योंकि उनका नाम असाधारण परिस्थितियों का सुझाव देता है।
यही वजह है कि आप को दूर नहीं करना चाहिए if
।
SoftwareEngineering.SE पर इस उत्तर के अनुसार :
आमतौर पर, नियंत्रण प्रवाह के अपवादों का उपयोग एक विरोधी पैटर्न है, जिसमें उल्लेखनीय स्थिति है- और भाषा-विशिष्ट खांसी अपवाद खांसी।
क्यों, आम तौर पर, इसके लिए एक त्वरित सारांश के रूप में, यह एक विरोधी पैटर्न है:
- अपवाद, संक्षेप में, परिष्कृत गोटो बयान हैं
- अपवादों के साथ प्रोग्रामिंग करना, इसलिए, कोड को पढ़ना और समझना अधिक कठिन हो जाता है
- अधिकांश भाषाओं में मौजूदा नियंत्रण संरचनाएं हैं जो अपवादों के उपयोग के बिना आपकी समस्याओं को हल करने के लिए डिज़ाइन की गई हैं
- दक्षता के लिए तर्क आधुनिक संकलक के लिए मूट होते हैं, जो इस धारणा के साथ अनुकूलन करते हैं कि नियंत्रण प्रवाह के लिए अपवाद का उपयोग नहीं किया जाता है।
अधिक जानकारी के लिए वार्ड की विकि पर चर्चा पढ़ें ।
क्या आपको इसे एक कोशिश / पकड़ में लपेटने की आवश्यकता है, आपकी स्थिति पर अत्यधिक निर्भर है:
- यह कैसे संभव है कि आप एक दौड़ की स्थिति का सामना करने जा रहे हैं?
- क्या आप वास्तव में इस स्थिति को संभालने में सक्षम हैं, या क्या आप चाहते हैं कि यह समस्या उपयोगकर्ता तक पहुंचे क्योंकि आप नहीं जानते कि इसे कैसे संभालना है।
कुछ भी कभी भी "हमेशा इसका उपयोग" करने की बात नहीं है। मेरी बात साबित करने के लिए:
अलग-अलग अध्ययनों ने साबित किया है कि जब आप सुरक्षा हेलमेट, सुरक्षा चश्मे और बुलेटप्रूफ वेस्ट पहनते हैं तो आपको चोट लगने की संभावना कम होती है।
तो हम सभी इस सुरक्षा उपकरण को हर समय क्यों नहीं पहन रहे हैं?
इसका सरल उत्तर यह है क्योंकि इन्हें पहनने में कमियां हैं:
- इसमें पैसा खर्च होता है
- यह आपके आंदोलन को अधिक बोझिल बनाता है
- इसे पहनना काफी गर्म हो सकता है।
अब हम कहीं जा रहे हैं: समर्थक और विपक्ष हैं । दूसरे शब्दों में, यह केवल मामलों में इस उपकरण पहनने के लिए जहां समर्थक की समझ में आता है पल्ला झुकना विपक्ष।
- निर्माण श्रमिकों को अपनी नौकरी के दौरान चोट लगने की संभावना अधिक होती है। वे एक सुरक्षा हेलमेट से लाभान्वित होते हैं।
- दूसरी ओर, कार्यालय के कर्मचारियों के घायल होने की बहुत कम संभावना है। सुरक्षा हेलमेट इसके लायक नहीं हैं।
- एक कार्यालय कर्मचारी की तुलना में एक स्वाट टीम के सदस्य को गोली मारने की अधिक संभावना है।
क्या आपको कॉल को एक कोशिश / पकड़ में लपेटना चाहिए? यह बहुत कुछ इस बात पर निर्भर करता है कि क्या ऐसा करने के फायदे इसे लागू करने की लागत को बढ़ाते हैं।
ध्यान दें कि दूसरों का तर्क हो सकता है कि इसे लपेटने के लिए केवल कुछ कीस्ट्रोक्स लगते हैं, इसलिए यह स्पष्ट रूप से किया जाना चाहिए। लेकिन यह पूरा तर्क नहीं है:
- आपको यह तय करने की आवश्यकता है कि अपवाद को पकड़ने के बाद आपको क्या करना है।
- यदि कोडबेस में विभिन्न फ़ाइलों के लिए बहुत सारी अलग-अलग कॉल हैं, तो कोशिश / कैच में एक को लपेटने का निर्णय लेने का आमतौर पर मतलब होगा कि आपको इन सभी मामलों को लपेटना होगा । इसे लागू करने के लिए आवश्यक प्रयास की मात्रा पर इसका नाटकीय प्रभाव हो सकता है।
- यह पूरी तरह से संभव है कि आप जानबूझकर एक अपवाद को संभालना नहीं चाहते हैं।
- ध्यान दें कि आपके आवेदन को कुछ बिंदु पर अपवाद को संभालना होगा , लेकिन अपवाद के तुरंत बाद जरूरी नहीं है।
तो चुनाव आपका है। क्या ऐसा करने का कोई लाभ है? क्या आपको लगता है कि यह एप्लिकेशन को बेहतर बनाता है, इसे लागू करने के प्रयास से कहीं अधिक?
अद्यतन - एक टिप्पणी से मैंने दूसरे उत्तर पर लिखा, क्योंकि मुझे लगता है कि यह आपके लिए भी एक प्रासंगिक विचार है:
यह आसपास के संदर्भ पर बहुत टिका है।
- यदि स्ट्रीमरडर के उद्घाटन से पहले है
if(!File.Exists) File.Create()
, तो स्ट्रीमरडर को खोलने पर फ़ाइल की अनुपस्थिति वास्तव में असाधारण है ।
- यदि फ़ाइल नाम मौजूदा फ़ाइलों की सूची से चुना गया था, तो इसकी अचानक अनुपस्थिति फिर से असाधारण है ।
- यदि आप एक स्ट्रिंग के साथ काम कर रहे हैं जिसे आपने वास्तव में निर्देशिका के खिलाफ परीक्षण नहीं किया है; तब फ़ाइल की अनुपस्थिति एक पूरी तरह से तार्किक परिणाम है, और इसलिए असाधारण नहीं है ।