C ++ में कीड़े से बचने के 10 तरीके

सी ++ में बग से बचने के 10 तरीके - डमीज

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

सभी चेतावनियों और त्रुटि संदेशों को सक्षम करें

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

हालांकि, जब C ++ एक संरचना में आता है जो इसे समझ सकता है लेकिन संरचना गड़बड़ कर देती है वैसे भी, सी ++ एक चेतावनी संदेश उत्पन्न करती है क्योंकि सी ++ बहुत ही पक्का यकीन है कि यह समझता है कि आप क्या चाहते हैं, यह आगे जाता है और एक निष्पादन योग्य फ़ाइल बनाता है ताकि आप चेतावनी को अनदेखा कर सकें यदि आप चाहें वास्तव में, यदि आप वास्तव में परेशान नहीं करना चाहते हैं, तो आप चेतावनियों को अक्षम कर सकते हैं।

चेतावनियों को अक्षम या अक्षम करना एक असाधारण बुरा विचार है। यह आपकी कार के डैशबोर्ड पर "चेक इंजन" लाइट को अनप्लग करने जैसा है क्योंकि यह आपको परेशान करता है इस समस्या को अनदेखा करने से वह दूर नहीं हो जाता।

एक स्पष्ट और सुसंगत कोडिंग शैली को अपनाना

एक स्पष्ट और सुसंगत शैली में अपना सी ++ कोड लिखना न केवल आपके कार्यक्रम की पठनीयता को बढ़ाता है, बल्कि यह भी कम कोडिंग गलतियों में परिणाम करता है मामलों की ये कुछ आश्चर्यजनक स्थिति इस तथ्य से उत्पन्न होती है कि हमारे दिमाग में केवल एक सीमित मात्रा में कंप्यूटिंग शक्ति है

जब आप कोड पढ़ते हैं जो साफ और साफ है और वह एक ऐसी शैली का अनुसरण करता है जिसे आप परिचित होते हैं, तो आप सी ++ स्टेटमेंट के सिंटैक्स को पार्स करने में बहुत कम मस्तिष्क की शक्ति बिताते हैं। यह कार्यक्रम को क्या करने की कोशिश कर रहा है, यह समझने के लिए अधिक मस्तिष्क सीपीयू शक्ति को छोड़ देता है और यह नहीं कि यह कैसा चल रहा है।

