क्या कोड के ब्लॉक बनाने के लिए यह बुरा अभ्यास है?


12

C ++ में, क्या यह खराब अभ्यास कुछ फ़ंक्शन के अंदर कोड के ब्लॉक बनाता है, जैसे कि निम्नलिखित:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

ऐसा करने का बिंदु एक ही प्रकार की प्रक्रिया के लिए "परीक्षण" के एक ही चर नाम का उपयोग करना होगा। मेरी परियोजना में, मेरे पास कई चर हैं और मैं कई परीक्षण कर रहा हूं। मैं वास्तव में प्रत्येक परीक्षण के लिए अलग-अलग नामों के साथ नए चर बनाना नहीं चाहता, यह देखते हुए कि परीक्षण कैसे समान हैं।

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


19
अगर मैं इस कोड को रिवाइव कर रहा था, तो मैं आपको इनमें से प्रत्येक परीक्षण को अलग-अलग तरीकों से अलग-अलग करने के लिए कहूंगा ... परिणामस्वरूप आपको कोड ब्लॉक का उपयोग उन्हें अलग-अलग करने की आवश्यकता नहीं होगी।
शायद _Factor

1
@Maybe_Factor - मैं सहमत हूँ। अलग-अलग तरीकों का लाभ यह है कि आप प्रत्येक ब्लॉक को नाम दे सकते हैं, और अधिक पठनीय कोड प्रदान कर सकते हैं।
मौविसील

@mouviciel न केवल अधिक पठनीय कोड, बल्कि अधिक पठनीय परीक्षण रिपोर्ट!
है_Factor

@Maybe_Factor मैं असहमत हूं। चीजों को अलग-अलग कार्यों में ले जाने से उन्हें कार्यक्षमता के कम पुन: प्रयोज्य बिट्स की तरह बनाने का नकारात्मक प्रभाव पड़ता है। किसी फ़ंक्शन के लिए सभी तर्क को एक जगह पर रखना अच्छा है।
मील्स रुट

1
@ माइल्सआउट यह एक तार्किक फ़ंक्शन नहीं है, यह एक एकल परीक्षण फ़ंक्शन में सभी crammed फ़ंक्शन के लिए कई यूनिट परीक्षण है। सामान्य कोड में कोड बनाम फ़ंक्शन पूरी तरह से एक और चर्चा है।
है_Factor

जवाबों:


22

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

लेकिन अगर आप सब कुछ कर रहे हैं तो एक नाम है , तो मैं कहूंगा कि वे बुरे व्यवहार हैं। आम तौर पर बोल, निश्चित रूप से; विशेष परिस्थितियां लागू हो सकती हैं।

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

यदि एक मानव कोड लिख रहा है, जहां उन्हें एक ही फ़ंक्शन के भीतर नामों का पुन: उपयोग करने की आवश्यकता है, तो मैं कहूंगा कि उन ब्लॉकों को संभवतः अलग-अलग कार्य करने की आवश्यकता है। खासकर यदि उन नामों का उपयोग उन ब्लॉकों के भीतर विभिन्न प्रकार और / या अर्थ के साथ किया जा रहा है।


10

इस तरह से ब्लॉक बनाना बुरा काम नहीं है। यह है कि कैसे scopes काम करते हैं।

आमतौर पर RAII (रिसोर्स एक्विजिशन इनिशियलाइज़ेशन) का उपयोग करते समय ऐसा किया जाता है और जब विध्वंसक कॉल आते हैं तो आप इसे नियंत्रित करना चाहते हैं।

यदि यह लंबा हो जाता है, तो मैं उस कोड को अपने स्वयं के फ़ंक्शन पर ले जाने पर विचार करूंगा।

मेरी राय में इसका उपयोग चर नामों को रीसायकल करने के लिए करना एक अच्छा विचार नहीं है। लेकिन मैं देख सकता हूं कि यह कम मेमोरी वाले मामलों में उपयोगी है


स्थानीय चर नामों का पुन: उपयोग स्मृति उपयोग पर कोई प्रभाव नहीं पड़ता है।
केविन क्लाइन

1
क्या आपको नहीं लगता कि एक स्मार्ट ऑप्टिमाइज़र 2 चर के लिए 1 मेमोरी लोकेशन का उपयोग कर सकता है?
रॉबर्ट आंद्रेजुक

3
हाँ। लेकिन यह भी कर सकते हैं कि अगर वे एक ही दायरे में हैं, अगर उनके पास विध्वंसक नहीं हैं।
सेबस्टियन रेडल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.