স্যুইচ স্টেটমেন্ট - ডিফল্ট কেস হ্যান্ডলিং যখন এটি পৌঁছানো যায় না


15

যদি আমি কোনও এনাম (যা আমার শ্রেণীর মালিকানাধীন) থেকে মানগুলি হ্যান্ডেল করতে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করছি এবং প্রতিটি সম্ভাব্য মানের জন্য আমার একটি কেস আছে - "ডিফল্ট" কেস হ্যান্ডেল করার জন্য এটি কোড যুক্ত করা কি উপযুক্ত?

enum MyEnum
{
    MyFoo,
    MyBar,
    MyBat
}

MyEnum myEnum = GetMyEnum();
switch (myEnum)
{
    case MyFoo:
        DoFoo();
        break;
    case MyBar:
        DoBar();
        break;
    case MyBat:
        DoBat();
        break;
    default:
        Log("Unexpected value");
        throw new ArgumentException() 
}

আমি মনে করি না কারণ এটি এই কোডটি কখনই পৌঁছাতে পারে না (এমনকি ইউনিট পরীক্ষার সাথেও)। আমার সহকর্মী একমত নন এবং মনে করেন এটি মাইএনমে নতুন মান যুক্ত হওয়ার কারণে ঘটে যাওয়া অপ্রত্যাশিত আচরণের বিরুদ্ধে আমাদের সুরক্ষা দেয়।

আপনি কি বলেন, সম্প্রদায়?


ধরা যাক মাইইনাম একটি অ-অযোগ্য প্রকার।
এসডি

3
"আজ" এটি অযোগ্য ul আগামীকাল কী হবে যখন আপনি আর কোড বজায় রাখছেন না। অথবা এনামগুলিতে "মাইবিজ" যুক্ত হলেও কী হবে না? রক্ষণাবেক্ষণ সম্পর্কে কালেবের মন্তব্যগুলি খুব জার্মানি।

1
আপনার সংকলকটিকে শিখিয়ে দিন যে যদি কোনও সুইচ সমস্ত ক্ষেত্রে আবরণ না করে তবে এটি মারাত্মক ত্রুটি।

যদি কেউ কোনও অবৈধ মান কাস্ট করে তবে তা যদি MyEnumআপনার সুইচ দিয়ে যায়?
মাওগ বলছেন মনিকা

1
কী ভাষা? যদি জাভা হয়, আপনার এনামের ভিতরে কোনও পদ্ধতি রাখা উচিত এবং switchপুরোপুরি বিবৃতিটি মুছে ফেলা এটিকে (পলিমারফিজম) কল করা উচিত ।
user949300

উত্তর:


35

ডিফল্ট কেস সহ আপনার কোড কাজ করার পদ্ধতি পরিবর্তন করে না তবে এটি আপনার কোডটিকে আরও রক্ষণাবেক্ষণযোগ্য করে তোলে। কোডটিকে একটি সুস্পষ্ট উপায়ে বিভক্ত করে (একটি বার্তা লগ করুন এবং একটি ব্যতিক্রম ছুঁড়ে দিন), আপনি ইন্টার্নের জন্য একটি বড় লাল তীর যুক্ত করছেন যেটি আপনার গ্রীষ্মে পরবর্তী গ্রীষ্মে কয়েকটি বৈশিষ্ট্য যুক্ত করার জন্য ভাড়া করে। তীরটি বলে: "আরে, আপনি! হ্যাঁ, আমি আপনার সাথে কথা বলছি! আপনি যদি এনামের সাথে অন্য কোনও মূল্য যুক্ত করতে চলেছেন তবে আপনি এখানে আরও একটি মামলা যুক্ত করতে চান" " এই অতিরিক্ত প্রচেষ্টা সংকলিত প্রোগ্রামে কয়েকটি বাইট যুক্ত করতে পারে, যা বিবেচনার জন্য। তবে এটি কাউকে বাঁচাতে পারে (সম্ভবত ভবিষ্যত আপনিও) কোথাও এক ঘন্টা থেকে এক দিনের মধ্যে অনুপাতহীন মাথা চুলকানো।


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

Enumeration value 'MyBaz' not handled in switch

সংকলকটিকে অনাবৃত কেসগুলি সনাক্ত করতে দেওয়া হ'ল এটি defaultআপনার কাছে প্রথম প্রশ্নে অনুপ্রাণিতযোগ্য মামলার প্রয়োজনীয়তা হ্রাস করে যা আপনার প্রশ্নকে প্রথমে অনুপ্রাণিত করে।


2
ঠিক আছে, আপনি আমাকে বোঝাতে পেরেছেন :) আমাকে আমার কোড কভারেজ নম্বরগুলিতে কেবল ডেন্টটি গ্রহণ করতে হবে।
এসডি

@st কোনও কারণ নেই যে আপনি এই কোডটি পরীক্ষা করতে পারবেন না। কেবলমাত্র এমন একটি পরীক্ষা তৈরি করুন যা শর্তাধীনভাবে আপনার অঙ্কের একটি অতিরিক্ত মান সংকলন করে এবং তারপরে একটি ইউনিট পরীক্ষা লিখুন। সম্ভবত এটি আদর্শ নয়, তবে সম্ভবত এমন একমাত্র ক্ষেত্রে নয় যেখানে আপনার কোড পরীক্ষা করা দরকার যা সাধারণত কখনও পৌঁছাতে পারে না।
কালেব

