একাধিক শর্ত সহ বিবৃতি ফর্ম্যাট করার সেরা উপায়


90

আপনি যদি দুটি বা ততোধিক শর্তের উপর ভিত্তি করে কিছু কোড কার্যকর করতে চান যা বিবৃতিটি ফর্ম্যাট করার সর্বোত্তম উপায়?

প্রথম উদাহরণ: -

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

দ্বিতীয় উদাহরণ: -

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

যা প্রতিটি শর্ত একটি দীর্ঘ ফাংশন নাম বা কিছু হতে পারে মনে মনে রাখা এবং পড়া সহজ হয়।


করুণা যে এই পৃষ্ঠার কেউই "দ্রুত" বা "পারফরম্যান্স" এর স্ট্রিংটি উল্লেখ করে না। এটাই আমি এখানে শিখতে এসেছি।
ড্রিমস্পেসের রাষ্ট্রপতি

উত্তর:


133

আমি পছন্দ অপশন

bool a, b, c;

if( a && b && c )
{
   //This is neat & readable
}

আপনার যদি বিশেষত দীর্ঘ ভেরিয়েবল / পদ্ধতির শর্তাদি থাকে তবে আপনি কেবল সেগুলি লাইন করতে পারেন

if( VeryLongConditionMethod(a) &&
    VeryLongConditionMethod(b) &&
    VeryLongConditionMethod(c))
{
   //This is still readable
}

যদি সেগুলি আরও জটিল হয় তবে আমি যদি স্টেটমেন্টের বাইরে শর্ত পদ্ধতি আলাদাভাবে করা বিবেচনা করব

bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);

if( aa && bb && cc)
{
   //This is again neat & readable
   //although you probably need to sanity check your method names ;)
}

আইএমএইচও 'বি' বিকল্পের একমাত্র কারণ হ'ল যদি আপনার elseপ্রতিটি শর্তের জন্য পৃথক ফাংশন থাকে।

যেমন

if( a )
{
    if( b )
    {
    }
    else
    {
        //Do Something Else B
    }
}
else
{
   //Do Something Else A
}

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

4
আপনি দ্বিতীয় উদাহরণে কারণ ছাড়াই সবকিছু মূল্যায়ন করছেন না?
ওডিস

আমি শর্তের আগে '&&' ব্যবহার করতাম। উদাহরণের মতো একই অক্ষরের দৈর্ঘ্যের সাথে শর্ত থাকা শক্ত hard
অ্যাড্রিয়ানএন

29

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

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{ 
    return ConditionOne && ConditionTwo && ConditionThree;
}

এটি শর্তাদি কেবল স্থানীয় স্কোপ ভেরিয়েবলের উপর নির্ভর করে, আপনি নতুন ফাংশনটিকে স্থির করতে এবং আপনার প্রয়োজনীয় সমস্ত কিছুতে পাস করতে পারেন। যদি মিশ্রণ থাকে তবে স্থানীয় স্টাফগুলিতে পাস করুন।


4
আমি এটি পরে সবচেয়ে শর্ত যুক্ত করতে সবচেয়ে কার্যকর এবং সহজ বলে মনে করেছি
pbojinov

+1 প্রথমে আমি ভ্রু উত্থাপন করেছি তবে এটি সত্যিই সেরা উত্তর ইমো। isOkToDoWhateverসম্পত্তি হিসাবে এই বুলেট থাকা অনেক অর্থবোধ করে।
গ্রিঞ্চ

4
তবে এটি ঠিক একই জটিল অবস্থাকে অন্যত্র সরিয়ে নিয়েছে যেখানে এটি পাঠযোগ্যও হওয়া দরকার তাই আমরা এটির সাথে আবার বর্গক্ষেত্রে ফিরে যাই। এটি কেবল ifবিবৃতি পঠনযোগ্যতা সম্পর্কে নয় বরং শর্ত পাঠযোগ্যতা।
রবার্ট কোরিতনিক

@ রবার্টকরিটনিক আপনি কী বলছেন তা আমি বুঝতে পেরেছি, তবে আমি মনে করি না যে আমরা পাঠকদের একসাথে বিবেচনা করার জটিলতা হ্রাস করেছি বলে আমরা আবার এক বর্গায় ফিরে এসেছি। তিনি শর্তগুলির দিকে নজর দিতে পারেন, বা শর্তগুলির একটি (আশাবাদী) সুন্দর নাম রয়েছে এমন শর্তগুলি ব্যবহার করে কোডটি দেখতে পারেন। কমপক্ষে আমি প্রায়শই এটি কুঁচকানো সহজ মনে করি, তবে আবার কখনও কখনও সমস্ত বিবরণ এক জায়গায় রাখা ভাল। সর্বদা হিসাবে, এটি নির্ভর করে।
Torbjørn

