सवाल एकाधिक स्थितियों के साथ कथन को प्रारूपित करने का सबसे अच्छा तरीका


यदि आप दो या दो से अधिक स्थितियों के आधार पर निष्पादित करने के लिए कुछ कोड चाहते हैं जो कि अगर कथन को प्रारूपित करने का सबसे अच्छा तरीका है?

पहला उदाहरण: -

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

दूसरा उदाहरण: -

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

जो आसानी से समझने और पढ़ने के लिए आसान है कि प्रत्येक शर्त एक लंबा कार्य नाम या कुछ हो सकती है।


76
2017-10-31 10:15


मूल




जवाब:


मैं विकल्प ए पसंद करते हैं

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
}

112
2017-10-31 10:20



मुझें यह पसंद है। हालांकि मैं विधि विचार का एक बड़ा प्रशंसक नहीं हूं, जब तक कि विधियां पहले से मौजूद न हों और एक बूलियन मान वापस न करें। - Thomas Owens
सैनिटी जांच विधि नामों के लिए +1 - Aidan Miles
क्या आप दूसरे उदाहरण में किसी कारण के बिना सबकुछ मूल्यांकन नहीं कर रहे हैं? - Odys


अन्य उत्तरों बताते हैं कि पहला विकल्प सामान्य रूप से सर्वोत्तम क्यों होता है। लेकिन यदि आपके पास कई स्थितियां हैं, तो विकल्प 1 में स्थिति जांच करने के लिए एक अलग फ़ंक्शन (या संपत्ति) बनाने पर विचार करें। यह कोड को पढ़ने के लिए बहुत आसान बनाता है, कम से कम जब आप अच्छे विधि नामों का उपयोग करते हैं।

if(MyChecksAreOk()) { Code to execute }

...

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

यह स्थितियां केवल स्थानीय स्कोप वेरिएबल्स पर भरोसा करती हैं, आप नए फ़ंक्शन को स्थिर बना सकते हैं और आपको जो भी चाहिए उसे पारित कर सकते हैं। यदि कोई मिश्रण है, तो स्थानीय सामान में पास करें।


27
2017-10-31 10:20



मैंने इसे बाद में स्थितियों को जोड़ने के लिए सबसे प्रभावी और आसान पाया - pbojinov
+1 उत्कृष्ट सुझाव! - R Thiede
पहले +1 मैंने एक भौह उठाई लेकिन यह वास्तव में सबसे अच्छा जवाब imho है। वह बुलियन है isOkToDoWhatever एक संपत्ति के रूप में बहुत समझ में आता है। - grinch
कार्य तर्क के अमूर्तता के लिए अच्छे हैं, उनका उपयोग करें! - loujaybee
लेकिन यह कहीं और जटिल स्थिति को कहीं और स्थानांतरित करता है इसे पढ़ने योग्य भी होना चाहिए तो हम इसके साथ वर्ग एक पर वापस आ गए हैं। यह सिर्फ के बारे में नहीं है ifकथन पठनीयता लेकिन स्थिति पठनीयता। - Robert Koritnik


पहला उदाहरण "पढ़ने में आसान" है।

असल में, मेरी राय में आपको केवल दूसरे का उपयोग करना चाहिए जब भी आपको कुछ "अन्य तर्क" जोड़ना होगा, लेकिन एक साधारण सशर्त के लिए, पहले स्वाद का उपयोग करें। यदि आप इस शर्त के बारे में चिंतित हैं तो आप हमेशा अगले वाक्यविन्यास का उपयोग कर सकते हैं:

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

शुभ लाभ!


9
2017-10-31 10:23





सवाल पूछा गया था और अब तक इसका उत्तर दिया गया है कि निर्णय पूरी तरह से "वाक्य रचनात्मक" आधार पर किया जाना चाहिए।

मैं कहूंगा कि अगर आप एक के भीतर कई स्थितियों को कैसे बाहर रखते हैं, तो इसका सही उत्तर है, चाहिए "अर्थशास्त्र" पर भी निर्भर है। तो हालात को "अवधारणात्मक" के साथ क्या चलते हैं, इसके अनुसार शर्तों को तोड़ दिया जाना चाहिए और समूहीकृत किया जाना चाहिए।

यदि दो परीक्षण वास्तव में एक ही सिक्का के दो पक्ष हैं उदाहरण के लिए। अगर (x> 0) && (x <= 100) तो उन्हें एक ही पंक्ति पर एक साथ रखें। यदि एक और शर्त अवधारणात्मक रूप से कहीं अधिक दूर है। user.hasPermission (Admin ()) फिर इसे अपनी लाइन पर रखें

उदाहरण के लिए।

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

7
2017-10-31 11:07





दूसरा एक का एक उत्कृष्ट उदाहरण है तीर विरोधी पैटर्न तो मैं इसे टालना चाहूंगा ...

यदि आपकी परिस्थितियां बहुत लंबी हैं तो उन्हें विधियों / गुणों में निकालें।


4
2017-10-31 10:46





पहला वाला आसान है, क्योंकि, यदि आप इसे सही से बाएं पढ़ते हैं तो आपको मिलता है: "अगर कुछ और कुछ और फिर कुछ और", जो वाक्य को समझना आसान है। दूसरा उदाहरण पढ़ता है, "अगर कुछ ऐसा होता है तो अगर कुछ और फिर होता है तो", जो बेकार है।

साथ ही, इस बात पर विचार करें कि क्या आप अपने खंड में कुछ ओआरएस का उपयोग करना चाहते हैं - आप दूसरी शैली में ऐसा कैसे करेंगे?


3
2017-10-31 10:16





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

Formatting a multiple conditional expressions in an if-else statement this way:
1) allows for enhanced readability:
    a) all binary logical operations {&&, ||} in the expression shown
       first
    b) both conditional operands of each binary operation are obvious
       because they align vertically
    c) nested logical expressions operations are made obvious using
       indentation, just like nesting statements inside clause
2) requires explicit parenthesis (not rely on operator precedence rules)
    a) this avoids a common static analysis errors
3) allows for easier debugging
    a) disable individual single conditional tests with just a //
    b) set a break point just before or after any individual test
    c) e.g. ...

    // 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
    {
       ... ;
    }

3
2018-04-19 22:01





मेरा मानना ​​है switch...case यदि प्रोग्रामिंग भाषा इसका समर्थन करती है, तो इस परिस्थिति में साफ कोड लिखने का सबसे अच्छा तरीका है।

switch (//variable or Boolean) {
  case //Condition A:
  case //Condition B:
  case //Condition C:
    //Code to execute;
}

2
2017-12-03 07:38



यह अच्छा हो सकता है लेकिन यह "शॉर्ट सर्किटिंग" / आलसी मूल्यांकन के "लाभ" को हटा देता है। - TheLibrarianCz


पर्ल में आप यह कर सकते हैं:

{
  ( 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
}

यदि कोई भी स्थिति विफल हो जाती है तो यह ब्लॉक के बाद ही जारी रहेगी। यदि आप किसी भी चर को परिभाषित कर रहे हैं जिसे आप ब्लॉक के बाद रखना चाहते हैं, तो आपको ब्लॉक से पहले उन्हें परिभाषित करने की आवश्यकता होगी।


0
2017-10-31 23:14



यह पर्लीश दिखता है - "यह क्या करता है?" भावना;) लेकिन जब आप इसका इस्तेमाल करते हैं, तो यह वास्तव में पठनीय है। - Piskvor