যদি / অন্য বিবৃতিগুলি মামলার বিরলতার সাথে বা সেগুলি মোকাবেলায় অসুবিধা দ্বারা ব্যবস্থা করা উচিত?


18

কিছু কোডে আমি এই মুহুর্তে লিখছি, আমার এরকম কিছু রয়েছে:

if (uncommon_condition) {
    do_something_simple();
} else {
    do();
    something();
    long();
    and();
    complicated();
}

আমার একটি অংশ মনে করে "এটি ঠিকঠাকভাবে ঠিক আছে Simple তবে অন্য একটি অংশ বলে: "না! elseকোডটি এই আইনের অধীনে হওয়া উচিত if, কারণ ifএটি অস্বাভাবিক ক্ষেত্রে elseমোকাবেলা করার জন্য এবং অন্য সমস্ত ক্ষেত্রে ডিল করার জন্য" " কোনটি সঠিক বা অগ্রাধিকারযোগ্য?


4
শর্তাবলী সরলতার / বোঝার দ্বারা আদেশ! বাকিটি অপটিমাইজার, শাখার ভবিষ্যদ্বাণীকারী এবং রিফ্যাক্টরিং যত্ন নিতে পারে।
মার্জন ভেনেমা

এই কারণেই আমরা বড় অঙ্কের অর্থ প্রদান করি: এই কঠিন সিদ্ধান্ত নিতে।

উত্তর:


24

মৃত্যুদন্ড কার্যকর হওয়ার সম্ভাবনা অনুসারে আদেশ করুন। সর্বাধিক সাধারণ, সম্ভবত, ইত্যাদি শর্ত (গুলি) প্রথমে উচিত।

"তাদের সাথে আচরণে অসুবিধা" কোড কোড, বিমূর্ততা ইত্যাদির দ্বারা মোকাবেলা করা উচিত উদাহরণস্বরূপ অন্য ব্লকটি একক পদ্ধতিতে কল করতে পারে রিফেক্টর। আপনি চান যে আপনার ifধারাগুলি একই বিমূর্ত স্তরে থাকুক।

if ( ! LotteryWinner ) {
    GoToWorkMonday();
} else {
    PlanYearLongVacation();
}

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

2
@ মারজানভেনেমা, আমি "নন" আইং সম্পর্কে আপনার পয়েন্টটি দেখতে পাচ্ছি। তবে ডাবল নেগেটিভ হ'ল আসল "নয়" ডাব্লুটিএফ। অন্য দিন আমি আমাদের কোডটিতে এটি ছড়িয়েছি doesNotAllowxxFiles = false। যথেষ্ট খারাপ তবে তারপরে এটি করুনif(! doesNotAllowxxFiles)
রাদারবব

হ্যাঁ, ডাবল নেতিবাচক, নেগেটিভ এবং এবং এর সাথে বা / অথবা এর (এসিক!) নেগেটিভ এবং নাম হিসাবে নয় এমন একটি পদ্ধতি / ভেরির সাথে মিলিত, প্রতিবারই আমার মস্তিষ্ককে একটি মোচড়ে নিয়ে আসে :-)
মার্জান ভেনেমা

কী ঘটছে তা বুঝতে যদি আপনি নিজেকে সমস্যা মনে করেন তবে আমি মনে করি এটি প্রায়শই যেমন কাজ করা কার্যকর হয়: সিমপুল = (! (জটিলবুল || র‌্যান্ডমফ্ল্যাগ)) &&! এলোমেলো ফ্ল্যাজ
ট্রুথঅফ 42

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

5

পাঠযোগ্যতা বাড়ানোর চেষ্টা করুন। একটি উপায় হ'ল লম্বা কোড ব্লকটিকে অন্য অংশে স্থাপন করা।

if (s == null)
     // short code
else 
     // long 
     // code
     // block

এর চেয়ে বেশি পঠনযোগ্য

if (s != null)
    // long
    // code
    // block
else
    // short code

2
কেন এটি আরও পাঠযোগ্য? পাঠযোগ্যতার দিক থেকে আমি উভয়ের মধ্যে কোনও পার্থক্য দেখছি না
জন ডেমেট্রিও

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

4

ব্যবহারের বিষয়ে শুনেছি এমন কোনও নির্দিষ্ট নিয়ম নেই তবে আমি এটি অনুসরণ করি

if(usual)
{
(more often)
}
else (unusual)
{
(rarely occurring)
}

তবে উভয়ের যদি আলাদা আলাদা বৈশিষ্ট্যের সাথে একই ফাংশন থাকে তবে প্রথমে স্বাভাবিকের চেয়ে প্রথমে অস্বাভাবিক হয়ে যান যাতে আপনি একটি নির্দেশিকা সংরক্ষণ করতে পারেন।


if(x == 0)  // 1
  {x = 1;}  // 2
else
  {x = 2;}  // 3

উপরের কোডের জন্য অ্যাসেম্বলি কোড এর কিছু হবে:

1. 000d 837DFC00        cmpl    $0, -4(%ebp)
   0011 7509            jne .L2

2. 0013 C745FC01        movl    $1, -4(%ebp)
   001a EB07            jmp .L3

    .L2:
3.001c C745FC02         movl    $2, -4(%ebp)

        .L3:

যদি ভিতরে অবস্থার সত্য হয় তবে প্রবাহটি 1-> 2 (4 অনুপ্রবেশ) হয়
যদি ভিতরে শর্তটি মিথ্যা হয় তবে প্রবাহ 1-> 3 (3 অনুপ্রবেশ) হয়

সুতরাং অন্য অংশে এবং স্বাভাবিক অবস্থায় যদি অস্বাভাবিক বা বিরল ঘটনা ঘটতে থাকে তবে যাতে আমরা প্রতিবার একটি নির্দেশ সংরক্ষণ করতে পারি তার চেয়ে ভাল;


2

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

if(gauntlet_1){ handle the first gauntlet condition }; 
if(gauntlet_2){ handle the second gauntlet condition };
...
// All preconditions (gauntlets) have been successfully handled

// Perform your main task here

সুতরাং "হ্যান্ডেল গন্টলেট" অংশটি হয় নিয়ন্ত্রণের স্থানান্তর হতে হবে, যেমন একটি নিক্ষেপ বা রিটার্ন বিবৃতি, বা আসলে ত্রুটিটি সংশোধন করতে হবে। কিছু লোক যদি ... বিবৃতি ফেরত দেয়, তবে আমি মনে করি না এবং মনে হয় এটি কোডটি পড়া সহজ করে দেয়, যেমনটি আপনি বলেছিলেন।

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

0

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


-1

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


-1

যেমন পরিস্থিতি হিসাবে এটির জন্য কোনও থাম্ব বিধি নেই। তবে সম্ভবত আমরা যদি ইতিমধ্যে ব্লকটিতে ইতিবাচক বা সর্বাধিক সম্ভাব্য কোডটি লিখতে পারি এবং অন্য ব্লক বা ডিফল্ট ক্ষেত্রে ছেড়ে যায়।


- এই কি ইতিমধ্যে তার আগে উত্তর ব্যাখ্যা হয়েছিল তার ওপরে কিছু অফার করে না programmers.stackexchange.com/a/223093/31260 এবং programmers.stackexchange.com/a/223520/31260
মশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.