निम्नलिखित कोड पर विचार करें:
public void doSomething(int input)
{
while(true)
{
TransformInSomeWay(input);
if(ProcessingComplete(input))
break;
DoSomethingElseTo(input);
}
}
मान लें कि इस प्रक्रिया में चरणों का एक परिमित लेकिन इनपुट-निर्भर संख्या शामिल है; लूप को एल्गोरिथम के परिणामस्वरूप अपने आप समाप्त करने के लिए डिज़ाइन किया गया है, और इसे अनिश्चित काल तक चलाने के लिए डिज़ाइन नहीं किया गया है (जब तक कि किसी बाहरी घटना द्वारा रद्द नहीं किया जाता है)। क्योंकि यह देखने के लिए कि क्या लूप का अंत होना चाहिए परीक्षण एक तार्किक सेट के बीच में है, जबकि लूप स्वयं वर्तमान में कुछ भी सार्थक नहीं देखता है; इसके बजाय वैचारिक एल्गोरिथ्म में "उचित" स्थान पर प्रदर्शन किया जाता है।
मुझे बताया गया था कि यह खराब कोड है, क्योंकि लूप स्ट्रक्चर की जांच नहीं होने के कारण यह अधिक बग-प्रवण है। यह पता लगाना अधिक कठिन है कि आप लूप से बाहर कैसे निकलेंगे, और बग को आमंत्रित कर सकते हैं क्योंकि ब्रेकिंग स्थिति को बायपास किया जा सकता है या गलती से भविष्य के परिवर्तनों को छोड़ दिया जा सकता है।
अब, कोड इस प्रकार संरचित किया जा सकता है:
public void doSomething(int input)
{
TransformInSomeWay(input);
while(!ProcessingComplete(input))
{
DoSomethingElseTo(input);
TransformInSomeWay(input);
}
}
हालाँकि, यह कोड में एक विधि के लिए एक कॉल को डुप्लिकेट करता है, DRY का उल्लंघन करता है; यदि TransformInSomeWay
बाद में किसी अन्य विधि से प्रतिस्थापित किया गया, तो दोनों कॉल को ढूंढना होगा और बदलना होगा (और यह तथ्य कि कोड के अधिक जटिल टुकड़े में दो कम स्पष्ट हो सकते हैं)।
आप इसे भी लिख सकते हैं:
public void doSomething(int input)
{
var complete = false;
while(!complete)
{
TransformInSomeWay(input);
complete = ProcessingComplete(input);
if(!complete)
{
DoSomethingElseTo(input);
}
}
}
... लेकिन आपके पास अब एक चर है जिसका एकमात्र उद्देश्य हालत-जाँच को लूप संरचना में स्थानांतरित करना है, और मूल तर्क के समान व्यवहार प्रदान करने के लिए कई बार जाँच भी की जानी है।
मेरे भाग के लिए, मैं कहता हूं कि एल्गोरिथ्म को इस कोड को वास्तविक दुनिया में लागू करता है, मूल कोड सबसे अधिक पठनीय है। यदि आप स्वयं इसके माध्यम से जा रहे हैं, तो यह वह तरीका है जिसके बारे में आप सोचेंगे, और इसलिए यह एल्गोरिथ्म से परिचित लोगों के लिए सहज होगा।
तो, जो "बेहतर" है? क्या लूप के चारों ओर तर्क को संरचित करते हुए लूप को कंडीशन चेकिंग की जिम्मेदारी देना बेहतर है? या तर्क को "प्राकृतिक" तरीके से संरचना करना बेहतर है जैसा कि आवश्यकताओं या एल्गोरिथ्म के एक वैचारिक विवरण से संकेत मिलता है, भले ही इसका मतलब यह हो सकता है कि लूप की अंतर्निहित क्षमताओं को दरकिनार कर दिया जाए?
do ... until
निर्माण के बाद से वे किए जाने की जरूरत नहीं है भी छोरों की इन प्रकार के लिए उपयोगी है "दुरुस्त।"