ফল-থ্রো (ক্লাসিক) স্যুইচ স্টেটমেন্টটি ব্যবহার করা কখন উপযুক্ত? এই ধরনের ব্যবহার কি প্রস্তাবিত এবং উত্সাহিত করা বা এটিকে কোনও মূল্যে এড়ানো উচিত?
ফল-থ্রো (ক্লাসিক) স্যুইচ স্টেটমেন্টটি ব্যবহার করা কখন উপযুক্ত? এই ধরনের ব্যবহার কি প্রস্তাবিত এবং উত্সাহিত করা বা এটিকে কোনও মূল্যে এড়ানো উচিত?
উত্তর:
এটি কার্যকর হবে যেখানে একটি উদাহরণ এখানে।
public Collection<LogItems> GetAllLogItems(Level level) {
Collection<LogItems> result = new Collection<LogItems>();
switch (level) {
// Note: fall through here is INTENTIONAL
case All:
case Info:
result.Add(GetItemsForLevel(Info));
case Warning:
result.Add(GetItemsForLevel(Warning));
case Error:
result.Add(GetItemsForLevel(Error));
case Critical:
result.Add(GetItemsForLevel(Critical));
case None:
}
return result;
}
এই ধরণের জিনিসটি (যেখানে একটি ক্ষেত্রে অন্যটি অন্তর্ভুক্ত থাকে) বরং বিরল, আমি মনে করি, এজন্য কিছু নতুন ভাষা হয় ফলোভারকে অনুমতি দেয় না বা এর জন্য বিশেষ বাক্য গঠন প্রয়োজন হয় না।
// INTENTIONAL FALL THROUGH HERE
এটিতে প্রয়োজনীয় সমস্ত ক্যাপস মন্তব্য নেই cking
GetItemsForLevel(Info)
কলটি আহ্বান করা ইত্যাদির মাধ্যমে এই কোডটি লিখে পড়া ঠিক তত সহজ GetItemsForLevel(Warning)
।
যখন আমি একাধিক মানের জন্য নির্দিষ্ট কার্যকারিতা প্রয়োগ করতে হয় তখন আমি সেগুলি ব্যবহার করি। উদাহরণস্বরূপ, বলুন যে আপনার কাছে অপারেশন কোড নামে পরিচিত একটি সম্পত্তি রয়েছে। কোডটি যদি 1, 2, 3 বা 4 এর সমান হয় তবে আপনি শুরু করতে চান অপারেশনএক্স ()। যদি এটি 5 বা 6 হয় তবে আপনি শুরু করতে চান অপারেশনওয়াই () এবং 7 টি আপনি স্টার্টওপেজ জেড ()। ক্রিয়াকলাপ এবং বিরতি সহ 7 টি সম্পূর্ণ মামলা কেন আপনি ফলের-মাধ্যমে ব্যবহার করতে পারবেন?
আমি মনে করি এটি নির্দিষ্ট পরিস্থিতিতে সম্পূর্ণ বৈধ, বিশেষত যদি এটি 100-যদি-অন্য বিবৃতি এড়িয়ে চলে। =)
switch
একাধিক case
গুলি একই কোডে আবদ্ধ। এটি পতনের মধ্য দিয়ে ভিন্ন, যেখানে একজনের ফাঁসি কার্যকর case
হয় পরবর্তী একের break
মধ্যে তাদের মধ্যে কোনও অভাবের কারণে continues
ফল-থ্রু কেসগুলি পুরোপুরি ঠিক আছে। আমি প্রায়শই দেখতে পাই যে একটি গণনা প্রচুর স্থানে ব্যবহৃত হয় এবং যখন আপনার কিছু ক্ষেত্রে আলাদা করার প্রয়োজন হয় না তখন ফল-থ্রু যুক্তি ব্যবহার করা সহজ।
উদাহরণস্বরূপ (ব্যাখ্যামূলক মন্তব্যগুলি নোট করুন):
public boolean isAvailable(Server server, HealthStatus health) {
switch(health) {
// Equivalent positive cases
case HEALTHY:
case UNDER_LOAD:
return true;
// Equivalent negative cases
case FAULT_REPORTED:
case UNKNOWN:
case CANNOT_COMMUNICATE:
return false;
// Unknown enumeration!
default:
LOG.warn("Unknown enumeration " + health);
return false;
}
}
আমি এই ধরনের ব্যবহার পুরোপুরি গ্রহণযোগ্য বলে মনে করি।
case X: case Y: doSomething()
এবং এর মধ্যে একটি বড় পার্থক্য রয়েছে case X: doSomething(); case Y: doAnotherThing()
। প্রথমটিতে অভিপ্রায়টি বেশ স্পষ্ট, অন্যদিকে, পড়ার বিষয়টি উদ্দেশ্যমূলক বা নাও হতে পারে। আমার অভিজ্ঞতায়, প্রথম উদাহরণটি কম্পাইলার / কোড বিশ্লেষকগুলিতে কোনও সতর্কতা কখনই ট্রিগার করে না, যখন দ্বিতীয়টি করে। ব্যক্তিগতভাবে, আমি কেবল দ্বিতীয় উদাহরণটিকে "পড়ুন মাধ্যমে" ডাকব - যদিও "অফিসিয়াল" সংজ্ঞা সম্পর্কে নিশ্চিত নয়।
এটা নির্ভর করে:
একটি মামলার পরেরটি পর্যন্ত পড়ার সাথে জড়িত দুটি প্রধান সমস্যা হ'ল:
এটি আপনার কোড কেস স্টেটমেন্টের ক্রমের উপর নির্ভরশীল করে তোলে। আপনি যদি কখনই এর মধ্যে পড়ে না যান তবে বিষয়টি এমন নয় এবং এটি এমন এক জটিলতার যোগ করে যা প্রায়শই অপ্রয়োজনীয়।
এটি স্পষ্ট নয় যে একটি মামলার কোডে এক বা একাধিক পরবর্তী মামলার কোড অন্তর্ভুক্ত থাকে।
কিছু জায়গাগুলি স্পষ্টভাবে এর মধ্য দিয়ে পড়া নিষেধ করে। আপনি যদি এমন জায়গায় কাজ না করেন এবং আপনি যদি অনুশীলনটি নিয়ে স্বাচ্ছন্দ্য বোধ করেন এবং যদি কোডটি প্রশ্নবিদ্ধভাবে ভাঙা কোন সত্যিকারের কষ্টের কারণ না হয়, তবে এটি বিশ্বের সবচেয়ে খারাপ জিনিস নাও হতে পারে। আপনি যদি এটি করেন তবে পরবর্তী সময়ে যারা আসবেন তাদের সতর্ক করতে কাছাকাছি মনোযোগ আকর্ষণ করার মতামতটি অবশ্যই রাখবেন (ভবিষ্যতে আপনিও)।
আমার জীবনকে সহজ করে তোলার একটি দ্রুত (স্বীকৃতভাবে অসম্পূর্ণ (লিপ ইয়ারের কোনও বিশেষ পরিচালনা নয়)) উদাহরণ's
function get_julian_day (date) {
int utc_date = date.getUTCDate();
int utc_month = date.getUTCMonth();
int julian_day = 0;
switch (utc_month) {
case 11: julian_day += 30;
case 10: julian_day += 31;
case 9: julian_day += 30;
case 8: julian_day += 31;
case 7: julian_day += 31;
case 6: julian_day += 30;
case 5: julian_day += 31;
case 4: julian_day += 30;
case 3: julian_day += 31;
case 2: julian_day += 28;
case 1: julian_day += 31;
default: break;
}
return julian_day + utc_date;
}
যদি আমি একটি মামলা থেকে অন্য কেস (বিরল, স্বীকারোক্তি দিয়ে) যাওয়ার প্রয়োজন বোধ করি তবে আমি খুব স্পষ্ট এবং পছন্দ করতে পছন্দ করি goto case
অবশ্যই এটি ধরে নেয় যে আপনার ভাষা এটি সমর্থন করে।
যেহেতু পতন এতটা অস্বাভাবিক, এবং কোড পড়ার সময় উপেক্ষা করা খুব সহজ, আমি মনে করি এটি সুস্পষ্টভাবে বলা উপযুক্ত - এবং একটি গোটো, এমনকি যদি এটি কোনও ক্ষেত্রে হয় তবে এটি গলাতে থাকা অঙ্গুরের মতো দাঁড়ানো উচিত।
কেস স্টেটমেন্টগুলি পুনরায় সাজানোর সময় ঘটে যাওয়া বাগগুলি এড়াতেও এটি সহায়তা করে।