আমি এখানে একটি পদক্ষেপ নিতে হবে। আপনি কোডটির পিক বিশদটিতে মনোনিবেশ করছেন তবে বৃহত্তর ছবিটি অনুপস্থিত। আসুন আপনার উদাহরণের একটি লুপ দেখে নেওয়া যাক:
int offset = 0;
while(true)
{
Record r = Read(offset);
if(r == null)
{
break;
}
// do work
offset++;
}
এই কোডটির অর্থ কী ? অর্থ "কোনও ফাইলের প্রতিটি রেকর্ডে কিছু কাজ করুন"। তবে কোডটি দেখতে এমন নয় । কোডটি দেখে মনে হচ্ছে "একটি অফসেট বজায় রাখা a একটি ফাইল খুলুন no কোনও শেষ শর্ত ছাড়াই একটি লুপ প্রবেশ করুন a রেকর্ডটি পড়ুন ull নালীর জন্য পরীক্ষা করুন।" আমরা সব কাজ করার আগে! আপনার যে প্রশ্নটি জিজ্ঞাসা করা উচিত তা হ'ল " আমি কীভাবে এই কোডটির উপস্থিতিটির শব্দার্থতত্ত্বের সাথে মেলে তুলতে পারি? " এই কোডটি হওয়া উচিত:
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);
ইত্যাদি।
আপনি যখন কোনও লুপ লেখেন তখন নিজেকে জিজ্ঞাসা করুন "এই লুপটি কোনও ব্যবস্থার মতো পড়ে বা কোডটির অর্থ পছন্দ করে?" যদি উত্তরটি "মেকানিজমের মতো" হয়, তবে সেই প্রক্রিয়াটিকে তার নিজস্ব পদ্ধতিতে স্থানান্তরিত করার চেষ্টা করুন এবং অর্থটি আরও দৃশ্যমান করার জন্য কোডটি লিখুন।