2010-04-07 14 views
12

मेरे पास ये लंबे वक्तव्य हैं जिन्हें मैं x, y आदि के रूप में संदर्भित करता हूं। मेरे सशर्त बयान 'संरचना इस प्रकार है:यदि अन्यथा संरचना

if(x || y || z || q){ 
    if(x) 
     do someth 
    else if (y) 
     do something 

    if(z) 
     do something 
    else if(q) 
     do something 
} 
else 
    do smthing 

वहाँ एक बेहतर, छोटे इस बात लिखने के लिए रास्ता नहीं है? धन्यवाद

उत्तर

1

यह मेरे लिए बहुत स्पष्ट लगता है (और स्पष्ट अच्छा है)।

आप क्या कर सकते हैं पहले x, y, z और q का मूल्यांकन करें और उन्हें चर के रूप में स्टोर करें ताकि आपको दो बार ऐसा करने की आवश्यकता न हो।

+3

@Thirler हम्म बनाने के लिए, कि शॉर्ट सर्किट का उद्देश्य विफल हो जाएगा सकता है मूल्यांकन। मुझे लगता है कि एक्स, वाई, जेड, और क्यू की समान संभावना और समय-जटिलता मानते हुए यह एक प्रदर्शन बढ़ावा होगा। लेकिन क्या होगा यदि ज़ेड की संभावना 50% है और कम प्रोसेसिंग लेती है जबकि क्यू की संभावना 1% है और इसमें प्रसंस्करण शक्ति का 9 5% हिस्सा लगता है? देखें कि उचित मेट्रिक्स के बिना माइक्रो-ऑप्टिमाइज़ेशन आपको परेशानी में कैसे ला सकता है? –

+0

हाँ, हमें सबसे अधिक वैरिएबल पर उपयोग करने की आवश्यकता है ताकि – Halo

+0

@Tim आपको प्रदर्शन की नाली होने के लिए बहुत लंबी स्थितियों (या कोड को लाखों बार निष्पादित किया गया हो) की आवश्यकता हो।मैं निश्चित रूप से अनुकूलन नहीं कर रहा हूं (सवाल इसके बारे में बात नहीं करता है), मैं रखरखाव में सुधार करने का सुझाव दे रहा हूं। यदि प्रदर्शन महत्वपूर्ण है तो आपको गणना के परिणाम को पारदर्शी रूप से बफर करना होगा (परिणाम को संग्रहीत करने वाले फ़ंक्शन के पीछे इसे छुपाएं)। ध्यान दें कि दिया गया उदाहरण कुछ शर्तों को दो बार निष्पादित करता है। लेकिन एक अच्छा नियम तब तक अनुकूलन नहीं करना है जब तक आप यह न देख सकें कि इसे निष्पादित करने में काफी समय लगता है। – Thirler

1

शायद यह पढ़ने के लिए थोड़ा आसान है। लेकिन अब आप एक अतिरिक्त जांच करेंगे। यदि यह महत्वपूर्ण मिशन कोड नहीं है तो शायद आप निम्नलिखित का उपयोग कर सकते हैं:

if (x) 
    do something; 
else if (y) 
    do something; 

if (z) 
    do something; 
else if(q) 
    do something; 

if !(x || y || z || q) 
    do something completely different. 
+2

आपका अंतिम विवरण प्रश्न के समान नहीं है, मुझे लगता है कि आपको 'if! (X || y || z || q) ' – Thirler

+0

की आवश्यकता है और पढ़ने के लिए, मुझे लगता है कि बेहतर है। आप जानते हैं, यह सुनिश्चित कर लें कि हमने छेद नहीं छोड़े – Halo

+0

मुझे नहीं लगता कि यह 'एक अतिरिक्त चेक कैसे करता है'। आपके पास बयान के समान ही संख्या है :) –

4

