পতনের মাধ্যমে স্যুইচ স্টেটমেন্টগুলির উপযুক্ত ব্যবহার


14

ফল-থ্রো (ক্লাসিক) স্যুইচ স্টেটমেন্টটি ব্যবহার করা কখন উপযুক্ত? এই ধরনের ব্যবহার কি প্রস্তাবিত এবং উত্সাহিত করা বা এটিকে কোনও মূল্যে এড়ানো উচিত?


সমস্ত ভাষাগুলি স্যুইচ স্টেটমেন্টগুলিতে পড়ার অনুমতি দেয় না।
ওডে

@ সংযুক্ত, সম্পাদিত, "ক্লাসিক" শব্দ যুক্ত হয়েছে। সমস্ত ভাষাগুলি পড়তে দেয় না তবুও আমি জোর দিয়ে বলছি এটি ক্লাসিক is
পড়তে

3
আপনি যদি ডাফসের ডিভাইসের কথা বলছেন তবে এটি একটি জিনিস।
ওদেড

6
@ ওজেড: বেশিরভাগ লোকেরা এটিই প্রথম জিনিসটি মনে করেন তবে এটি 'যথাযথ' ly মতে এই , ডাফের নিজে বলেছিলেন "এই হ 'ল আলোচনায় একটি আর্গুমেন্ট কিনা সুইচ ডিফল্টরূপে মাধ্যমে পড়া উচিত প্রদান করে, কিন্তু আমি নিশ্চিত যদি যুক্তি জন্য অথবা এটি বিরুদ্ধে নই।"
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

উত্তর:


15

এটি কার্যকর হবে যেখানে একটি উদাহরণ এখানে।

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;
}

এই ধরণের জিনিসটি (যেখানে একটি ক্ষেত্রে অন্যটি অন্তর্ভুক্ত থাকে) বরং বিরল, আমি মনে করি, এজন্য কিছু নতুন ভাষা হয় ফলোভারকে অনুমতি দেয় না বা এর জন্য বিশেষ বাক্য গঠন প্রয়োজন হয় না।


13
এই উদাহরণটি আকর্ষণীয় হলেও // INTENTIONAL FALL THROUGH HEREএটিতে প্রয়োজনীয় সমস্ত ক্যাপস মন্তব্য নেই cking
রাসেল বোরোগোভ

GetItemsForLevel(Info)কলটি আহ্বান করা ইত্যাদির মাধ্যমে এই কোডটি লিখে পড়া ঠিক তত সহজ GetItemsForLevel(Warning)
কালেব

@ রাসেলবোরোগোভ: একেবারে সঠিক।
কনফিগারকারী

@ কালেব: এই ক্ষেত্রে, হ্যাঁ তবে কলগুলি যদি আরও জটিল হয়? এটি কিছুটা লোমশ হয়ে উঠতে পারে, তবে পড়ার সময় এটি সহজ মনে হয়। আমার লক্ষ করা উচিত যে আমি আসলে পতনের মধ্য দিয়ে যাওয়ার পক্ষে নই - আমি কেবল বলছি এটি নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে।
কনফিগারকারী

সেরা উদাহরণ নয়। সতর্কতা স্তরের ক্রম রয়েছে। এই অর্ডারটি সংজ্ঞায়িত করে, আইটেম স্তরটি কমপক্ষে কাঙ্ক্ষিত স্তরের সমান হলে এই পদ্ধতিটি কোড ফিল্টারিং আইটেমগুলির একটি এক লাইনে হ্রাস করে।
কেভিন ক্লিন 18

8

যখন আমি একাধিক মানের জন্য নির্দিষ্ট কার্যকারিতা প্রয়োগ করতে হয় তখন আমি সেগুলি ব্যবহার করি। উদাহরণস্বরূপ, বলুন যে আপনার কাছে অপারেশন কোড নামে পরিচিত একটি সম্পত্তি রয়েছে। কোডটি যদি 1, 2, 3 বা 4 এর সমান হয় তবে আপনি শুরু করতে চান অপারেশনএক্স ()। যদি এটি 5 বা 6 হয় তবে আপনি শুরু করতে চান অপারেশনওয়াই () এবং 7 টি আপনি স্টার্টওপেজ জেড ()। ক্রিয়াকলাপ এবং বিরতি সহ 7 টি সম্পূর্ণ মামলা কেন আপনি ফলের-মাধ্যমে ব্যবহার করতে পারবেন?

আমি মনে করি এটি নির্দিষ্ট পরিস্থিতিতে সম্পূর্ণ বৈধ, বিশেষত যদি এটি 100-যদি-অন্য বিবৃতি এড়িয়ে চলে। =)


