परिसर
भाषा या इच्छित कार्यक्षमता की परवाह किए बिना, निम्नलिखित कोड को बुरा रूप माना जाना चाहिए:
while( true ) {
}
तर्क का समर्थन करना
while( true )
पाश, क्योंकि यह खराब फार्म है:
- थोड़ी देर के लूप के निहित अनुबंध को तोड़ता है।
- जबकि लूप घोषणा स्पष्ट रूप से एकमात्र निकास स्थिति बताती है।
- लागू होता है कि यह हमेशा के लिए बंद हो जाता है।
- लूप के भीतर कोड को समापन क्लॉज को समझने के लिए पढ़ा जाना चाहिए।
- लूप्स जो हमेशा दोहराते हैं, उपयोगकर्ता को प्रोग्राम के भीतर से प्रोग्राम को समाप्त करने से रोकते हैं।
- अक्षम है।
- "लूप" की जाँच सहित कई लूप टर्मिनेशन शर्तें हैं।
- कीड़ों से ग्रस्त है।
- आसानी से यह निर्धारित नहीं किया जा सकता है कि प्रत्येक पुनरावृत्ति के लिए कोड को कहां रखा जाएगा।
- अनावश्यक रूप से जटिल कोड की ओर जाता है।
- स्वचालित स्रोत कोड विश्लेषण।
- बग को खोजने के लिए, प्रोग्राम जटिलता विश्लेषण, सुरक्षा जांच, या स्वचालित रूप से कोड निष्पादन के बिना किसी अन्य स्रोत कोड व्यवहार को प्राप्त करना, प्रारंभिक ब्रेकिंग स्थिति निर्दिष्ट करना, एल्गोरिदम को उपयोगी आक्रमणकारियों को निर्धारित करने की अनुमति देता है, जिससे स्वचालित स्रोत कोड विश्लेषण मैट्रिक्स में सुधार होता है।
- अनंत छोरों।
- अगर हर कोई हमेशा
while(true)
उन छोरों के लिए उपयोग करता है जो अनंत नहीं हैं, तो हम संक्षिप्त रूप से संवाद करने की क्षमता खो देते हैं जब छोरों की वास्तव में कोई समाप्ति स्थिति नहीं होती है। (तर्क से, यह पहले से ही हो चुका है, इसलिए बिंदु मूट है।)
"जाओ" के लिए वैकल्पिक
निम्नलिखित कोड बेहतर रूप है:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
लाभ
कोई झंडा नहीं। नहीं goto
। कोई अपवाद नहीं। बदलने में आसान। पढ़ने में अासान। ठीक करना आसान है। इसके अतिरिक्त कोड:
- लूप से ही लूप के वर्कलोड के ज्ञान को अलग करता है।
- किसी को आसानी से कार्यक्षमता बढ़ाने के लिए कोड को बनाए रखने देता है।
- एक स्थान पर कई समाप्ति शर्तों को असाइन करने की अनुमति देता है।
- निष्पादित करने के लिए कोड से समाप्त समापन खंड को अलग करता है।
- परमाणु ऊर्जा संयंत्रों के लिए सुरक्षित है। ;-)
दूसरा बिंदु महत्वपूर्ण है। यह जानने के बिना कि कोड कैसे काम करता है, अगर कोई मुझे मुख्य लूप बनाने के लिए कहे तो अन्य थ्रेड्स (या प्रक्रियाओं) में कुछ सीपीयू समय है, दो समाधान दिमाग में आते हैं:
विकल्प 1
आसानी से ठहराव डालें:
while( isValidState() ) {
execute();
sleep();
}
विकल्प 2
ओवरराइड निष्पादित करें:
void execute() {
super->execute();
sleep();
}
यह कोड एक एम्बेडेड के साथ लूप की तुलना में सरल (इस प्रकार पढ़ने में आसान) है switch
। isValidState
विधि केवल यह निर्धारित करना चाहिए अगर पाश जारी रखना चाहिए। विधि के workhorse में निकाला जाना चाहिए execute
विधि है, जो उपवर्गों डिफ़ॉल्ट व्यवहार को ओवरराइड करने के लिए अनुमति देता है (एक मुश्किल काम एक एम्बेडेड का उपयोग कर switch
और goto
)।
पायथन उदाहरण
StackOverflow पर पोस्ट किए गए निम्न उत्तर (एक पायथन प्रश्न के विपरीत):
- हमेशा के लिए पाश।
- उपयोगकर्ता को अपनी पसंद का इनपुट देने के लिए कहें।
- यदि उपयोगकर्ता का इनपुट 'रीस्टार्ट' है, तो हमेशा के लिए लूपिंग जारी रखें।
- अन्यथा, लूप को हमेशा के लिए बंद कर दें।
- समाप्त।
कोड
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
बनाम:
- उपयोगकर्ता की पसंद को प्रारंभ करें।
- लूप जबकि उपयोगकर्ता की पसंद 'पुनरारंभ' शब्द है।
- उपयोगकर्ता को अपनी पसंद का इनपुट देने के लिए कहें।
- समाप्त।
कोड
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
यहां, while True
भ्रामक और अत्यधिक जटिल कोड के परिणामस्वरूप।