मैं आप इसे कैसे अब लिखने के साथ एक बड़ी समस्या नहीं दिख रहा। मैं सिंगल कथन के लिए भी घुंघराले ब्रेसिज़ का उपयोग करने की सलाह देता हूं। इससे आपको गलतियों से बचने में मदद मिलेगी यदि आपको बाद में और कोड कोड जोड़ना है (और तब घुंघराले ब्रेसिज़ को जोड़ना भूल सकता है)। मुझे यह और भी पठनीय लगता है। कोड इस तो ऐसा दिखाई देगा:

if (x || y || z || q) { 
    if (x) { 
     do something 
    } else if (y) { 
     do something 
    } 

    if (z) { 
     do something 
    } else if (q) { 
     do something 
    } 
} else { 
    do something 
} 
+0

+1। मेरी इच्छा है कि जावा, सी ++, और अन्य भाषाएं "गो" करती हैं और उन ब्रेसिज़ को अनिवार्य बनाती हैं .... यह निश्चित रूप से बहुत अधिक पठनीय कोड को नरक बना देगा। –

+0

हाँ और मैं हमेशा घुंघराले ब्रेसिज़ का उपयोग करता हूं, ऊपर वाला एक प्रोटोटाइप या कुछ है। – Halo

0

मैं निम्नलिखित की सिफारिश नहीं कर रहा हूँ, वास्तव में, मुझे लगता है कि तुम क्या मिल गया ठीक है, लेकिन:

s = true; 
if (x) { 
    do something; 
    s = false; 
} else if (y) { 
    do something; 
    s = false; 
} 
if (z) { 
    do something; 
    s = false; 
} else if (q) { 
    do something; 
    s = false; 
} 

if (s) { 
    so something; 
} 
4

एक और प्रकार है कि एक से अधिक से बचा जाता है चेक और errorprone जटिल तार्किक अभिव्यक्ति हो सकती है:

boolean conditionhandled = false; 
if (x) { 
    do something 
    conditionhandled = true; 
} else if (y) { 
    do something 
    conditionhandled = true; 
} 

if (z) { 
    do something 
    conditionhandled = true; 
} else if (q) { 
    do something 
    conditionhandled = true; 
} 

if (!conditionhandled) { 
    do something 
} 
+1

धन्यवाद, मुझे लगता है कि हमें झूठी – Halo

+0

ओह के रूप में कंडीशनिंग शुरू करने की आवश्यकता है! धन्यवाद, मैंने इसे ठीक किया। –

0

आप एक्स, वाई, जेड, क्ष बारे में कुछ मान्यताओं बना सकते हैं? ईजी उनमें से सिर्फ एक सच हो सकता है। की तुलना में आप एक राज्य

enum State { 
X{ 
    void doSomething(){ 
    doItTheXWay(); 
    } 
}, 
Y{ 
    void doSomething(){ 
    doItTheYWay(); 
    } 
}, 
Z{ 
    void doSomething(){ 
    doItTheZWay(); 
    } 
}, 
Q{ 
    void doSomething(){ 
    doItTheQWay(); 
    } 
}; 
    void doSomething(){ 

    } 
} 

के रूप में और अपने कोड में देख सकते हैं, जहां आप इस्तेमाल किया बयानों

आप एक राज्य आवंटित और बस सकता है सही बात

State state = getAState(); 
state.doSomething(); 

करते हैं मामले में आप enums पसंद नहीं है राज्य एक इंटरफ़ेस हो सकता है और क्यू एक्स क्यू कक्षाओं को कार्यान्वित किया जा सकता है। यदि इस मामले में निर्माण होता है तो इस मामले में लाभ एक ही उपयोग में होते हैं। कुछ codelines बाद में आप

if(x) 
    do_the_next_thing_with_X(); 
... 

साथ शुरू होगा कहें या आप बस एक और समारोह के साथ अपने enum का विस्तार करने और एक ही कॉल

state.doTheNextThing(); 
संबंधित मुद्दे