2012-03-16 15 views
104

से तेज़री ऑपरेटर तेज़ है, तो मैं यदि सशर्त सिंड्रोम "का अनुमान लगाता हूं जिसका अर्थ है कि मैं हर समय स्थितियों का उपयोग करता हूं। मैं शायद ही कभी टर्नरी ऑपरेटर का उपयोग करता हूं। उदाहरण के लिए: क्या "अगर" स्थिति

//I like to do this: 
int a; 
if (i == 0) 
{ 
    a = 10; 
} 
else 
{ 
    a = 5; 
} 

//When I could do this: 
int a = (i == 0) ? 10:5; 

जो मैं का उपयोग बात यह है? कौन सा तेज़ है? क्या कोई उल्लेखनीय प्रदर्शन अंतर है? जब भी संभव हो सबसे छोटा कोड का उपयोग करना बेहतर अभ्यास है?

मैं जावा प्रोग्रामिंग भाषा का उपयोग करता हूं।

+4

इससे कोई फर्क नहीं पड़ता और आपको प्रदर्शन के मुकाबले स्वच्छ कोड के बारे में चिंतित होना चाहिए। इस मामले में, मुझे लगता है कि टर्नरी ऑपरेटर सिर्फ क्लीनर है। –

+3

इसके अलावा, आप इसे इस तरह कर सकते हैं 'अगर (i == 0) a = 10; अन्यथा एक = 5; ' –

+11

एक निश्चित आवश्यकता दिखाने के बिना प्रोफाइलिंग के बिना समयपूर्व अनुकूलन खराब, बुरा, बुरा है। कोड का प्रयोग करें कि आपका भविष्य स्वयं अब से 6 महीने का सबसे अच्छा समझ जाएगा। –

उत्तर

93

क्या इससे कोई फर्क पड़ता है जिसका मैं उपयोग करता हूं?

हाँ! दूसरा बहुत अधिक पठनीय है। आप एक पंक्ति का व्यापार कर रहे हैं जो प्रभावी ढंग से अव्यवस्था के नौ लाइनों के खिलाफ आप जो चाहते हैं उसे व्यक्त करता है।

कौन सा तेज़ है?

न तो।

जब भी संभव हो तो सबसे कम कोड का उपयोग करना बेहतर अभ्यास है?

"जब भी संभव हो" नहीं, लेकिन निश्चित रूप से जब भी हानि प्रभाव के बिना संभव हो। छोटा कोड कम से कम संभावित रूप से अधिक पठनीय है क्योंकि यह आकस्मिक प्रभावों ("बॉयलरप्लेट कोड") के बजाय प्रासंगिक भाग पर केंद्रित है।

+1

पठनीय इसका मतलब यह नहीं है कि यह महत्वपूर्ण है, perse। – Jon

+0

यहां तक ​​कि 9 लाइनें, अगर मैं सही मानता हूं, क्योंकि वहां भी बहुत अधिक सफेद जगह है। –

+16

@ जोन: हाँ, यह करता है। पठनीयता सभी महत्वपूर्ण है, प्रभावी रूप से। –

8

टर्नरी ऑपरेटर सिर्फ शॉर्टेंड हैं। वे समकक्ष if-else कथन में संकलित करते हैं, जिसका अर्थ है कि वे ठीक समान होंगे।

30

यदि बहुत किसी भी प्रदर्शन अंतर (जो मुझे शक है), यह नगण्य हो जाएगा। सबसे सरल, सबसे पठनीय कोड लिखने पर ध्यान केंद्रित करें।

ऐसा कहकर, सशर्त ऑपरेटर के अपने विचलन को प्राप्त करने का प्रयास करें - जबकि इसे निश्चित रूप से उपयोग करना संभव है, यह वास्तव में कुछ मामलों में उपयोगी हो सकता है। आपके द्वारा दिए गए विशिष्ट उदाहरण में, मैं निश्चित रूप से सशर्त ऑपरेटर का उपयोग करता हूं।

+0

आप यहां सशर्त क्यों उपयोग करेंगे? मैं सफाई के लिए टर्नरी का उपयोग करूंगा। – Jon

+14

@ जोन: सशर्त ऑपरेटर वास्तविक * नाम * है जिसे आपने टर्नरी ऑपरेटर कहा है। यह * ए * टर्नरी ऑपरेटर है, क्योंकि इसमें 3 ऑपरेंड हैं, लेकिन इसका * नाम * सशर्त ऑपरेटर है। –