অথবা, আপনি আপনার এনাম টাইপের জন্য একটি নন-এনাম মান castালেন এবং এটি ব্যবহার করুন।
মাওগ বলছেন মনিকা

5

আমি আজ সকালে এই বিষয়ে একটি সহকর্মীর সাথেও কথা বলছিলাম - এটি সত্যিই দুর্ভাগ্যজনক, তবে আমি মনে করি যে দুটি কারণে ডিফল্টটি পরিচালনা করা প্রয়োজন সুরক্ষার জন্য:

প্রথমত, আপনার সহকর্মীর উল্লেখ হিসাবে, এটি ভবিষ্যতে-প্রমাণগুলি নতুন মূল্যবোধের বিরুদ্ধে কোডটি এনামগুলিতে যুক্ত করা হচ্ছে। এটি সম্ভবত সম্ভাবনার মতো মনে হয় না তবে এটি সর্বদা থাকে always

আরও গুরুত্বপূর্ণ, ভাষা / সংকলকের উপর নির্ভর করে এমন মানগুলি পাওয়া সম্ভব হতে পারে যা আপনার সুইচড ভেরিয়েবলের এনামের সদস্য নয়। উদাহরণস্বরূপ, সি # তে:

MyEnum myEnum = (MyEnum) 3; // This could come from anywhere, maybe parsed from text?
// ... code goes on for a while

switch ( myEnum )
{
    case MyEnum.A:
        // ... handle A case
        break;
    case MyEnum.B:
        // ... handle B case
        break;
}

// ... code that expects either A or B to have happened

সরল যোগ করে case default:এবং একটি ব্যতিক্রম ছুঁড়ে দিয়ে, আপনি নিজেকে এই অদ্ভুত মামলার বিরুদ্ধে সুরক্ষিত করেছেন যেখানে "কিছু" ঘটে না বরং "কিছু" ঘটেছিল।

দুর্ভাগ্যক্রমে, মূলত যে কোনও সময় আমি আর একটি স্যুইচ স্টেটমেন্ট লিখি, কারণ আমি এনামের ঘটনাগুলি পরীক্ষা করছি। আমি সত্যই কামনা করি "থ্রোল্ট ডিফল্ট" আচরণটি ভাষা দ্বারা প্রয়োগ করা যেতে পারে (কমপক্ষে কোনও কীওয়ার্ড যুক্ত করে)।


3

আপনি কখনই এটির কাছে পৌঁছানোর প্রত্যাশা না করলেও ডিফল্ট কেস যুক্ত করা ভাল জিনিস হতে পারে। আপনার কোডটি প্রোগ্রামের পরে না হয়ে সরাসরি "ব্যতিক্রমী হওয়া উচিত ছিল" ব্যতিক্রম ছুঁড়ে ফেলা, কিছু রহস্যময় ব্যতিক্রম চালিয়ে যাওয়া বা কোনও ত্রুটি ছাড়াই অপ্রত্যাশিত ফলাফল প্রত্যাবর্তন করা হলে এটি ডিবাগিংকে আরও সহজ করে তুলবে।


2

আমি বলি:

এতে অন্য ধরণের যোগ করার চেষ্টা করুন MyEnum। তারপরে এই লাইনটি পরিবর্তন করুন:

MyEnum myEnum = GetMyEnum();

প্রতি

MyEnum myEnum = SomethingElse;

তারপরে আপনার কোডটি ডিফল্ট কেস এবং ডিফল্ট কেস ছাড়াই চালান । আপনি কোন আচরণ পছন্দ করেন?

ডিফল্ট কেস থাকা NULLমানগুলি আটকে রাখা এবং প্রতিরোধের জন্যও কার্যকর হতে পারে NullPointerExceptions


-1

যদি আপনার কোনও ধারণা থাকে যে ডিফল্ট কেসটিতে জোর দিয়ে ম্যাচের সময় কীভাবে বাঁচানো যায় তবে আপনার প্রশ্নটি জিজ্ঞাসা করার দরকার নেই। চুপচাপ কোনও ত্রুটি অবস্থায় কিছুই করা গ্রহণযোগ্য নয়- আপনি কি চুপচাপ ব্যতিক্রমগুলি ধরেন যা কখনই ঘটে না? আপনাকে অনুসরণকারী প্রোগ্রামারদের জন্য "খনি" ফেলে রাখা, একইভাবে অগ্রহণযোগ্য।

যদি আপনার কোডটি কখনই পরিবর্তন বা সংশোধন করা না যায় এবং 100% বাগ মুক্ত হয়, তবে ডিফল্ট কেসটি ছেড়ে দেওয়া ঠিক হতে পারে।

অ্যাডা (শক্তিশালী প্রোগ্রামিং ভাষার দাদা) কোনও এনামের উপর একটি স্যুইচ সংকলন করবে না, যদি না সমস্ত এনামগুলি areাকা থাকে বা কোনও ডিফল্ট হ্যান্ডলার না থাকে - এই বৈশিষ্ট্যটি প্রতিটি ভাষার জন্য আমার ইচ্ছার তালিকায় রয়েছে। আমাদের অ্যাডা কোডিং স্ট্যান্ডার্ড সূচিত করে যে এনামগুলিতে স্যুইচ সহ, সমস্ত মানকে সুস্পষ্টভাবে পরিচালনা করা, কোনও ডিফল্ট ছাড়াই এই পরিস্থিতিটি পরিচালনা করার পক্ষে পছন্দসই উপায়।


কেন সব -1 এর?
mattnz

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