আমার যদি সুইচ স্টেটমেন্ট ব্যবহার করা উচিত বা দীর্ঘ হয় ... অন্য শৃঙ্খলা?


36

প্রায়শই আমি যখন স্যুইচ বিবৃতিটি শুনি, এটি দীর্ঘস্থায়ী করার উপায় হিসাবে বন্ধ হয়ে যায় ... অন্য শৃঙ্খলাগুলি। তবে মনে হচ্ছে আমি যখন স্যুইচ স্টেটমেন্টটি ব্যবহার করি তখন আমি আরও কোড লিখছি যে আমি অন্যথায় লিখছি ... আপনার কাছে অন্যান্য সমস্যাও রয়েছে যেমন সমস্ত কলগুলির জন্য একই সুযোগে সমস্ত ভেরিয়েবল রাখে

এখানে কিছু কোড রয়েছে যা আমি সাধারণত লেখার প্রবাহকে উপস্থাপন করে ( ডায়মকে ধন্যবাদ )

String comment;   // The generated insult.
int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

if (which == 0) {
    comment = "You look so much better than usual.";
} else if (which == 1) {
    comment = "Your work is up to its usual standards.";
} else if (which == 2) {
    comment = "You're quite competent for so little experience.";
} else {
    comment = "Oops -- something is wrong with this code.";
}

তারপরে তারা চায় যে আমি এটির সাথে এটি প্রতিস্থাপন করবো:

String comment;   // The generated insult.
int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

switch (which) {
    case 0:  
             comment = "You look so much better than usual.";
    break;
    case 1:  
             comment = "Your work is up to its usual standards.";
    break;
    case 2:  
             comment = "You're quite competent for so little experience.";
    break;
    default: 
             comment = "Oops -- something is wrong with this code.";
}

আরও অনেক বিশ্রী সিনট্যাক্সে অনেক বেশি কোডের মতো মনে হচ্ছে। তবে স্যুইচ স্টেটমেন্টটি ব্যবহার করার কি আসলেই সুবিধা আছে?


বিতৃষ্ণা। হ্যাঁ, এটি অবশ্যই বাল্কিয়ার, তবে কেবল সি পরিবারে, কারণ এর ক্ষেত্রে বিবৃতিগুলির বাক্য গঠনটি এতই কুৎসিত।
ম্যাসন হুইলার 21

5
এই ধরণের জিনিসটি স্ট্যাকওভারফ্লোতে প্রচুর আলোচনা করা হয়েছে: - স্ট্যাকওভারফ্লো / সিকিউশনস / 9৪৯২73৩/২
ইয়েজেনি ব্রিকম্যান

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

কমপক্ষে নেট এ স্যুইচ দ্রুত হয়। আমি জাভা সম্পর্কে জানি না।
কেনার্ড

কেস এবং পদ্ধতিগুলির একটি অভিধান এবং একটি "যদি"
পাভেল ইয়ারমালোভিচ

উত্তর:


57

এই নির্দিষ্ট পরিস্থিতির জন্য, এটি আমার কাছে মনে হয় ifএবং এটি উভয়ই caseদুর্বল পছন্দ। আমি একটি সাধারণ অ্যারে ব্যবহার করব:

String comments[] = {
    "You look so much better than usual.",
    "Your work is up to its usual standards.",
    "You're quite competent for so little experience."
};

String comment = comments[(int)(Math.random() * 3)];

পার্শ্ব নোট হিসাবে, আপনার হার্ড কডিংয়ের পরিবর্তে অ্যারের আকারের ভিত্তিতে গুণকটি গণনা করা উচিত 3

আপনি কখন কেস / স্যুইচ ব্যবহার করবেন , ifবিবৃতিগুলির ক্যাসকেডের (বা কমপক্ষে একটি বড় পার্থক্য) থেকে পার্থক্য হ'ল switchমানগুলির সংখ্যা এবং ঘনত্বের উপর ভিত্তি করে আধা-স্বয়ংক্রিয়ভাবে অনুকূলিত করতে পারে, অন্যদিকে ifবিবৃতিগুলির একটি ক্যাসকেড সংকলককে ছেড়ে যায় আপনি যেমনটি লিখেছেন তেমন কোড তৈরি করার সাথে সামান্য পছন্দ সহ, কোনও মান খুঁজে না পাওয়া পর্যন্ত একের পর এক মান পরীক্ষা করে। কেবলমাত্র তিনটি বাস্তব ক্ষেত্রে এটি একটি উদ্বেগের বিষয় নয়, তবে পর্যাপ্ত সংখ্যা সহ এটি / তা উল্লেখযোগ্য হতে পারে।


সেই উদাহরণটি কেবল বিটিডাব্লু ছিল। যদিও জানা ছিল না যে
সংকলকটি এর

