मुझे लगता है कि सभी जवाब जो बताते हैं कि आपके पास ऐसा झंडा नहीं होना चाहिए जो यह नियंत्रित करे कि कोई अपवाद फेंका गया है या नहीं। उनकी सलाह किसी को भी मेरी सलाह होगी जो उस सवाल को पूछने की आवश्यकता महसूस करता है।
हालांकि, मैं यह बताना चाहता हूं कि इस नियम का एक सार्थक अपवाद है। एक बार जब आप एपीआई विकसित करना शुरू करने के लिए पर्याप्त उन्नत हो जाते हैं जो सैकड़ों अन्य लोग उपयोग करेंगे, तो ऐसे मामले हैं जहां आप ऐसा झंडा प्रदान करना चाहते हैं। जब आप एक एपीआई लिख रहे हैं, तो आप केवल शुद्धतावादियों को नहीं लिख रहे हैं। आप वास्तविक ग्राहकों को लिख रहे हैं जिनकी वास्तविक इच्छाएं हैं। आपकी नौकरी का एक हिस्सा उन्हें आपके एपीआई से खुश करना है। यह एक प्रोग्रामिंग समस्या के बजाय एक सामाजिक समस्या बन जाती है, और कभी-कभी सामाजिक समस्याएं समाधानों को निर्देशित करती हैं जो अपने आप प्रोग्रामिंग समाधानों के रूप में आदर्श से कम होगी।
आप पा सकते हैं कि आपके पास अपने एपीआई के दो अलग-अलग उपयोगकर्ता हैं, जिनमें से एक अपवाद चाहता है और एक ऐसा नहीं है। एक वास्तविक जीवन उदाहरण जहां यह हो सकता है एक पुस्तकालय के साथ है जिसका उपयोग विकास और एम्बेडेड सिस्टम दोनों में किया जाता है। विकास के वातावरण में, उपयोगकर्ताओं को हर जगह अपवाद होने की संभावना होगी। अप्रत्याशित परिस्थितियों से निपटने के लिए अपवाद बहुत लोकप्रिय हैं। हालाँकि, उन्हें कई एम्बेडेड स्थितियों में निषिद्ध किया जाता है क्योंकि वे वास्तविक समय की बाधाओं का विश्लेषण करने में बहुत कठिन होते हैं। जब आप वास्तव में न केवल आपके कार्य को निष्पादित करने में लगने वाले औसत समय के बारे में परवाह करते हैं, बल्कि किसी एक व्यक्ति के मज़े के लिए समय लगता है, तो किसी भी मनमाने स्थान पर स्टैक को खोलने का विचार बहुत अवांछनीय है।
मेरे लिए एक वास्तविक जीवन उदाहरण: एक गणित पुस्तकालय। यदि आपकी गणित लाइब्रेरी में एक Vector
वर्ग है जो एक ही दिशा में एक इकाई वेक्टर प्राप्त करने का समर्थन करता है, तो आपको परिमाण द्वारा विभाजित करने में सक्षम होना चाहिए। यदि परिमाण 0 है, तो आपके पास शून्य स्थिति से विभाजित है। विकास में आप इन्हें पकड़ना चाहते हैं । आप वास्तव में 0 के आसपास घूमते हुए आश्चर्यजनक विभाजन नहीं चाहते हैं। एक अपवाद फेंकना इसके लिए एक बहुत लोकप्रिय समाधान है। यह लगभग कभी नहीं होता है (यह वास्तव में असाधारण व्यवहार है), लेकिन जब यह होता है, तो आप इसे जानना चाहते हैं।
एम्बेडेड प्लेटफॉर्म पर, आप उन अपवादों को नहीं चाहते हैं। यह एक चेक करने के लिए और अधिक समझ में आता है if (this->mag() == 0) return Vector(0, 0, 0);
। वास्तव में, मैं इसे वास्तविक कोड में देखता हूं।
अब किसी व्यवसाय के दृष्टिकोण से सोचें। आप API का उपयोग करने के दो अलग-अलग तरीके सिखाने की कोशिश कर सकते हैं:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
यह यहां के अधिकांश उत्तरों की राय को संतुष्ट करता है, लेकिन कंपनी के दृष्टिकोण से यह अवांछनीय है। एंबेडेड डेवलपर्स को कोडिंग की एक शैली को सीखना होगा , और विकास डेवलपर्स को एक और सीखना होगा। यह बल्कि अजीब हो सकता है, और लोगों को सोचने के एक तरीके में मजबूर करता है। संभावित रूप से बदतर: आप यह साबित करने के बारे में कैसे जाते हैं कि एम्बेडेड संस्करण में कोई अपवाद फेंकने वाला कोड शामिल नहीं है? फेंकने वाला संस्करण आसानी से मिश्रण कर सकता है, अपने कोड में कहीं छिपा सकता है जब तक कि एक महंगा विफलता समीक्षा बोर्ड इसे नहीं पाता।
यदि, दूसरी ओर, आपके पास एक ध्वज है, जो अपवाद हैंडलिंग को चालू या बंद करता है, तो दोनों समूह कोडिंग की सटीक एक ही शैली सीख सकते हैं। वास्तव में, कई मामलों में, आप दूसरे समूह की परियोजनाओं में एक समूह के कोड का भी उपयोग कर सकते हैं। इस कोड का उपयोग करने के मामले में unit()
, यदि आप वास्तव में इस बात की परवाह करते हैं कि 0 मामले से विभाजित में क्या होता है, तो आपको परीक्षण स्वयं लिखना चाहिए। इस प्रकार, यदि आप इसे एक एम्बेडेड सिस्टम में स्थानांतरित करते हैं, जहां आपको सिर्फ बुरे परिणाम मिलते हैं, तो वह व्यवहार "समझदार" है। अब, एक व्यावसायिक दृष्टिकोण से, मैं अपने कोडर्स को एक बार प्रशिक्षित करता हूं, और वे मेरे व्यापार के सभी हिस्सों में समान एपीआई और समान शैलियों का उपयोग करते हैं।
अधिकांश मामलों में, आप दूसरों की सलाह का पालन करना चाहते हैं: tryGetUnit()
ऐसे कार्यों के लिए मुहावरों का उपयोग करें या समान हैं जो अपवादों को नहीं फेंकते हैं, और इसके बजाय नल की तरह एक भावुक मान लौटाते हैं। अगर आपको लगता है कि उपयोगकर्ता एकल प्रोग्राम के भीतर अपवाद अपवाद हैंडलिंग और गैर-अपवाद हैंडलिंग कोड का उपयोग करना चाहते हैं, तो tryGetUnit()
संकेतन के साथ चिपके रहें । हालांकि, एक कोने का मामला है जहां व्यापार की वास्तविकता एक ध्वज का उपयोग करना बेहतर बना सकती है। यदि आप अपने आप को उस कोने के मामले में पाते हैं, तो रास्ते से "नियमों" को उछालने से डरो मत। यही नियम हैं!