দুর্দান্ত পদ্ধতির নাম ব্যবহার করে যুক্তির পুনঃনির্মাণের দুর্দান্ত বিষয়।
জেবি লাভল

10

প্রথম উদাহরণটি আরও "পড়তে সহজ"।

আসলে, আমার মতে আপনি যখনই "অন্য কিছু যুক্তি" যুক্ত করতে হয় তবে কেবল দ্বিতীয়টি ব্যবহার করা উচিত, তবে সাধারণ শর্তসাপেক্ষে প্রথম স্বাদটি ব্যবহার করুন। আপনি যদি দীর্ঘ অবস্থার বিষয়ে উদ্বিগ্ন থাকেন তবে আপনি সর্বদা পরবর্তী বাক্য গঠনটি ব্যবহার করতে পারেন:

if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
                 && ConditionTwoThatIsLongAsWell
                 && ConditionThreeThatAlsoIsLong) { 
     //Code to execute 
}

শুভকামনা!


10
if (   ( single conditional expression A )
    && ( single conditional expression B )
    && ( single conditional expression C )
   )
{
   opAllABC();
}
else
{
   opNoneABC();
}

যদি-অন্য বিবৃতিতে একাধিক শর্তাধীন অভিব্যক্তিটি ফর্ম্যাট করে:

  1. বর্ধিত পাঠযোগ্যতার জন্য অনুমতি দেয়:
    ক। সমস্ত বাইনারি যৌক্তিক ক্রিয়াকলাপ first &&, ||
    । প্রথম দেখানো বিতে প্রতিটি বাইনারি অপারেশনের উভয় শর্তসাপেক্ষ স্পষ্ট কারণ তারা উল্লম্বভাবে প্রান্তিক হয়
    c। নেস্টেড লজিকাল এক্সপ্রেশন ক্রিয়াকলাপগুলি ক্ল্যান্ডের অভ্যন্তরে নেস্টিং স্টেটমেন্টের মতো ইনডেন্টেশন ব্যবহার করে সুস্পষ্টভাবে তৈরি করা হয়
  2. স্পষ্টত প্রথম বন্ধনী প্রয়োজন (অপারেটর অগ্রাধিকার নিয়মের উপর নির্ভর করবেন না)
    ক। এটি একটি সাধারণ স্থিতিশীল বিশ্লেষণ ত্রুটি এড়িয়ে চলে
  3. সহজ ডিবাগিং জন্য অনুমতি দেয়
    একটি। মাত্র একটি //
    বি দিয়ে পৃথক একক শর্তসাপেক্ষ পরীক্ষা অক্ষম করুন । কোনও পৃথক পরীক্ষার আগে বা তার পরে একটি ব্রেক পয়েন্ট নির্ধারণ করুন
    ...
// disable any single conditional test with just a pre-pended '//'
// set a break point before any individual test
// syntax '(1 &&' and '(0 ||' usually never creates any real code
if (   1
    && ( single conditional expression A )
    && ( single conditional expression B )
    && (   0
        || ( single conditional expression C )
        || ( single conditional expression D )
       )
   )
{
   ... ;
}

else
{
   ... ;
}

এটি আমার পদ্ধতি। আমার একমাত্র সমস্যা হ'ল আমার কাছে এখনও এমন একটি কোড
বিউটিফায়ার সন্ধান করা আছে

9

প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং এখনও পর্যন্ত এর উত্তর দেওয়া হয়েছে যেন সিদ্ধান্তটি "সিনট্যাকটিক" ভিত্তিতে নিখুঁতভাবে করা উচিত।

আমি বলতে হবে তুমি কেমন শুয়ে-আউট অবস্থার একটি সংখ্যা একটি মধ্যে যদি, এর সঠিক উত্তর যে কর্তব্য "শব্দার্থবিদ্যা" খুব নির্ভর করে। সুতরাং শর্তগুলি ভেঙে দেওয়া উচিত এবং জিনিসগুলি "ধারণাগতভাবে" একসাথে যা হয় তার অনুসারে গ্রুপ করা উচিত।

দুটি পরীক্ষা যদি সত্যই একই মুদ্রার দুটি দিক হয় যেমন। যদি (x> 0) && (x <= 100) থাকে তবে তাদের একই লাইনে একসাথে রাখুন। অন্য শর্তটি যদি ধারণাগতভাবে অনেক দূরের উদাহরণস্বরূপ। User.hasPermission (অ্যাডমিন ()) এর পরে এটি নিজের লাইনে রাখুন

