কীভাবে একাধিক ক্ষেত্রে পতাকা পরিচালনা করতে হয়


10

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

If variable == A
    if (Flag == true)
        doFooA()
    else
        doFooA2

else if variable == B
    if (Flag == true)
        doFooB()
    else
        doFooB2
else if variable == C
    if (Flag == true)
        doFooC()
    else
        doFooC2

এটি "ফ্যাক্টর" করার একাধিক উপায় রয়েছে বলে মনে হয় যেমন ইফ-এলেসের 2 সেট, যেখানে পতাকা সেট == সত্য হলে কোনও সেট পরিচালনা করে।

এটির কারণ নির্ধারণের জন্য কি কোনও "ভাল উপায়" রয়েছে, বা সম্ভবত যদি অন্য কোনও অ্যালগোরিদম ঘটে তখন এর অর্থ সাধারণত আপনি কোনও ভুল করছেন?


6
পতাকাটি নিজেই ডিলফক্সের সাথে ডিল করতে পারে এমনটি কি ফ্ল্যাগ ভেরিয়েবলটি পাস করা সম্ভব?
জিন-ফ্রান্সোইস কেটি

নিশ্চিত তবে তারপরে আপনার কাছে একটি পদ্ধতি doFooX আছে, যা পতাকাটি সত্য কিনা তা নির্ধারণ করে এবং তারপরে doFooX1 বা doFooX2 করেন
সত্যআউট 42

5
আইএমএইচও, এটি পড়ার জন্য আরও স্পষ্ট হবে। তারপরে এটি doFooA এবং doFooA2 কী করে তা নির্ভর করে ...
জিন-

2
if (Flag == true)শুধু লেখার চেয়ে লেখেন কেন If (Flag)? আপনি যদি মনে করেন যে If (Flag == true)এটি ভাল, তবে কেন নয় if ((Flag == true) == true)?
কিথ থম্পসন

1
নীচের বেশিরভাগ উত্তর থেকে সর্বাধিক গুরুত্বপূর্ণ গ্রহণযোগ্যতা হ'ল লজিক্যাল প্রবাহের কথা এবং ভবিষ্যতে কোডটি বজায় রাখার ক্ষেত্রে চালাক কৌশলগুলির চেয়ে সরলতা এবং সুগঠনতা অনেক বেশি গুরুত্বপূর্ণ
প্যাট্রিক হিউজেস

উত্তর:


18

এটি পলিমারফিজম দিয়ে পরিচালনা করা যেতে পারে।

factory(var, flag).doFoo();

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

হতে পারে আপনি একটি কী / মানচিত্র তৈরি করতে পারেন যেখানে কীটি বৈচিত্র্যযুক্ত / পতাকা, এবং মানটি হ'ল ফাংশন।

do[var, flag]();

2
+1: প্রায় প্রতিটি সময় সারণী দর্শনগুলি নেস্টেড যদি বয়ান হয় beat
কেভিন ক্লাইন

1
আমি বলতে চাই এটিই সেরা সমাধান।
মাফিন ম্যান

6

একাধিক নেস্টেড ifs কোডটির সাইক্লোমেটিক জটিলতা বৃদ্ধি করে। সাম্প্রতিক অবধি, কোনও কার্যক্রমে একাধিক বহির্গমন পয়েন্ট থাকা খারাপ কাঠামোগত কোডের সমাহার ছিল, তবে এখন পর্যন্ত কোডটি সহজ এবং সংক্ষিপ্ত , আপনি কোডটি তুচ্ছ করে তুলতে পারেন:

    if (variable == A && Flag) {
        doFooA();
        return;
    }

    if (variable == A) {
        doFooA2();
        return;
    }

    if (variable == B && Flag){
        doFooB();
        return;
    }

    if (variable == B){
        doFooB2();
        return;
    }

    if (variable == C && Flag){
         doFooC();
         return;
    }

    if (variable == C){
         doFooC2();
    }

    return;

3

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


if (flag)
{
    switch (variable)
    {
        case A:
           ... blah
           break;

        case B:
           ... blah
           break;

        case C:
           ... blah
           break;

        default:
           ... log an error.
           ... maybe do a default action.
           break;
    }
}
else // flag == false
{
    switch (variable)
    {
        case A:
           ... blah
           break;

        case B:
           ... blah
           break;

        case C:
           ... blah
           break;

        default:
           ... log an error.
           ... maybe do a default action.
           break;
}

0

ঠিক আছে, সবসময় এই ...

if variable == A && Flag
    doFooA()
else if variable == A 
    doFooA2    
else if variable == B && Flag
    doFooB()
else if variable == B
    doFooB2
else if variable == C && Flag
     doFooC()
else if variable == C
     doFooC2

তবে প্রকৃতপক্ষে, আমি মনে করি যে আসল কোডটি প্রথম স্থানে অর্ধেক খারাপ নয়।


0

পলিমারফিজম এবং একটি ruleঅ্যারে ব্যবহার করুন

interface IRule() {
  boolean applicable(args...);
  obj apply(args...);
}

static final Array<IRule> rules = [new MeaningfulNameRule1(), new MeaningfulNameRule2(), ...];

/* where */
class MeaningfulNameRuleX extends IRule{ /* */ }

/* In your method */

for (rule in rules) {
  if (rule.applicable(a,b,c)){
    return rule.apply(e,f,g);
  }
}

বা mike30প্রস্তাবিত হিসাবে : যদি নিয়মের শর্তগুলি সহজেই একটি কী তৈরি করতে পারে তবে হ্যাশম্যাপই যাওয়ার সর্বোত্তম উপায়।

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