+1

ठीक है, स्पष्टीकरण के लिए धन्यवाद। मैं सोच रहा था कि आप स्पष्ट 'if-else' वाक्यविन्यास का मतलब था। – Jon

0

जो कुछ भी बेहतर पढ़ता है उसका उपयोग करना सबसे अच्छा है - प्रदर्शन के बीच सभी व्यावहारिक प्रभाव 0 अंतर में है।

इस मामले में मुझे लगता है कि आखिरी वक्तव्य कथन के पहले से बेहतर पढ़ता है, लेकिन सावधान रहें कि टर्नरी ऑपरेटर का उपयोग न करें - कभी-कभी यह वास्तव में चीजों को बहुत कम स्पष्ट कर सकता है।

24

त्रिगुट ऑपरेटर उदाहरण:

int a = (i == 0) ? 10 : 5; 

आप/किसी और इस तरह अगर साथ काम नहीं कर सकते:

// invalid: 
int a = if (i == 0) 10; else 5; 

इस त्रिगुट ऑपरेटर का उपयोग करने के लिए एक अच्छा कारण है।आप एक काम नहीं है, तो:

if (i == 0) foo(); else bar(); 

प्रदर्शन महत्वपूर्ण मामलों में:

(i == 0) ? foo() : bar(); 

एक/बाकी है कि और अधिक कोड नहीं है अगर यह उपाय। यदि कोई बाधा है तो सामान्य डेटा के साथ लक्ष्य मशीन, लक्ष्य JVM के साथ इसे मापें। अन्यथा पठनीयता के लिए जाओ।

संदर्भ में एंबेडेड, संक्षिप्त रूप में कभी कभी बहुत आसान है:

System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName()); 
+0

टर्नरी ऑपरेटर का उपयोग करने का एक अन्य कारण है - यह आपको सभी मामलों को संभालता है। –

+0

@ माइकडुनलेवी: यदि आप 'ओह' के बारे में सोचते हैं, तो दूसरे मामले को मत भूलना!चलो एक टर्नरी ऑपरेटर का उपयोग करें 'आप इसे भूलने के लिए' अन्य 'लिखना शुरू कर सकते हैं, अगर आपका दिमाग इतना अविश्वसनीय है, तो इसे अपने कथन लिखने के कुछ सेकंड में भूल जाएं। –

+0

यह सिर्फ "अन्य" लिखने की बात नहीं है, यही वह है जिसे आपने इसमें रखा है। –

15

हाँ, यह है, लेकिन कोड निष्पादन प्रदर्शन की वजह से नहीं मायने रखती है।

तेज (निष्पादक) कोडिंग सरल वाक्यविन्यास संरचनाओं की तुलना में लूपिंग और ऑब्जेक्ट इंस्टेंटेशन के लिए अधिक प्रासंगिक है। कंपाइलर को ऑप्टिमाइज़ेशन को संभालना चाहिए (यह सब एक ही बाइनरी के बारे में होगा!) तो आपका लक्ष्य आपके लिए भविष्य में दक्षता होना चाहिए (मनुष्य हमेशा सॉफ्टवेयर में बाधा डालते हैं)।

Josh Bloch's "Performance Anxiety" talk on Parleys.com

जवाब 9 लाइनों का हवाला देते हुए बनाम एक भ्रामक हो सकता है: कोड के कम लाइनों हमेशा बराबर बेहतर नहीं है। टर्नरी ऑपरेटर सीमित स्थितियों में एक और संक्षिप्त तरीका हो सकते हैं (आपका उदाहरण एक अच्छा है)।

लेकिन अक्सर कोड को अपठनीय बनाने के लिए दुर्व्यवहार किया जा सकता है (जो एक कार्डिनल पाप है) = घोंसला टर्नरी ऑपरेटरों को न करें!

साथ ही, भविष्य रख-रखाव पर विचार करता है, तो-और कुछ बहुत आसान है बढ़ाने या संशोधित करने के लिए:

int a; 
if (i != 0 && k == 7){ 
    a = 10; 
    logger.debug("debug message here"); 
}else 
    a = 3; 
    logger.debug("other debug message here"); 
} 


