ব্যতিক্রমের পরে অন্য একটি ব্যবহার করুন (বা না)


9

কোড এই বিট বিবেচনা করুন:

if (x == 1)
{
  throw "no good; aborting" ;
}

[... more code ...]

এখন এই কোডটি বিবেচনা করুন:

if (x == 1)
{
  throw "no good; aborting" ;
}
else
{
  [... more code ...]
}

দুটি মামলা একইভাবে কাজ করে। প্রথম কেসটির সুবিধা রয়েছে যে আপনাকে একটি কোডে বাকী কোডটি "encase" করতে হবে না else। দ্বিতীয়টির স্পষ্টভাবে elseপ্রত্যেকের জন্য একটি অনুশীলন অনুসরণ করার সুবিধা রয়েছে if

কেউ কি একে অপরের পক্ষে পক্ষে কোনও শক্ত যুক্তি সরবরাহ করতে পারে?


5
আপনি যে অনুশীলনটি সুস্পষ্টর পক্ষে তুলে ধরেন তা elseবোকাস বলে মনে হয়। বেশিরভাগ ক্ষেত্রে, elseআপনি পিছন দিকে বাঁকানো না হলে কেবল এই ব্লকটিতে কিছুই রাখার কিছুই নেই ।

সমন্নয়? কোড পরিবর্তনের মুখে দৃust়তার অনুমতি দিন? পঠনযোগ্যতার?
থমাস এডিং

1
এহহহ, আমি এই ধারণাটির এত বেশি অনুরাগী নই যে প্রত্যেকের ifএকটি প্রয়োজন else। আমাদের কোডবেসে যে সর্বশেষ প্রোগ্রামার কাজ করেছিল তা সেই কঠোরভাবে অনুসরণ করেছিল ( ভাল, কখনও কখনও ... এটি এক ধরণের স্কিজোফ্রেনিক )। ফলস্বরূপ, else { /* do nothing */ }কোড
লিটারে লিপ্ত হওয়া

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

এটা অন্যরকম। আপনি যদি NET স্ট্যাকের সাথে কাজ করছেন তবে রিশার্পার ইনস্টল করার চেয়ে এবং এটি আপনাকে সমস্ত বিব্রত বিবৃতি মুছে ফেলার জন্য মনে করিয়ে দেবে।
কোডার্ট

উত্তর:


16

নিঃশর্তভাবে নিয়ন্ত্রণ প্রবাহকে বিরতি দেয় এমন শাখাগুলির elseপরে আপনার যুক্ত করা উচিত নয় , যেমন একটি বা ক রয়েছে । এটি শাখার দ্বারা প্রবর্তিত বাসা বাঁধার অপ্রয়োজনীয় স্তরটি সরিয়ে আপনার প্রোগ্রামের পঠনযোগ্যতা উন্নত করবে ।ifthrowreturnelse

একটি একক দিয়ে আরও কম throwকিছুর ঠিক দেখা যায় সত্যই কুরুচিপূর্ণ হয়ে ওঠে যখন কয়েকটি সারিতে নিক্ষেপ করা হয়:

void myMethod(int arg1, int arg2, int arg3) {
    // This is demonstrably ugly - do not code like that!
    if (!isValid(arg1)) {
        throw new ArgumentException("arg1 is invalid");
    } else {
        if (!isValid(arg2)) {
            throw new ArgumentException("arg2 is invalid");
        } else {
            if (!isValid(arg3)) {
                throw new ArgumentException("arg3 is invalid");
            } else {
                // The useful code starts here
            }
        }
    }
}

এই স্নিপেট একই কাজ করে তবে এটি আরও ভাল দেখাচ্ছে:

void myMethod(int arg1, int arg2, int arg3) {
    if (!isValid(arg1)) {
        throw new ArgumentException("arg1 is invalid");
    }
    if (!isValid(arg2)) {
        throw new ArgumentException("arg2 is invalid");
    }
    if (!isValid(arg3)) {
        throw new ArgumentException("arg3 is invalid");
    }
    // The useful code starts here
}

+1 সত্য। দ্বিতীয় ওপি কেস আপনাকে মনোযোগ সহকারে পড়তে বাধ্য করে, তারপরে আপনাকে ডাব্লুটিএফ দিয়ে দেয়। তবে ... সবসময় পদ্ধতিগুলি সংক্ষিপ্ত করার চেষ্টা করুন। 200 লাইনের পদ্ধতির মাঝখানে ফিরে আসাও খারাপ।
তুলাইনস কর্ডোভা

