প্রতিজ্ঞা
নিম্নলিখিত কোডটি ভাষা বা পছন্দসই কার্যকারিতা নির্বিশেষে খারাপ ফর্ম হিসাবে বিবেচনা করা উচিত:
while( true ) {
}
সমর্থন যুক্তি
while( true )
লুপ কারণ এটি দরিদ্র ফর্ম হল:
- কিছুক্ষণ লুপের অন্তর্নিহিত চুক্তিটি ভঙ্গ করে।
- লুপ ঘোষণায় স্পষ্টভাবে একমাত্র প্রস্থান শর্তটি বলা উচিত।
- বোঝায় যে এটি চিরতরে লুপ করে।
- সমাপ্তির ধারাটি বুঝতে লুপের মধ্যে কোড অবশ্যই পড়তে হবে।
- লুপগুলি যে চিরতরে পুনরাবৃত্তি হয় ব্যবহারকারীকে প্রোগ্রামের মধ্যে থেকে প্রোগ্রামটি শেষ করতে বাধা দেয়।
- অদক্ষ।
- "সত্য" এর জন্য পরীক্ষা করা সহ একাধিক লুপ সমাপ্তির শর্ত রয়েছে।
- বাগ প্রবণ হয়।
- সর্বদা প্রতিটি পুনরাবৃত্তির জন্য কার্যকর করা হবে এমন কোডটি কোথায় স্থাপন করা যায় তা সহজেই নির্ধারণ করা যায় না।
- অহেতুক জটিল কোড বাড়ে।
- স্বয়ংক্রিয় উত্স কোড বিশ্লেষণ।
- বাগ অনুসন্ধানের জন্য, প্রোগ্রামের জটিলতা বিশ্লেষণ, সুরক্ষা চেকগুলি, বা কোড প্রয়োগের ছাড়াই স্বয়ংক্রিয়ভাবে অন্য কোনও উত্স কোড আচরণ সঞ্চার করে, প্রাথমিক ব্রেকিং শর্ত (গুলি) এলগোরিদমগুলিকে দরকারী আক্রমণকারী নির্ধারণ করার অনুমতি দেয়, যার ফলে স্বয়ংক্রিয় উত্স কোড বিশ্লেষণ মেট্রিকগুলি উন্নত হয়।
- অসীম লুপস।
- প্রত্যেকে যদি সর্বদা
while(true)
লুপগুলির জন্য ব্যবহার করে যা অসীম নয়, লুপগুলির আসলে কোন সমাপ্তির শর্ত না থাকে তখন আমরা সংক্ষিপ্তভাবে যোগাযোগের ক্ষমতা হারাতে পারি। (যুক্তিযুক্তভাবে, এটি ইতিমধ্যে ঘটেছে, সুতরাং বিন্দুটি মোটা)
"যান" বিকল্প
নিম্নলিখিত কোডটি আরও ভাল ফর্ম:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
সুবিধাদি
কোন পতাকা নেই। কোন goto
। বিকল্প নেই. পরিবর্তন সহজ। পড়তে সহজ. ঠিক করা সহজ। অতিরিক্তভাবে কোড:
- লুপ থেকে নিজেই লুপের কাজের চাপের জ্ঞানকে বিচ্ছিন্ন করে।
- কোড বজায় রাখা কাউকে সহজে কার্যকারিতা বাড়ানোর অনুমতি দেয়।
- একাধিক অবসান শর্তাবলী এক জায়গায় বরাদ্দ করার অনুমতি দেয়।
- কার্যকর করতে কোড থেকে সমাপ্তি ধারাটি পৃথক করে।
- পারমাণবিক বিদ্যুৎ কেন্দ্রের পক্ষে নিরাপদ। ;-)
দ্বিতীয় বিষয়টি গুরুত্বপূর্ণ। কোডটি কীভাবে কাজ করে তা না জেনে যদি কেউ আমাকে মূল লুপ তৈরি করতে বলে অন্য থ্রেডগুলিতে (বা প্রক্রিয়াগুলি) কিছুটা সিপিইউ সময় দেয়, দুটি সমাধান মাথায় আসে:
বিকল্প 1
সহজেই বিরতি sertোকান:
while( isValidState() ) {
execute();
sleep();
}
বিকল্প # 2
ওভাররাইড এক্সিকিউট:
void execute() {
super->execute();
sleep();
}
এই কোড একটি লুপ চেয়ে (অথবা পড়ার জন্য সহজ এইভাবে) সহজ একটি এমবেডেড সাথে আছেন switch
। isValidState
পদ্ধতিটি কেবল নির্ধারণ উচিত লুপ চালিয়ে যাওয়া উচিত। পদ্ধতির ওয়ার্কহর্সটি পদ্ধতিতে বিমূর্ত হওয়া উচিত execute
, যা সাবক্লাসগুলি ডিফল্ট আচরণকে (একটি এম্বেডড switch
এবং ব্যবহার করে একটি কঠিন কাজ goto
) ওভাররাইড করতে দেয় ।
পাইথন উদাহরণ
স্ট্যাকওভারফ্লোতে পোস্ট করা নিম্নলিখিত উত্তরটির (একটি পাইথন প্রশ্নের কাছে) তুলনা করুন:
- চিরকালের জন্য লুপ।
- ব্যবহারকারীকে তাদের পছন্দটি ইনপুট করতে বলুন।
- যদি ব্যবহারকারীর ইনপুটটি 'পুনঃসূচনা' হয় তবে চিরকালের জন্য লুপিং চালিয়ে যান।
- অন্যথায়, চিরতরে লুপিং বন্ধ করুন।
- শেষ.
কোড
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
বিভ্রান্তিকর এবং অত্যধিক জটিল কোডের ফলাফল।