एक अच्छा कोडन शैली आपको आसानी से निम्नलिखित करता है:

  • वर्ग के नाम, ऑब्जेक्ट नाम और फ़ंक्शन के नाम के बीच अंतर करें

  • समझे कि वर्ग, फ़ंक्शन या ऑब्जेक्ट के लिए किस प्रकार उपयोग किया जाता है , उसके नाम के आधार पर

  • सी ++ प्रतीकों से पूर्वप्रक्रमक प्रतीकों का अंतर (यानी # परिभाषित ऑब्जेक्ट्स बाहर खड़े होने चाहिए)

  • समान स्तर पर सी ++ कोड के ब्लॉक पहचानें (यह लगातार इंडेंटेशन का नतीजा है)

में इसके अतिरिक्त, आपको अपने मॉड्यूल हेडर के लिए एक मानक प्रारूप स्थापित करने की आवश्यकता है जो प्रत्येक मॉड्यूल, लेखक, तिथि, संस्करण और संशोधन इतिहास के बारे में कुछ कार्यों या वर्गों के बारे में जानकारी प्रदान करता है।

एक ही परियोजना में शामिल सभी प्रोग्रामर एक ही कोडिंग शैली का उपयोग करना चाहिए विभिन्न कोडिंग शैलियों के एक चिथड़े में लिखा गया कार्यक्रम भ्रामक है और अव्यवसायिक दिखता है।

इसे लिखते समय कोड टिप्पणी करें

आप त्रुटियों से बच सकते हैं यदि आप अपने कोड को लिखते समय टिप्पणी करते हैं, जब तक कि सब कुछ काम न करें और फिर वापस जाएं और टिप्पणी जोड़ें

टिप्पणियां तैयार करने से आपको यह पता चलता है कि आप क्या करने की कोशिश कर रहे हैं। लघु टिप्पणियां, शिक्षाप्रद हैं, दोनों जब आप बाद में उन्हें पढ़ते हैं और आप उन्हें लिख रहे हैं। टिप्पणी लिखें जैसे कि आप दूसरे, जानकार प्रोग्रामर से बात कर रहे हैं।

कम-से-कम एक बार डीबगर में प्रत्येक चरण को एकल-चरण दें

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

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

अंत में, जब एक समारोह समाप्त हो गया है और कार्यक्रम में जोड़ा जा करने के लिए तैयार है, तो हर तार्किक पथ को कम से कम एक बार यात्रा की जानी चाहिए। बग बहुत आसान है जब आप फ़ंक्शन की जांच करते हैं, इसके बजाय इसे बाकी कार्यों के साथ बर्तन में फेंक दिया जाता है - तब तक आपका ध्यान नए प्रोग्रामिंग चुनौतियों पर चला गया है।

दृश्यता को सीमित करें

कक्षा के आंतरिकों की बाहरी दुनिया की दृश्यता को सीमित करना ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक आधारशिला है। कक्षा को अपने आंतरिक राज्य के लिए जिम्मेदार होना चाहिए - अगर कुछ कक्षा में खराब हो जाता है, तो यह कक्षा प्रोग्रामर की गलती है एप्लिकेशन प्रोग्रामर को समस्या को हल करने के बारे में चिंता करनी चाहिए।

विशेष रूप से, सीमित दृश्यता का मतलब है कि डेटा सदस्यों को कक्षा के बाहर सुलभ नहीं होना चाहिए - अर्थात, उन्हें संरक्षित के रूप में चिह्नित किया जाना चाहिए इसके अतिरिक्त, सदस्य कार्य करता है कि एप्लिकेशन सॉफ़्टवेयर के बारे में जानने की आवश्यकता नहीं है, इसे संरक्षित भी चिह्नित किया जाना चाहिए। नौकरी करने के लिए जरूरी से अधिक किसी भी अधिक श्रेणी के इंटर्नरों को बेनकाब न करें।

हेप मेमोरी का ट्रैक रखें

मैदान में जारी किए गए प्रोग्रामों में हीप मेमोरी का ट्रैक खोना कार्यक्रमों में घातक त्रुटियों का सबसे आम स्रोत है - और, साथ ही, ट्रैक करने और निकालने की सबसे कठिन समस्या (चूंकि इस वर्ग की त्रुटि इतनी मुश्किल है कि वे ढूंढें और निकाल दें, यह आपके द्वारा खरीदे जाने वाले कार्यक्रमों में प्रचलित हैं।) आपको समस्याएं शुरू होने से पहले एक प्रोग्राम चलाने के लिए हो सकता है (स्मृति रिसाव कितना बड़ा है इसके आधार पर)।

एक सामान्य नियम के रूप में, प्रोग्रामर को हमेशा ही "स्तर पर हेप मेमोरी आवंटित करना और जारी करना चाहिए। "यदि किसी सदस्य का मेल MyClass फ़ंक्शन करता है:: () को ढेर मेमोरी के एक ब्लॉक को आवंटित करता है और इसे कॉलर को देता है, तो एक सदस्य होना चाहिए MyClass:: रिलीज () जो इसे ढेर के पास देता हैविशेष रूप से, MyClass:: create () को स्मृति रिलीज करने के लिए मूल कार्य की आवश्यकता नहीं होनी चाहिए

अगर संभव हो, तो MyClass को ऐसे मेमोरी पॉइंटर्स का स्वयं का ट्रैक रखना चाहिए और उन्हें डिस्ट्रिक्ट में हटा देना चाहिए।

शून्य के संकेत दिए जाने के बाद वे क्या इंगित करते हैं

सुनिश्चित करें कि वे अब मान्य नहीं होने के बाद पॉइंटर्स शून्य करें; आप उन्हें मूल्य nullptr बताए द्वारा ऐसा करते हैं इस क्रिया के कारण अनुभव के साथ स्पष्ट हो जाते हैं: आप मेमोरी ब्लॉक का उपयोग करना जारी रख सकते हैं जिसे ढेर पर वापस कर दिया गया है और यह भी पता नहीं है। एक कार्यक्रम ठीक समय का 99 प्रतिशत चला सकता है, जिससे 1 प्रतिशत मामलों को ब्लॉक मिल जाता है जहां ब्लॉक को पुनर्वित्त किया जाता है और कार्यक्रम काम नहीं करता है।

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

त्रुटियों को संभालने के लिए अपवाद का उपयोग करें

सी ++ में अपवाद तंत्र आसानी से और कुशलता से त्रुटियों को संभालने के लिए डिज़ाइन किया गया है। सामान्य तौर पर, आपको त्रुटि संकेत वापस करने के बजाय त्रुटि संकेतक फेंकना चाहिए। परिणामस्वरूप कोड लिखना, पढ़ना और बनाए रखना आसान है। इसके अलावा, अन्य प्रोग्रामर यह उम्मीद करने आए हैं, और आप उन्हें निराश नहीं करना चाहते हैं, है ना?

असली त्रुटियों के अपवादों के आपके उपयोग को सीमित करें किसी फ़ंक्शन से एक अपवाद फेंकने के लिए आवश्यक नहीं है जो कि "काम नहीं करता" सूचक देता है यदि यह उस फ़ंक्शन के लिए रोजमर्रा की जिंदगी का एक हिस्सा है।

डेस्ट्रक्टर्स वर्चुअल घोषित करें

अगर आपकी कंट्रोलर संसाधनों का आवंटन करता है जैसे कि ढेर मेमोरी जिसे ऑब्जेक्ट अपने अंतिम मौत पर पहुंचने की ज़रूरत होती है, तो अपने वर्ग के लिए एक डिस्ट्रक्टर बनाने के लिए मत भूलना एक नाशक बनाया, इसे आभासी घोषित करने के लिए मत भूलना।

"लेकिन," आप कहते हैं, "मेरी कक्षा किसी चीज़ से वारिस नहीं करती है, और यह किसी अन्य वर्ग द्वारा उपवर्ग नहीं है "हाँ, लेकिन यह भविष्य में आधार वर्ग बन सकता है। जब तक आप नाशक आभासी घोषित करने के लिए कुछ अच्छे कारण नहीं हैं, तब ऐसा करते हैं जब आप पहली कक्षा बनाते हैं

एक कॉपी कन्स्ट्रक्टर और अतिभारित असाइनमेंट ऑपरेटर प्रदान करें

यदि आपके क्लास को एक डिस्ट्रक्टर की जरूरत है, तो यह निश्चित रूप से प्रतिलिपि कन्स्ट्रक्टर और ओवरलोडेड असाइनमेंट ऑपरेटर की आवश्यकता है। यदि आपका कन्स्ट्रक्टर हेप मेमोरी जैसी संसाधनों को आवंटित करता है, तो डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर कुछ भी नहीं करेगा, लेकिन एक ही संसाधनों के लिए कई पॉइंटर्स जेनरेट करके कहर पैदा करेगा।

जब इन वस्तुओं में से किसी एक के लिए डिस्ट्रक्टर लागू किया जाता है, तो यह संपत्ति को पुनर्स्थापित कर देगा जब अन्य प्रति के लिए नाशक के साथ आता है, यह चीजों को पेंच करेगा