6
@JBRWilkinson। এই ক্ষেত্রে, সীমার মান কেবলমাত্র একটি সংকলক বাগের মাধ্যমে সম্ভব, যা আমি বেশি সময় ব্যয় করতে পছন্দ করি না (ফলাফলটি পরীক্ষা করার জন্য আমার কোডের একটি বাগটি উত্পন্ন কোডের মতোই সম্ভবত)। এমন পরিস্থিতিতে যেখানে সীমাবদ্ধতার বাইরে মূল্য হ'ল আসল উদ্বেগ ছিল (উদাঃ, অন্য কোড থেকে সূচকটি প্রাপ্ত হচ্ছিল) আমি প্রথমে সীমাটি চেক করব এবং কেবলমাত্র পরীক্ষার পরে এটি সূচক হিসাবে ব্যবহার করব।
জেরি কফিন

4
আমি মনে করি এই উত্তরটি উদাহরণের ক্ষেত্রে খুব সুনির্দিষ্ট, যখন প্রশ্নটি তার চেয়ে সাধারণ ছিল ...
খেলাবেন

3
@ খেলাবেন: আমার কাছে মনে হচ্ছে আপনি পুরো উত্তরটি পড়তে বিরক্ত করলেন না। সর্বশেষ অনুচ্ছেদটি আরও বিস্তৃত সমস্যাগুলিকে সম্বোধন করে। আমি খুঁজে: একটি সমস্যা যদিও এখন পর্যন্ত খুব কম যা আমি বিবেচনা পরিস্থিতিতে পারেন একটি caseবিবৃতি অথবা একটি ক্যাসকেড ifউপযুক্ত বিবৃতি। বেশিরভাগ সময়, তারা কোনও ধরণের মানচিত্র / অ্যারের ধরণের জিনিস (মাঝারি) হয়ে থাকে এবং আপনি পরবর্তীগুলির মধ্যে সরাসরি ব্যবহার করা ভাল।
জেরি কফিন

1
@ টিটু: কম্পাইলারটি পুরোপুরি ব্রেনিডেড না হওয়া পর্যন্ত অ্যারে একবার সংকলনের সময় তৈরি করা হবে এবং এর পরে আপনি কেবল একটি স্থির কাঠামো ব্যবহার করছেন। উদাহরণস্বরূপ, আপনি যদি সি বা সি ++ তে static constএটি করছিলেন তবে আপনি সর্বদা বিদ্যমান ছিলেন তা নিশ্চিত করতে আপনি এটিটিকে একটি অ্যারে তৈরি করতে চান (তবে কোনও প্রশ্নের প্রশ্নে কোনও ভাষা দেওয়া হয়নি, তাই আমি উত্তরের মধ্যে একটিও অনুমান করার চেষ্টা করিনি )।
জেরি কফিন

23

if...else if...চেইনের সমস্যাটি হ'ল আমি যখন এটি পড়তে আসি তখন ifপ্রোগ্রামটি কী করছে তা বুঝতে আমার প্রতিটি একক শর্তটি দেখতে হবে। উদাহরণস্বরূপ, আপনার কাছে এরকম কিছু থাকতে পারে:

if (a == 1) {
    // stuff
} else if (a == 2) {
    // stuff
} else if (a == 3) {
    // stuff
} else if (b == 1) {
    // stuff
} else if (b == 2) {
    // stuff
}

(স্পষ্টতই, এই জাতীয় সংখ্যার বিবৃতিতে এটি এত খারাপ নয়)

আপনি প্রতিটি একক স্টেটমেন্ট না পড়েই আপনি শর্তটি পরিবর্তনশীল অর্ধপথে পরিবর্তন করেছেন তা জানার উপায় নেই। তবে, switchকেবলমাত্র আপনাকে একক অবস্থার পরিবর্তনশীলের মধ্যে সীমাবদ্ধ রাখার কারণে , আমি কী ঘটছে তা এক নজরে দেখতে পাচ্ছি।

দিনের শেষে, যদিও আমি switchবা একটি চেইন পছন্দ করি না if...else if। মূল প্রশ্ন বা পলিমারফিজম (যেমন আপনার ভাষা এটি সমর্থন করে) এর ক্ষেত্রে প্রায়শই একটি ভাল সমাধান হ'ল এক ধরণের জাম্প টেবিল বা অভিধান। অবশ্যই এটি সবসময় সম্ভব নয়, তবে আমি এমন একটি সমাধান চাই যা switchপ্রথম পদক্ষেপ হিসাবে এড়ানো ...


4
বহুকর্মের কোডটি পৃথকীকরণের অসুবিধা রয়েছে, এটি একটি অবস্থানের তুলনায় তুলনামূলকভাবে বোঝা শক্ত করে তোলে। সুতরাং আপনি এটি পরিবর্তন করার আগে কিছুটা দ্বিধা করতে পারেন।