যেমন

if user.hasPermission(Admin()) {
   if (x >= 0) && (x < 100) {
      // do something
   }
}


3

প্রথমটিটি সহজ, কারণ, আপনি যদি এটি বাম থেকে ডান পড়েন তবে আপনি পাবেন: "যদি কিছু এবং কিছু কিছু এবং কিছু থিংগেল থেন", যা বাক্যটি বোঝা সহজ। দ্বিতীয় উদাহরণটিতে "যদি কিছু THEN যদি কিছু কিছু থাকে তবে THEN অন্য কিছু THEN" পড়ে, যা আনাড়ি is

এছাড়াও, বিবেচনা করুন যদি আপনি নিজের ধারাটিতে কিছু ওআর ব্যবহার করতে চান - তবে আপনি এটি দ্বিতীয় শৈলীতে কীভাবে করবেন?


0

পার্লে আপনি এটি করতে পারেন:

{
  ( VeryLongCondition_1 ) or last;
  ( VeryLongCondition_2 ) or last;
  ( VeryLongCondition_3 ) or last;
  ( VeryLongCondition_4 ) or last;
  ( VeryLongCondition_5 ) or last;
  ( VeryLongCondition_6 ) or last;

  # Guarded code goes here
}

যদি শর্তগুলির কোনওটি ব্যর্থ হয় তবে তা কেবল অবরুদ্ধ অবস্থায় চলবে। আপনি যদি ব্লকের পরে কোনও ভেরিয়েবলের চারপাশে রাখতে চান তবে এটি ব্লকের আগে আপনাকে সেগুলি সংজ্ঞায়িত করতে হবে।


4
এটি পার্লিশ দেখাচ্ছে - "এটি কী করে?" জ্ঞান;) তবে এটি একবারে অভ্যস্ত হয়ে উঠলে এটি আসলে পাঠযোগ্য।
পিসকভোর

-2

আমি দীর্ঘদিন ধরে এই দ্বিধাদ্বন্দ্বের মুখোমুখি হয়েছি এবং এখনও আমি সঠিক সমাধান খুঁজে পাচ্ছি না। আমার মতে কেবলমাত্র ভাল উপায় হ'ল প্রথমে শর্তগুলি থেকে মুক্তি পাওয়ার চেষ্টা করা যাতে আপনি হঠাৎ তাদের সাথে 5 টির তুলনা করছেন না।

যদি বিকল্প না থাকে তবে অন্যরা যেমন পরামর্শ দিয়েছেন - এটিকে আলাদা করে সেপারেটে ভাগ করুন এবং নামগুলি সংক্ষিপ্ত করুন বা তাদের গ্রুপ করুন এবং উদাহরণস্বরূপ যদি সমস্ত সত্য হতে হয় তবে "এক্স এর অ্যারেতে যদি মিথ্যা না থাকে তবে চালান" এর মতো কিছু ব্যবহার করুন use

যদি সমস্ত ব্যর্থ হয় @ ইয়োন ক্যাম্পবেল বেশ ভাল ধারণা দেয়।


এটি ইতিমধ্যে বিদ্যমান উত্তরগুলিতে নতুন কিছু যুক্ত করছে না।
জার্নি

-4

যখন অবস্থা সত্যিই জটিল হয় আমি নীচের স্টাইলটি ব্যবহার করি (পিএইচপি বাস্তব জীবনের উদাহরণ):

if( $format_bool &&
    (
        ( isset( $column_info['native_type'] )
            && stripos( $column_info['native_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['driver:decl_type'] )
            && stripos( $column_info['driver:decl_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['pdo_type'] )
            && $column_info['pdo_type'] == PDO::PARAM_BOOL
        )
    )
)

আমি বিশ্বাস করি এটি একাধিক স্তরের বাসা বাঁধার চেয়ে আরও সুন্দর এবং পঠনযোগ্য if()। এবং এর মতো কিছু ক্ষেত্রে আপনি জটিল কন্ডিশনটিকে কেবল টুকরো টুকরো করতে পারবেন না কারণ অন্যথায় আপনাকে একই বিবৃতি পুনরাবৃত্তি করতে হবেif() {...} অনেক বার ।

আমি আরও বিশ্বাস করি যে কোডে কিছু "বায়ু" যুক্ত করা সবসময়ই ভাল ধারণা is এটি পাঠযোগ্যতার ব্যাপক উন্নতি করে।

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