4
আপনি যা বর্ণনা করছেন তা হ'ল switchএকাধিক caseগুলি একই কোডে আবদ্ধ। এটি পতনের মধ্য দিয়ে ভিন্ন, যেখানে একজনের ফাঁসি কার্যকর caseহয় পরবর্তী একের breakমধ্যে তাদের মধ্যে কোনও অভাবের কারণে continues
ব্লারফ্লু

3
এটি আসলে কোনও ব্যাপার নয়, ফলল-থ্রুটি কেবল ব্রেক স্টেটমেন্টের অভাব তাই এটি পরবর্তী ক্ষেত্রে "পড়ে" "
ইয়াাত্রিক্স

আমি আপনার উত্তরে দৃশ্যের পুনরায় কথা বলছি তা প্রতিফলিত করতে।
ব্লারফ্লু

2
@ ইয়াত্রিক্স: আমি একমত নই এটি বিরতি বাদ দেওয়ার চেয়ে কোডের ঠিক একই ব্লকটি কার্যকর করে একটানা ক্ষেত্রে হওয়া অনেক আলাদা। একটি হ'ল রুটিন, অন্যটি এর থেকে দূরে (আইএম) - এবং ভুল লিখন এবং অনিচ্ছাকৃত নিয়ন্ত্রণ প্রবাহের সম্ভাবনা অনেক বেশি।
কোয়ান্টিন-স্টারিন

3
@ প্রশ্ন হ্যাঁ, এটি আলাদা, তবে তারা উভয়ই হ'ল তিনি জিজ্ঞাসা করেছেন / কখন উপযুক্ত হবে be আমি এটি যখন একটি উদাহরণ দিয়েছি। এটি সর্বজনীন উদাহরণ হিসাবে বোঝানো হয়নি। ভাষার উপর নির্ভর করে, পড়ার আগে বিবৃতি থাকা কার্যকর নাও হতে পারে। আমি মনে করি না এটি সি # এর সাথে হবে stackoverflow.com/questions/174155/...
Yatrix

8

আমি মাঝে মাঝে সেগুলি ব্যবহার করেছি, আমি মনে করি এটির সর্বদা উপযুক্ত ব্যবহার - তবে কেবল যখন উপযুক্ত মন্তব্যের সাথে অন্তর্ভুক্ত হয়।


7

ফল-থ্রু কেসগুলি পুরোপুরি ঠিক আছে। আমি প্রায়শই দেখতে পাই যে একটি গণনা প্রচুর স্থানে ব্যবহৃত হয় এবং যখন আপনার কিছু ক্ষেত্রে আলাদা করার প্রয়োজন হয় না তখন ফল-থ্রু যুক্তি ব্যবহার করা সহজ।

উদাহরণস্বরূপ (ব্যাখ্যামূলক মন্তব্যগুলি নোট করুন):

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()। প্রথমটিতে অভিপ্রায়টি বেশ স্পষ্ট, অন্যদিকে, পড়ার বিষয়টি উদ্দেশ্যমূলক বা নাও হতে পারে। আমার অভিজ্ঞতায়, প্রথম উদাহরণটি কম্পাইলার / কোড বিশ্লেষকগুলিতে কোনও সতর্কতা কখনই ট্রিগার করে না, যখন দ্বিতীয়টি করে। ব্যক্তিগতভাবে, আমি কেবল দ্বিতীয় উদাহরণটিকে "পড়ুন মাধ্যমে" ডাকব - যদিও "অফিসিয়াল" সংজ্ঞা সম্পর্কে নিশ্চিত নয়।
জেনস ব্যানম্যান

6

এটা নির্ভর করে:

  • আপনার ব্যক্তিগত পছন্দ
  • আপনার নিয়োগকর্তার কোডিং মান
  • জড়িত ঝুঁকি পরিমাণ

একটি মামলার পরেরটি পর্যন্ত পড়ার সাথে জড়িত দুটি প্রধান সমস্যা হ'ল:

  1. এটি আপনার কোড কেস স্টেটমেন্টের ক্রমের উপর নির্ভরশীল করে তোলে। আপনি যদি কখনই এর মধ্যে পড়ে না যান তবে বিষয়টি এমন নয় এবং এটি এমন এক জটিলতার যোগ করে যা প্রায়শই অপ্রয়োজনীয়।

  2. এটি স্পষ্ট নয় যে একটি মামলার কোডে এক বা একাধিক পরবর্তী মামলার কোড অন্তর্ভুক্ত থাকে।