1
ন্যায়সঙ্গত হওয়ার জন্য, আপনি যদি কেবলমাত্র পুনরাবৃত্তি ব্যবহার করেন তবে আপনি এটি করতে পারেন else if
গুভান্তে

2
@ গুভান্তে: প্রতিটি ifএকক শর্তের জন্য পরীক্ষা করে এবং শর্তটি সত্য হলে তা মোকাবেলা করে এবং শর্তটি মিথ্যা হলে এমন কোনও বিকল্প বিষয় না ঘটে else ifযা অপ্রয়োজনীয়। ড্যাসব্লিংকনলাইটের প্রথম স্নিপেটের মতো কোডের জন্য আমাদের অফিসের চারপাশে একটি শব্দ রয়েছে: " পাচিনকো মেশিনগুলি।"
blrfl

@ ব্লারফ্লেল পাচিনকো মেশিন হ্যাঁ, নিখুঁত উপমা +1
জিমি হোফা

@ ব্লারফ্লাল: আমি উল্লেখ করছিলাম যে পুনরাবৃত্তি করা ifs খুব বেশি বাসা বাঁধার খারাপ উদাহরণ। আপনার যাইহোক, যদি বার বার বাসা বাঁধে না। আমি সম্মত হই যে সাধারণভাবে আপনি যদি সামান্য পরিমাণের কোডের কথা না বলছেন তবে এর অন্তর্ভুক্ত করার কোনও কারণ নেই else
গুভান্তে

5

আপনি "স্পষ্টত অন্যথায়" অনুশীলনটিকে কল করুন যা আপনি বিরোধী-প্যাটার্ন হিসাবে উল্লেখ করেছেন, কারণ এটি যদি আপনার সত্যিকারের ক্ষেত্রে অন্য কোনও হিসাবে বিশেষ-কেস কোড না থাকে তবে এটি অস্পষ্ট করে।

পাঠযোগ্যতা / রক্ষণাবেক্ষণযোগ্যতা সাধারণত উন্নত হয় যখন আপনার বেশিরভাগই প্রয়োজনীয় কোড-প্রবাহের নির্মাণ ছাড়া কিছুই থাকে না এবং আপনি সেগুলি হ্রাস করেন them এর অর্থ অনর্থক এলিস এবং যদি এটি সম্পূর্ণ ক্রিয়ায় একটি সুযোগ যুক্ত করে তবে তা অনুসরণ করা এবং এটি আরও কঠিন রাখা maintaining

উদাহরণস্বরূপ বলুন আপনার এই ফাংশন রয়েছে:

public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
    if (_validColors.Contains(oblogonToConfigure.Color))
    {
        oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
    }
    else
    {
        oblogonToConfigure.Color = _validColors[0];
        oblogonToConfigure.ColorIndex = 0;
    }
}

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

public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
    if (!_validOblogons.Contains(oblogonToConfigure.Type))
    {
        oblogonToConfigure.Type = _validOblogons[0];
        oblogonToConfigure.TypeIndex = 0;
        if (_validColors.Contains(oblogonToConfigure.Color))
        {
            oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
        }
        else
        {
            oblogonToConfigure.Color = _validColors[0];
            oblogonToConfigure.ColorIndex = 0;
        }
    }
    else
    {
        oblogonToConfigure.TypeIndex = _validOblogons.IndexOf(oblogonToConfigure.Type);
    }
}

মূল কোডটি ন্যূনতম নিয়ন্ত্রণ প্রবাহের কাঠামোগত প্রয়োজনীয় এবং ন্যূনতম সংস্থাগুলির সাথে লিখিত থাকলে এটির সাথে তুলনা করুন।

public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
    if (!_validColors.Contains(oblogonToConfigure.Color))
    {
        oblogonToConfigure.Color = _validColors[0];
    }

    oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}

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

আমি জানি, উদাহরণটি কিছুটা সংশ্লেষিত, তবে আমি বহুবার দেখেছি

SomeFunction()
{
    if (isvalid)
    {
        /* ENTIRE FUNCTION */
    }
    /* Nothing should go here but something does on accident, and an invalid scenario is created. */
}

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

SomeFunction()
{
    if (!isvalid)
    {
        /* Nothing should go here, and it's so small no one will likely accidentally put something here */
        return;
    }

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