2008-10-28 28 views
12

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

तो डरावने जबकि (ट्रू) लूप को दोबारा करने के लिए आप किस तरह से आए हैं या देखा है?

संपादित करें: जैसा कि कुछ टिप्पणियों का उल्लेख किया गया है, मेरा इरादा इस सवाल के लिए एक "अनंत लूप" रिफैक्टरिंग होना था, जैसे कि विंडोज स्टाइल सेवा चलाना जहां केवल स्टॉप स्थितियां ऑनस्टॉप या घातक अपवाद होंगी।

+0

मुझे यह बेहतर कहा जाना चाहिए था, और ऐसा करने के लिए वापस जाने के बारे में सोचा था, लेकिन यह एक निरंतर सीखने की प्रक्रिया है, इसलिए मैंने सवाल छोड़ने का फैसला किया कि यह खुद को एक अनुस्मारक के रूप में है। :) –

+0

यदि आप (सच) करते समय "डर" करते हैं, तो आपको बहुत सरल एल्गोरिदम लिखना होगा।अधिकांश उन्नत एल्गोरिदम को कई निकास स्थितियों वाले लूप की आवश्यकता होती है। ऐसा करने का सबसे स्वाभाविक तरीका बाहरी अनंत लूप होना चाहिए और फिर लूप से बाहर निकलने वाली कई निकास स्थितियां हैं। फॉर-लूप या हालात का उपयोग करना सबसे अच्छा काम करता है जब आपके पास केवल एक ही बाहर निकलने की स्थिति होती है। हालांकि यह सबसे आम मामला है, यह शायद ही सार्वभौमिक स्थिति है। –

उत्तर

21

क्या हमें वास्तव में रिफैक्टर करने की आवश्यकता है जबकि (सत्य) loops? कभी-कभी यह कोडिंग मानक होता है और अधिकांश डेवलपर्स इस संरचना में उपयोग किए जाते हैं। अगर आपको इस कोड को दोबारा सुधारने के लिए कड़ी मेहनत करनी है, तो क्या आप वाकई इसे दोबारा समझना एक अच्छा विचार है?

गोटो कोडिंग मानकों में एक काला भेड़ का उपयोग किया जाता था। मैंने एल्गोरिदम से मुलाकात की है जहां गोटो कोड को और अधिक पठनीय और छोटा बना दिया गया है। कभी-कभी यह रिफैक्टर (या गोटो का उपयोग करने के लिए बेहतर) के लायक नहीं है।

दूसरी तरफ आप से बच सकते हैं जबकि (सत्य) अधिकतर समय।

22

इसके बारे में इतना डरावना क्या है? एक सामान्य ब्रेक हालत खोजने का प्रयास करें और इसे लूप के प्रमुख के रूप में दोबारा दोहराएं। यदि यह संभव नहीं है - ठीक है।

+0

यूप, मेरा विचार यस्ट ;-)। –

+4

या रिफैक्टर तो यह अंत में है और "थोड़ी देर" का लाभ उठाएं। – Torlack

+0

@ टोरलेक - हरहर! –

12

लूप से बाहर निकलने के लिए आप जिस स्थिति का उपयोग करने जा रहे थे, उसके साथ सही जगह बदलें।

एक सेवा या पृष्ठभूमि धागे के मामले में, आप उपयोग कर सकते हैं:

volatile bool m_shutdown = false; 
void Run() 
{ 
    while (!m_shutdown) 
    { ... } 
} 
+0

कभी-कभी लोग इसे सेवाओं के लिए करते हैं, जहां निष्पादन अनिश्चित काल तक जारी रखने के लिए होता है और केवल ऑनस्टॉप या अपवाद को तोड़ दिया जाता है। तो कोई शर्त नहीं है। – Grank

+1

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

+0

आगे, "BEGIN X WHILE Y REPEAT" है जहां स्थिति लूप के बीच में है। इस प्रकार के लूप निर्माण को आसानी से अधिक पारंपरिक "जबकि {}" या "do {}" लूप में परिवर्तित नहीं किया जाता है। – Torlack

3

errr, एक रिफैक्टरिंग होने के लिए .....

  • अनंत recursion के साथ अनंत लूप बदलें: -)
अच्छी तरह से

, आप एक भाषा पूंछ कॉल का समर्थन करता है कि .... अगर

13

जब मैं थोड़ी देर के (सही) पाश सामना करते हैं, कि मुझसे कहता है या तो

  1. तोड़ हालत आसानी से पाश के शीर्ष (या नीचे) पर परीक्षण नहीं है,
    • कई तोड़ने की स्थिति देखते हैं,
    • या पूर्व प्रोग्रामर लूप को ठीक तरह से कारक करने के लिए बहुत आलसी था।

1 और 2 का मतलब है आप के साथ-साथ, जबकि (सही) के साथ चिपके रहते हैं हो सकता है। (मैं for(;;) का उपयोग करता हूं, लेकिन यह मेरी राय में एक स्टाइल चीज है।) मैं एक और पोस्टर के साथ हूं, यह क्यों डरता है? मैंने टॉरटेड लूप को डर दिया जो लूप को "ठीक से" घुमाने के लिए हुप्स के माध्यम से कूदता है।

+0

उत्तर सामान्यतः 3 है! – DaveF

3