কিছু জায়গাগুলি স্পষ্টভাবে এর মধ্য দিয়ে পড়া নিষেধ করে। আপনি যদি এমন জায়গায় কাজ না করেন এবং আপনি যদি অনুশীলনটি নিয়ে স্বাচ্ছন্দ্য বোধ করেন এবং যদি কোডটি প্রশ্নবিদ্ধভাবে ভাঙা কোন সত্যিকারের কষ্টের কারণ না হয়, তবে এটি বিশ্বের সবচেয়ে খারাপ জিনিস নাও হতে পারে। আপনি যদি এটি করেন তবে পরবর্তী সময়ে যারা আসবেন তাদের সতর্ক করতে কাছাকাছি মনোযোগ আকর্ষণ করার মতামতটি অবশ্যই রাখবেন (ভবিষ্যতে আপনিও)।


4

আমার জীবনকে সহজ করে তোলার একটি দ্রুত (স্বীকৃতভাবে অসম্পূর্ণ (লিপ ইয়ারের কোনও বিশেষ পরিচালনা নয়)) উদাহরণ'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;
}

5
যদিও এটি এক ধরণের চালাক, আপনি যখন এটি থেকে বাঁচাচ্ছেন তখন এটি অন্যদের জন্য কী করবে তা নির্ধারণ করার জন্য এটি যে সময় ব্যয় করে তা অনেকটাই ছাড়িয়ে যাবে। এছাড়াও, আপনি ফল-থ্রু দিকটি সরিয়ে আপনি আরও ভাল পারফরম্যান্স পেতে পারেন অর্থাৎ 31 + 28 + 31 সর্বদা 90 হয় you আপনি যদি এটি করতে যাচ্ছেন তবে আপনি কেবলমাত্র 11 টি বিবেচনার জন্য মামলায় মোট সংখ্যা রেখে যেতে পারেন।
জিমি জেমস

আপনি ঠিক বলেছেন, আমার উদাহরণটি অবশ্যই নিশ্চিতভাবে লেখা হয়েছে :) আমি বলব, তবে স্যুইচের প্রতিটি মামলার জন্য সমস্ত সংশ্লেষের দিনগুলি প্রাক-কম্পিউটিংয়ের পরিবর্তে দিনের সংখ্যাটি এভাবে বানান করা গেলে কোনও লুকানো বাগ খুঁজে পাওয়া সহজ it's ।
অ্যারোনডানিয়েলসন

2
আমি আপনাকে তা মঞ্জুর করব কিন্তু ধ্রুবক ঘোষণায় এটি করা ভাল eg যেমন FEB_START = 31; MAR_START = FEB_START + 28; এটি কোন ভাষা তা নিশ্চিত নয় তবে অনেকের মধ্যেই এটি সংকলনের সময় গণনা করা হবে। এখানে বড় সমস্যাটি এটি একটি সামান্য অবসন্নতা। এটি এতটা খারাপ নয় যে এটি কেবল খারাপ ধারণা yp যদি সত্যিই কোনও বড় সুবিধা না পাওয়া যায় তবে সাধারণ আইডিয়োমগুলি ধরে রাখা ভাল।
জিমি জেমস

1
এই উদাহরণটিতে প্রথম দিনগুলির জন্য ধ্রুবক ব্যবহার করে দুর্দান্ত বিকল্প। যাইহোক, এখানে মুল বক্তব্যটি হ'ল একটি ক্রমবহুল যোগফল একটি স্যুইচ-কেস ফল-থ্রোয়ের জন্য দুর্দান্ত ব্যবহার। আমি সাধারণ বুদ্ধিমান ব্যবহারের ক্ষেত্রে 100% সম্মত, তবে এই প্রশ্নের প্রকৃতিটি আরও বেশি বৌদ্ধিক বৈশিষ্ট্যগুলিতে উত্সাহিত করছে যেখানে সাধারণ বুদ্ধিমানের দ্বারা আসা কঠিন।
অ্যারোনডানিয়েলসন

3

যদি আমি একটি মামলা থেকে অন্য কেস (বিরল, স্বীকারোক্তি দিয়ে) যাওয়ার প্রয়োজন বোধ করি তবে আমি খুব স্পষ্ট এবং পছন্দ করতে পছন্দ করি goto case অবশ্যই এটি ধরে নেয় যে আপনার ভাষা এটি সমর্থন করে।

যেহেতু পতন এতটা অস্বাভাবিক, এবং কোড পড়ার সময় উপেক্ষা করা খুব সহজ, আমি মনে করি এটি সুস্পষ্টভাবে বলা উপযুক্ত - এবং একটি গোটো, এমনকি যদি এটি কোনও ক্ষেত্রে হয় তবে এটি গলাতে থাকা অঙ্গুরের মতো দাঁড়ানো উচিত।

কেস স্টেটমেন্টগুলি পুনরায় সাজানোর সময় ঘটে যাওয়া বাগগুলি এড়াতেও এটি সহায়তা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.