কেন একটি লাফ টেবিল / অভিধান একটি স্যুইচ চেয়ে ভাল?
টাইটু

14
switch (which) {
  case 0: comment = "String 1"; break;
  case 1: comment = "String 2"; break;
  case 2: comment = "String 3"; break;
  default: comment = "Oops"; break;
}

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

যেমন অন্যরা ইতিমধ্যে উল্লেখ করেছে, একটি স্যুইচ কেস অভিপ্রায়টিকে আরও স্পষ্ট করে তোলে, আপনি একটি একক ভেরিয়েবল / এক্সপ্রেশনের মানের ভিত্তিতে সিদ্ধান্ত নিতে চান। আমার মন্তব্যগুলি নিখুঁতভাবে পঠনযোগ্যতার দৃষ্টিকোণ থেকে এবং পারফরম্যান্স ভিত্তিক নয়।


1
আপনি যদি কোনও পদ্ধতিতে স্যুইচটি রাখেন এবং প্রতিটি ক্ষেত্রে returnযথাযথ স্ট্রিং থাকে তবে আপনি breakবিবৃতিগুলি মুছে ফেলতে পারেন ।
রবার্ট হার্ভে

আপনার সমাধানটিও দ্রুততম।
টাইটু

8

এক্ষেত্রে স্যুইচ স্টেটমেন্টটি কোডের উদ্দেশ্যকে আরও স্পষ্টভাবে মেলে: একক মানের উপর ভিত্তি করে নিতে কোনও পদক্ষেপ বেছে নিন।

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


8

আমি জেরির সাথে একমত হয়েছি যে এই বিশেষ ক্ষেত্রেটির জন্য একটি অ্যারের স্ট্রিং ভাল, তবে সাধারণভাবে অন্য জালগুলির শৃঙ্খলার চেয়ে সুইচ / কেস স্টেটমেন্ট ব্যবহার করা ভাল। এটি পড়া সহজ, এবং কখনও কখনও সংকলক সেভাবে অনুকূলকরণের আরও ভাল কাজ করতে পারে তবে এর পাশাপাশি আরও একটি সুবিধা রয়েছে: এটি ডিবাগ করা অনেক সহজ।

আপনি যখন সেই স্যুইচটি আঘাত করেন, আপনাকে একবারে একবারে বিবৃতি দেওয়া হলে সাবধানতার সাথে বেশ কয়েকটি পদক্ষেপ নেওয়ার পরিবর্তে ডান শাখায় পৌঁছানোর জন্য কেবল একবারে পদক্ষেপ নিতে হবে এবং সম্ভবত কীটি খুব তাড়াতাড়ি আঘাত করা এবং এটি পেরিয়ে যাওয়া এবং কিছু হারিয়ে যাওয়া এবং থাকা আবার শুরু করতে।


3

আমি এই জাতীয় ক্ষেত্রে স্যুইচ করতে পছন্দ করি, এটি কোডের পয়েন্টের সাথে আরও ভাল মেলে, প্রতিটি পৃথক ইনপুট মানের জন্য একটি পৃথক বিবৃতি কার্যকর করে। if..elseএকটি "কৌতুক" একই প্রভাব অর্জন আরো ভালো কাজ করে।

switch বিবৃতিগুলিও পরিষ্কার, এটি সমস্ত মধ্যে একটি টাইপো লুকানো সহজ ==

এছাড়াও, সি বড় ব্লকের জন্য, স্যুইচ দ্রুত হয়।

else..ifযখন আপনার কাছে রেঞ্জগুলির মতো কিছু থাকে (1 থেকে 100 এর মধ্যে এটি করুন, 100 থেকে 200 এর মধ্যে এটি করুন) বা সিতে যখন আপনি স্ট্রিংয়ের মতো উপাদানগুলির সাথে স্যুইচ করার চেষ্টা করেন (অন্য ভাষায় এটি সম্ভব) যা একই রকম।

আমি সি তে প্রোগ্রাম করার সময় আমার প্রচুর সুইচ ব্যবহার করার প্রবণতা থাকে


2

দক্ষ, সংশ্লেষযোগ্য এবং এমন কিছু বেছে নিন যা কেবল আপনার কাজটিই নয়, কেন ডকুমেন্ট করে

কোডটি পুনর্বিবেচনা করা যেতে পারে এবং সর্বদা এটির মূল লেখক নয়।

এমন অনেক সময় রয়েছে যখন আপনি ইচ্ছাকৃতভাবে অন্যটির উপর একটি বাস্তবায়ন বেছে নিতে পারেন কারণ আপনি যে কোডটি বিদ্যমান নেই তার বিষয়ে এগিয়ে ভাবছেন thinking


2

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