यदि आप प्रोग्राम प्रवाह के कुल गर्भपात तक अनिश्चित काल तक जारी रखना चाहते हैं, तो मुझे (सत्य) के साथ कुछ भी गलत नहीं दिख रहा है। मुझे हाल ही में एक .NET डेटा संग्रह सेवा में सामना करना पड़ा जो थ्रेड स्लीप के साथ (सत्य) को मिलाकर हर मिनट जागने और नई रिपोर्ट के लिए तीसरे पक्ष की डेटा सेवा को मतदान करने के लिए मिला। मैंने इसे टाइमर और एक प्रतिनिधि के साथ दोबारा प्रतिक्रिया देने पर विचार किया, लेकिन आखिरकार फैसला किया कि यह सबसे सरल और आसान-पढ़ने वाली विधि थी। 10 में से 9 बार यह स्पष्ट कोड गंध है, लेकिन जब कोई बाहर निकलने की स्थिति नहीं है, तो चीजों को और अधिक कठिन क्यों बनाते हैं?

7

"हमेशा के लिए चल रहा है" स्थिति कभी-कभी एक बड़ी राज्य मशीन का हिस्सा होती है। कई एम्बेडेड डिवाइस (रन-हमेशा के लिए लूप के साथ) वास्तव में हमेशा नहीं चलाते हैं। उनके पास अक्सर कई ऑपरेटिंग मोड होते हैं और उन तरीकों के बीच अनुक्रमित होंगे।

जब हमने ताप-पंप नियंत्रकों का निर्माण किया, तो वहां एक पावर-ऑन-सेल्फ-टेस्ट (POST) मोड था जो थोड़ी देर के लिए दौड़ गया। फिर एक प्रारंभिक पर्यावरणीय एकत्रण मोड था जो तब तक चलता रहा जब तक कि हम सभी जोनों और थर्मोस्टेट्स को नहीं समझते थे और क्या नहीं।

कुछ इंजीनियरों ने दावा किया कि अगला "रन-हमेशा" लूप था। यह वास्तव में इतना आसान नहीं था। यह वास्तव में कई ऑपरेटिंग मोड थे जो फिसल गए और फ्लॉप किए गए। हीटिंग, और डिफ्रॉस्टिंग, और शीतलन, और निष्क्रिय, और अन्य सामान था।

मेरी वरीयता है कि "हमेशा के लिए" लूप का इलाज वास्तव में केवल एक ऑपरेटिंग मोड के रूप में करें - भविष्य में कुछ बिंदु पर अन्य लोग हो सकते हैं।

someMode= True 
while someMode: 
    try: 
     ... do stuff ... 
    except SomeException, e: 
     log.exception(e) 
     # will keep running 
    except OtherException, e: 
     log.info("stopping now") 
     someMode= False 

कुछ परिस्थितियों में, कुछ भी नहीं है कि हमने देखा अब तक False करने के लिए someMode सेट। लेकिन मुझे यह बहाना पसंद है कि कुछ भविष्य के संस्करण में एक मोड बदलाव होगा।

11

क्यों रिफैक्टर? और इस निर्माण के बारे में इतना "डरावना" क्या है? यह व्यापक रूप से प्रयोग किया जाता है, और अच्छी तरह से समझा जाता है।

यदि यह तोड़ा नहीं गया है, तो इसे ठीक न करें।

1

मुझे यह नहीं लगता कि अनंत लूप एक खिड़की के भीतर निहित है, और खिड़की के साथ मर जाता है।

हैसलहॉफ रिकर्सन के बारे में सोचें।

7
#define ever 1 
for (;ever;) 

?

मेह, बस इसे छोड़ कि यह कैसे है, जबकि (सही) शायद के रूप में सुपाठ्य रूप में आप प्राप्त करने के लिए जा रहे हैं है ..

+0

मुझे इस तरह के "लूप" के दुरुपयोग से नफरत है। एक अर्थपूर्ण है जिसके लिए "फॉर" लूप डिजाइन किया गया था, (अनिवार्य रूप से एक से लेकर अर्थपूर्ण) और मुझे लगता है कि हमें उस पर चिपकना चाहिए। आप यहां क्या कर रहे हैं "कीवर्ड" में "अर्थ" में अर्थपूर्ण है। कम से कम #define इसे मामूली रूप से सहनशील बनाता है। –

+5

अगर हम उस बदसूरत पर जाना चाहते हैं, तो क्यों नहीं "# (जबकि)" (या) कुछ ऐसा करें :) –

53

मेरी प्राथमिकता

start: 

    // code goes here 

goto start; 

होगा यह स्पष्टत व्यक्त करता है आशय। शुभकामनाएं इसे आपके कोडिंग मानकों से पहले प्राप्त कर रही हैं। (आश्चर्य है कि यह कितना कर्म मुझे खर्च करने जा रहा है)।

+0

मुझे इसे वोट देना पड़ा क्योंकि उसने मुझे एक अच्छा हंसी दी! –

+1

मैंने इसे वोट दिया, क्योंकि कभी-कभी गोटो * स्वीकार्य है! –

+9

मैंने इसे वोट दिया क्योंकि मैं विधानसभा –

-2
void whiletrue_sim(void) 
    { 
    //some code 
    whiletrue_sim(); 
    } 

चेतावनी: आपका ढेर भाषा, अनुकूलक और अन्य चीजों पर निर्भर हो सकता है।

+0

हालांकि यह कोड ब्लॉक प्रश्न का उत्तर दे सकता है, यह सबसे अच्छा होगा यदि आप ऐसा क्यों करते हैं के लिए थोड़ा स्पष्टीकरण प्रदान कर सकते हैं। – Rakete1111

+0

बस कोड पढ़ें। मैं शब्दों के साथ बुरा हूं और यदि आप इस सरल कोड को नहीं समझते हैं तो मैं इसे बेहतर समझा नहीं सकता। यह सिर्फ इतना है कि आपका ढेर अतिप्रवाह हो सकता है, भाषा, अनुकूलक या आपका दुभाषिया कैसे काम करता है। – 12431234123412341234123

संबंधित मुद्दे