मैं यहां एक कदम पीछे हटूंगा। आप कोड के picky विवरण पर ध्यान केंद्रित कर रहे हैं, लेकिन बड़ी तस्वीर गायब है। चलिए आपके एक उदाहरण लूप पर नज़र डालते हैं:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
इस कोड का अर्थ क्या है ? अर्थ है "एक फ़ाइल में प्रत्येक रिकॉर्ड के लिए कुछ काम करें"। लेकिन ऐसा नहीं है कि कोड कैसा दिखता है । कोड ऐसा दिखता है "एक ऑफसेट बनाए रखें। एक फ़ाइल खोलें। बिना किसी अंतिम शर्त के एक लूप दर्ज करें। एक रिकॉर्ड पढ़ें। अशक्तता के लिए परीक्षण करें।" हम सभी को काम करने से पहले! आपके द्वारा पूछा जाने वाला प्रश्न यह है कि " मैं इस कोड की उपस्थिति को इसके शब्दार्थ से कैसे जोड़ सकता हूं? " यह कोड होना चाहिए:
foreach(Record record in RecordsFromFile())
DoWork(record);
अब कोड अपने इरादे की तरह पढ़ता है। अपने तंत्र को अपने शब्दार्थ से अलग करें । अपने मूल कोड में आप तंत्र को मिलाते हैं - लूप का विवरण - शब्दार्थ के साथ - प्रत्येक रिकॉर्ड के लिए किया गया कार्य।
अब हमें लागू करना है RecordsFromFile()
। इसे लागू करने का सबसे अच्छा तरीका क्या है? किसे पड़ी है? यह वह कोड नहीं है जिस पर किसी की नजर जा रही है। यह बुनियादी तंत्र कोड और इसकी दस पंक्तियाँ हैं। फिर भी आप इसे लिखें। इस बारे में कैसा है?
public IEnumerable<Record> RecordsFromFile()
{
int offset = 0;
while(true)
{
Record record = Read(offset);
if (record == null) yield break;
yield return record;
offset += 1;
}
}
अब जब हम रिकॉर्ड के एक आलसी गणना क्रम को जोड़ रहे हैं तो सभी प्रकार के परिदृश्य संभव हो सकते हैं:
foreach(Record record in RecordsFromFile().Take(10))
DoWork(record);
foreach(Record record in RecordsFromFile().OrderBy(r=>r.LastName))
DoWork(record);
foreach(Record record in RecordsFromFile().Where(r=>r.City == "London")
DoWork(record);
और इसी तरह।
जब भी आप एक लूप लिखते हैं, तो अपने आप से पूछें "क्या यह लूप तंत्र की तरह या कोड के अर्थ की तरह पढ़ता है?" यदि उत्तर "एक तंत्र की तरह" है, तो उस तंत्र को अपने तरीके से स्थानांतरित करने का प्रयास करें, और अर्थ को अधिक दृश्यमान बनाने के लिए कोड लिखें।