लेकिन अपने ग्राहक के सॉफ़्टवेयर को क्रैश करना अभी भी अच्छी बात नहीं है
यह निश्चित रूप से एक अच्छी बात है।
आप ऐसा कुछ भी चाहते हैं जो सिस्टम को रोकने के लिए अपरिभाषित स्थिति में छोड़ दे क्योंकि एक अपरिभाषित प्रणाली भ्रष्ट डेटा, हार्ड ड्राइव को प्रारूपित करने, और राष्ट्रपति को धमकी भरे ईमेल भेजने जैसे काम कर सकती है। यदि आप पुनर्प्राप्त नहीं कर सकते हैं और सिस्टम को एक परिभाषित स्थिति में वापस रख सकते हैं तो दुर्घटनाग्रस्त होना जिम्मेदार बात है। यह ठीक है कि हम ऐसे सिस्टम का निर्माण करते हैं जो चुपचाप खुद को अलग करने के बजाय क्रैश करते हैं। अब निश्चित रूप से, हम सभी एक स्थिर प्रणाली चाहते हैं जो कभी भी दुर्घटनाग्रस्त न हो लेकिन हम वास्तव में केवल यह चाहते हैं कि जब सिस्टम एक परिभाषित पूर्वानुमान योग्य सुरक्षित स्थिति में रहता है।
मैंने सुना है कि नियंत्रण प्रवाह के रूप में अपवादों को एक गंभीर एंटीपैटर्न माना जाता है
यह बिल्कुल सच है लेकिन यह अक्सर गलत समझा जाता है। जब उन्होंने अपवाद प्रणाली का आविष्कार किया तो वे डर गए कि वे संरचित प्रोग्रामिंग को तोड़ रहे हैं। संरचित प्रोग्रामिंग कारण है कि हम है for
, while
, until
, break
, और continue
जब हम सभी की जरूरत है, यह सब करने के लिए, है goto
।
दिज्क्स्त्र ने हमें सिखाया कि गोटो का अनौपचारिक रूप से उपयोग करना (अर्थात, आप जहां चाहें कूदते हैं) रीडिंग कोड को एक बुरा सपना बनाते हैं। जब उन्होंने हमें अपवाद प्रणाली दी तो वे डर गए कि वे गोटो को फिर से पा रहे हैं। इसलिए उन्होंने हमसे कहा कि हम इसे "फ्लो कंट्रोल के लिए इस्तेमाल करें" उम्मीद करते हैं कि हम समझ पाएंगे। दुर्भाग्य से, हम में से कई नहीं थे।
अजीब बात है, हम अक्सर स्पेगेटी कोड बनाने के लिए अपवादों का दुरुपयोग नहीं करते हैं जैसा कि हम गोटो के साथ करते थे। सलाह से लगता है कि इससे और परेशानी हुई होगी।
मौलिक रूप से अपवाद एक धारणा को खारिज करने के बारे में हैं। जब आप पूछते हैं कि किसी फ़ाइल को सहेजा जाए तो आप मान लेते हैं कि फ़ाइल को सहेजा जा सकता है। अपवाद जब आपको मिलता है तो यह नाम अवैध होने के बारे में नहीं हो सकता है, HD भरा हुआ है, या क्योंकि एक चूहे ने अपने डेटा केबल के माध्यम से पकड़ लिया है। आप उन सभी त्रुटियों को अलग-अलग तरीके से संभाल सकते हैं, आप उन सभी को उसी तरह से संभाल सकते हैं, या आप उन्हें सिस्टम को रोक सकते हैं। आपके कोड में एक खुशी का रास्ता है जहाँ आपकी मान्यताओं को सही होना चाहिए। एक रास्ता या कोई अन्य अपवाद आपको उस खुशहाल रास्ते से दूर ले जाता है। सख्ती से बोलना, हाँ, यह "प्रवाह नियंत्रण" का एक प्रकार है, लेकिन यह वह नहीं है जो वे आपको चेतावनी दे रहे थे। वे इस तरह बकवास कर रहे थे :
"अपवाद असाधारण होना चाहिए"। इस छोटे से विज्ञान का जन्म हुआ क्योंकि अपवाद प्रणाली डिजाइनरों को स्टैक निशान के निर्माण के लिए समय की आवश्यकता होती है। कूदने की तुलना में, यह धीमा है। यह CPU समय खाती है। लेकिन यदि आप सिस्टम को लॉग इन करने या रोकने के बारे में हैं या अगले एक को शुरू करने से पहले मौजूदा समय गहन प्रसंस्करण को रोकते हैं तो आपके पास मारने के लिए कुछ समय है। यदि लोग "फ़्लो कंट्रोल के लिए" अपवादों का उपयोग करना शुरू करते हैं, तो समय के बारे में जो धारणाएँ हैं, वे सभी खिड़की से बाहर चली जाती हैं। इसलिए "अपवाद असाधारण होना चाहिए" वास्तव में हमें एक प्रदर्शन विचार के रूप में दिया गया था।
उससे कहीं अधिक महत्वपूर्ण है जो हमें भ्रमित नहीं कर रहा है। उपरोक्त कोड में अनंत लूप को स्पॉट करने में आपको कितना समय लगा?
त्रुटि कोड वापस न करें ।
... ठीक सलाह है जब आप एक कोड आधार में होते हैं जो आमतौर पर त्रुटि कोड का उपयोग नहीं करता है। क्यों? क्योंकि रिटर्न वैल्यू को बचाने और अपने त्रुटि कोड की जांच करने के लिए किसी को याद नहीं है। जब आप C में हैं तब भी यह एक अच्छा सम्मेलन है।
OneOf
आप अभी तक एक और सम्मेलन का उपयोग कर रहे हैं। यह तब तक ठीक है जब तक आप कन्वेंशन सेट कर रहे हैं और केवल एक दूसरे से नहीं लड़ रहे हैं। यह एक ही कोड बेस में दो त्रुटि सम्मेलनों को भ्रमित करने वाला है। अगर किसी तरह से आप सभी कोड से छुटकारा पा चुके हैं जो अन्य सम्मेलन का उपयोग करता है तो आगे बढ़ें।
मुझे स्वयं सम्मेलन पसंद है। इसका एक सबसे अच्छा स्पष्टीकरण मुझे यहाँ मिला * :
लेकिन जितना मुझे यह पसंद है मैं अभी भी इसे अन्य सम्मेलनों के साथ मिश्रण नहीं करने जा रहा हूं। एक उठाओ और इसके साथ रहना। 1
1: जिससे मेरा मतलब है कि मुझे एक ही समय में एक से अधिक सम्मेलनों के बारे में नहीं सोचना चाहिए।
इसके बाद के विचार:
इस चर्चा से जो मैं वर्तमान में ले रहा हूं वह इस प्रकार है:
- यदि आप तत्काल कॉलर को सबसे अधिक अपवाद को पकड़ने और संभालने की उम्मीद करते हैं और अपना काम जारी रखते हैं, तो शायद दूसरे रास्ते से, यह संभवतः रिटर्न प्रकार का हिस्सा होना चाहिए। वैकल्पिक या वनऑफ यहां उपयोगी हो सकता है।
- यदि आप तत्काल कॉलर से अपेक्षा करते हैं कि वह अधिकांश समय अपवाद को न पकड़े, तो अपवाद को फेंक दें, मैन्युअल रूप से स्टैक को पास करने की शिथिलता को बचाने के लिए।
- यदि आप सुनिश्चित नहीं हैं कि तत्काल कॉलर क्या करने जा रहा है, तो शायद दोनों प्रदान करें, जैसे कि Parse और TryParse।
यह वास्तव में यह सरल नहीं है। मूलभूत बातों में से एक जो आपको समझने की जरूरत है वह है शून्य।
मई में कितने दिन बचे हैं? 0 (क्योंकि यह मई नहीं है। यह पहले से ही जून है)।
अपवाद एक धारणा को अस्वीकार करने का एक तरीका है लेकिन वे एकमात्र तरीका नहीं हैं। यदि आप अपवादों का उपयोग करते हैं तो इस धारणा को अस्वीकार करने के लिए कि आप खुशहाल रास्ता छोड़ते हैं। लेकिन अगर आपने खुशी के रास्ते को भेजने के लिए मूल्यों को चुना है जो संकेत देता है कि चीजें उतनी सरल नहीं हैं जितनी कि मान ली गई थीं तो आप उस रास्ते पर इतने लंबे समय तक रह सकते हैं जब तक कि यह उन मूल्यों से निपट सकता है। कभी-कभी 0 का उपयोग पहले से ही कुछ करने के लिए किया जाता है ताकि आपको अपने विचार को खारिज करने के लिए एक और मान प्राप्त करना पड़े। आप इस विचार को अच्छे पुराने बीजगणित में इसके उपयोग से पहचान सकते हैं । मोनाड्स इसमें मदद कर सकते हैं, लेकिन यह हमेशा एक सनक नहीं है।
उदाहरण के लिए 2 :
IList<int> ParseAllTheInts(String s) { ... }
क्या आप किसी भी अच्छे कारण के बारे में सोच सकते हैं जिसे इस तरह से डिज़ाइन किया जाना चाहिए ताकि यह जानबूझकर कभी भी कुछ भी फेंक सके? लगता है कि जब कोई int पार्स नहीं किया जा सकता है तो आपको क्या मिलेगा? मुझे आपको बताने की जरूरत नहीं है।
यह एक अच्छे नाम का संकेत है। क्षमा करें, लेकिन TryParse एक अच्छे नाम का मेरा विचार नहीं है।
जब उत्तर एक ही समय में एक से अधिक चीजों का हो सकता है, तो हम अक्सर अपवाद को फेंकने से बचते हैं, लेकिन किसी कारण से यदि उत्तर एक ही चीज है या कुछ भी नहीं जो हम इस बात पर जोर देते हैं कि यह हमें एक चीज या फेंक देता है:
IList<Point> Intersection(Line a, Line b) { ... }
क्या समानांतर रेखाओं को वास्तव में यहां अपवाद की आवश्यकता है? क्या यह वास्तव में बुरा है कि अगर इस सूची में एक से अधिक बिंदु नहीं होंगे?
हो सकता है कि शब्दशः आप इसे नहीं ले सकते। यदि हां, तो यह एक दया है। लेकिन शायद मोनाड्स, कि एक मनमाना आकार की तरह List
नहीं है, आपको इसके बारे में बेहतर महसूस कराएगा ।
Maybe<Point> Intersection(Line a, Line b) { ... }
मोनाड्स कुछ विशेष प्रयोजन संग्रह हैं, जिनका उपयोग विशिष्ट तरीकों से किया जाता है जो उन्हें परीक्षण करने की आवश्यकता से बचते हैं। हम चाहे जो भी हों, उनसे निपटने के तरीके खोजने चाहिए। इस तरह से खुशहाल राह आसान हो जाती है। यदि आप खुले में दरार करते हैं और आपके द्वारा स्पर्श किए गए प्रत्येक मोनाड का परीक्षण करते हैं तो आप उनका गलत उपयोग कर रहे हैं।
मुझे पता है, यह अजीब है। लेकिन यह एक नया उपकरण है (ठीक है, हमारे लिए)। इसलिए इसे थोड़ा समय दें। जब आप शिकंजा पर उनका उपयोग करना बंद कर देते हैं, तो हथौड़े अधिक मायने रखते हैं।
यदि आप मुझे लिप्त करेंगे, तो मैं इस टिप्पणी को संबोधित करना चाहूंगा:
कैसे आया कोई भी उत्तर स्पष्ट नहीं करता है कि या तो एक त्रुटि कोड नहीं है, और न ही OneOf है? वे मौलिक रूप से अलग हैं, और परिणामस्वरूप प्रश्न गलतफहमी पर आधारित लगता है। (हालांकि संशोधित रूप में यह अभी भी एक वैध प्रश्न है।) - कोनराड रूडोल्फ जून 4 `18 14:08 पर
यह बिल्कुल सच है। अपवाद, झंडे या त्रुटि कोड की तुलना में मोनाड संग्रह के बहुत करीब हैं। वे ऐसी चीजों के लिए ठीक कंटेनर बनाते हैं जब बुद्धिमानी से उपयोग किया जाता है।
Result
;-) का प्रयोग करें