আমি ব্যক্তিগতভাবে সেই ধরণের কোডটি একটি পৃথক সহায়ক পদ্ধতিতে মোড়ানো করব।

private string GetInsult()
{
    int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

    switch (which) {
        case 0: return "You look so much better than usual.";
        case 1: return "Your work is up to its usual standards.";
        case 2: return "You're quite competent for so little experience.";
        default: return "Oops -- something is wrong with this code.";
    }
}

public void Foo()
{
    string comment = GetInsult();
    Print(comment);
}

একটি পৃথক পদ্ধতিতে স্যুইচ স্থাপনের ফলে আপনি সরাসরি স্টিচ স্টেটমেন্টের অভ্যন্তরে রিটার্ন স্টেটমেন্ট স্থাপন করতে পারবেন (কমপক্ষে সি # তে) হয়, ব্রেক স্টেটমেন্টের প্রয়োজনীয়তা হ্রাস করে, কোডটি পড়া সহজ করে তোলে।

এবং এটি যদি / অন্যটি যদি / অন্যথায় কাছে আসে তবে এটি খুব সুন্দর।


3
জিনিসগুলি সমাধান করার উপায়টিকে আমি ব্যক্তিগতভাবে "এটিকে অন্য পদ্ধতিতে রেখেছি কারণ এটি দেখতে কুৎসিত দেখাচ্ছে" ঘৃণা করি। বিশৃঙ্খলা পদ্ধতি তালিকা এবং দেখতে আরও খারাপ আইএমএইচও। আমি কেবল এটিই করব যদি ক) কোডটি অন্য কোথাও অনুলিপি করা হয় বা খ) অন্য কোথাও দরকারী হতে পারে
TheLQ

1
কোন পদ্ধতি তালিকা? এবং কেন আপনার পদ্ধতির তালিকাটি আপনার কোডের বিশৃঙ্খলার চেয়ে খারাপ বিশৃঙ্খলাযুক্ত হচ্ছে? আমি ভেবেছিলাম আমরা "সবকিছুকে একটি একক পদ্ধতিতে রাখি যাতে আপনি একবারে সবকিছু দেখতে পান"
সারা

@TheLQ আমি সাধারণভাবে আপনার সাথে একমত, কিন্তু এই ক্ষেত্রে "মন্তব্য =" সত্যই পিট এর প্রস্তাব দ্বারা সন্ধান করা হয়।
টাইটু

0

পাইথনে, কোনও সুইচ স্টেটমেন্ট নেই, কারণ যদি / এলিফ / অন্যথায় সুন্দর হয়:

a = 5

if a==1:
    print "do this"
elif a == 2:
    print "do that"
elif a == 3:
    print "do the other"
elif 3 < a < 9:
    print "do more"
elif 9 <= a < 15:
    print "do nothing"
else:
    print "say sorry"

সহজ?


Elifকয়েকটি অক্ষর না পাওয়া মাত্র একটি বিবৃতি। এটি অবশ্যই ifএকটি স্যুইচ স্টেটমেন্টের চেয়ে স্টেটমেন্টের মতো। পাইথনের কোনও পরিবর্তন নেই যা তাদের (যারা আমার মত) ঘৃণা করে তাদের মনে হয় যে তারা একা নয়।
ড্যান রোজনস্টার্ক

পাইথন ফর্ম্যাটিং স্ট্যাকওভারফ্লোতে কাজ করে তবে প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ ডটকমে নয় :(
ক্রিস্টোফার মহান

metaএটি কোনও পরিচিত বিষয় না হওয়া পর্যন্ত তাদের এ বিষয়ে সতর্ক করা উচিত । আমাকে সাক্ষী দেওয়ার জন্য ধন্যবাদ
ড্যান রোজনস্টার্ক


1
@ ইয়ার, আমার উইকিপিডিয়া অ্যাডমিনের দিনগুলি আমাকে মনে করিয়ে দেয় ... ওহ জয়। (আমি কি এখনও পুরোপুরি অফ-টপিক?)
ক্রিস্টোফার মাহান

0

সি / সি # শৈলীর switchবিশেষত বিরক্তিকর জিনিসগুলির মধ্যে একটি হ'ল caseমান আক্ষরিক হওয়ার জন্য জোর দেওয়া । ভিবি / ভিবি.এনইটি সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল select/caseপ্রতিটি ক্ষেত্রে কোনও বুলিয়ান এক্সপ্রেশন হতে পারে। যে সুবিধাজনক। পারস্পরিক এক্সক্লুসিভ বুলিয়ান এক্সপ্রেশনগুলির একটি সিরিজ হিসাবে ইনসোফার প্রায়শই সহায়ক, যদি / অন্য ifs আরও নমনীয় হয় তবে টাইপ করা এবং পড়ার ক্ষেত্রে আরও দক্ষ হওয়ার কথা উল্লেখ না করা a

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