int a = (i != 0 && k== 7) ? 10 : 3; // density without logging nor ability to use breakpoints 

पी.एस. पर To ternary or not to ternary?

+1

मैं इससे असहमत हूं: यह बेवकूफ और घोंसला सशर्त बयानों के लिए पठनीय है, उदाहरण के लिए, खासकर जब कई मामलों का परीक्षण 'वापसी x == 1' में किया जाता है? "एक": x == 2? "दो": "कई"; '। उचित इंडेंटेशन और एकाधिक लाइनों में तोड़ने से यहां मदद मिलती है। –

0

कोशिश बहुत पूरा stackoverflow जवाब switch case बयान उपयोग करने के लिए। लेकिन आम तौर पर यह prefermance बाधा नहीं है।

+1

यह आम तौर पर सच है कि 'स्विच' ब्लॉक को नियोजित करने वाले समाधानों से बचा जाना चाहिए जब वे हो सकते हैं। उनकी प्रकृति से, 'स्विच' स्वीकार्य राज्यों की एक निश्चित संख्या पर लागू होता है। यह एक सॉफ्टवेयर रखरखाव देयता बनाता है क्योंकि "स्वीकार्य राज्य" आमतौर पर एक चलती लक्ष्य है। उदाहरण के लिए, 'एनम' कक्षाओं का उपयोग करने वाले समाधान अक्सर 'स्विच' ब्लॉक के आधार पर समाधान से बेहतर और अधिक सुंदर काम करते हैं। – scottb

4

इसके अलावा, टर्नरी ऑपरेटर "वैकल्पिक" पैरामीटर का एक रूप सक्षम करता है। जावा विधि हस्ताक्षरों में वैकल्पिक पैरामीटर की अनुमति नहीं देता है लेकिन टर्नरी ऑपरेटर आपको null पैरामीटर मान के लिए आपूर्ति की जाने पर डिफ़ॉल्ट विकल्प को आसानी से इनलाइन करने में सक्षम बनाता है।

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

public void myMethod(int par1, String optionalPar2) { 

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2) 
      .trim() 
      .toUpperCase(getDefaultLocale()); 
} 

उपरोक्त उदाहरण में, null गुजर के रूप में String पैरामीटर मान आप एक NullPointerException के बजाय एक डिफ़ॉल्ट स्ट्रिंग मान हो जाता है। यह छोटा और प्यारा है और, मैं कहूंगा, बहुत पठनीय। इसके अलावा, जैसा कि इंगित किया गया है, बाइट कोड स्तर पर वास्तव में टर्नरी ऑपरेटर और यदि-फिर-और के बीच कोई अंतर नहीं है। जैसा कि उपरोक्त उदाहरण में, निर्णय लेने के लिए निर्णय पूरी तरह से पठनीयता पर आधारित है।

इसके अलावा, इस पद्धति आप विधि ओवरलोडिंग इस प्रकार से String पैरामीटर सही मायने में वैकल्पिक बनाने के लिए (अगर यह ऐसा करने के लिए उपयोगी माना जाता है) सक्षम बनाता है:

public void myMethod(int par1) { 
    return myMethod(par1, null); 
} 
2

दिए गए उदाहरण के लिए, मैं त्रिगुट पसंद करते हैं या एक विशिष्ट कारण के लिए हालत ऑपरेटर (?): मैं स्पष्ट रूप से देख सकता हूं कि a असाइन करना वैकल्पिक नहीं है।एक सरल उदाहरण के साथ, यह देखने के लिए कि a प्रत्येक खंड में निर्दिष्ट किया जाता है, तो-और कुछ ब्लॉक स्कैन, लेकिन प्रत्येक खंड में कई कार्य की कल्पना करना भी मुश्किल नहीं है:

if (i == 0) 
{ 
    a = 10; 
    b = 6; 
    c = 3; 
} 
else 
{ 
    a = 5; 
    b = 4; 
    d = 1; 
} 

a = (i == 0) ? 10 : 5; 
b = (i == 0) ? 6 : 4; 
c = (i == 0) ? 3 : 9; 
d = (i == 0) ? 12 : 1; 

मैं उत्तरार्द्ध पसंद करते हैं तो आप आप जानते हैं कि एक असाइनमेंट याद नहीं किया है।

संबंधित मुद्दे