टर्नरी ऑपरेटर को हानिकारक माना गया? [बन्द है]


79

उदाहरण के लिए, क्या आप इस वन-लाइनर को पसंद करेंगे

int median(int a, int b, int c) {
    return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b;
}

या यदि एक / कई समाधान में कई रिटर्न स्टेटमेंट शामिल हैं?

कब ?:उचित है, और कब नहीं? क्या इसे शुरुआती लोगों से सिखाया या छिपाया जाना चाहिए?


221
इसका यह विशेष उपयोग है :)
karmajunkie

6
किसने उसे कोडित किया, और चार संख्याओं के लिए माध्यिका का उनका संस्करण कैसा दिखता है? या पाँच?
मेसन व्हीलर

3
अधिक सही नाम 'सशर्त ऑपरेटर' है। यह सिर्फ उपयोग में सबसे आम टर्नरी ऑपरेटर होने के लिए होता है।
एलन पीयर्स

1
यह दो साल पहले स्टैकओवरफ्लो पर पूछा गया था। क्या हम अब यहाँ पर सब कुछ फिर से पूछने जा रहे हैं? stackoverflow.com/questions/160218/to-ternary-or-not-to-ternary
webbiedave

3
मुझे आश्चर्य है कि इस तरह के सवाल क्यों आते रहते हैं। जवाब हमेशा "जो भी काम करता है और पठनीय होता है।" - पिछले एक समान रूप से महत्वपूर्ण है।
अपूर्व खुरसिया

जवाबों:


234

क्या टर्नरी ऑपरेटर बुराई है?

नहीं यह एक आशीर्वाद है।

कब है?: उपयुक्त?

जब यह कुछ सरल होता है तो आप इसके लिए कई लाइनें बर्बाद नहीं करना चाहते हैं।

और यह कब नहीं है

जब कोड की पठनीयता और स्पष्टता में कमी आती है और अपर्याप्त ध्यान के माध्यम से गलती की संभावना बढ़ जाती है, उदाहरण के लिए, कई जंजीर ऑपरेटरों के साथ, जैसे आपके उदाहरण में।


लिटमस टेस्ट तब होता है जब आपको संदेह होने लगता है कि आपका कोड लंबे समय में आसानी से पढ़ा जा सकता है और बनाए रखा जा सकता है। तो यह मत करो।


23
+1 के लिए जब कोड की पठनीयता और स्पष्टता ग्रस्त है। कई जंजीर ऑपरेटरों के साथ, जैसे आपके उदाहरण में। उदाहरण को समतुल्य की तुलना में समझने में अधिक समय लगता है / अन्यथा।
सांग

23
महान विवरण के लिए +1 ब्रावो! डेवलपर्स यह महसूस नहीं करते हैं कि कुछ चीजें निर्णय कॉल हैं, वे चाहते हैं कि सब कुछ काला और सफेद हो। यह मुझे पागल कर देता है। मैंने राय के कई लोगों से सामना किया है "एक्स बुराई है, इसका उपयोग कभी नहीं करने देता है।" मैं पसंद करता हूं "यदि आप इसे अच्छे के लिए उपयोग करते हैं तो एक्स बहुत अच्छा है"।
डॉक्टर जोन्स

54
इसका इस्तेमाल होने पर यह भी बुरा है: myVar = (someExpression)? सही गलत; Aaaaarrgh!
adamk

20
@ काम: बुराई के लिए यह प्रयास करें:myVar = someExpression ? false : true;
डीन हार्डिंग

8
कैसे के बारे में (someExpression ? var1 : var2)++:-)
fredoverflow

50

मुझे लगता है कि अनावश्यक टर्नरी ऑपरेटर (यानी, एक बयान जहां यह केवल एक बार उपयोग किया जाता है) ठीक है, लेकिन यदि आप एक से अधिक घोंसले के शिकार हैं, तो इसे पढ़ना थोड़ा कठिन हो जाता है।


3
इसे एक निरीक्षण माना जा सकता है, लेकिन इसका पालन करना बहुत आसान दिशानिर्देश है और यह ज्यादातर मामलों में काम करता है।
एलन पीयर्स

2
यह वास्तव में मेरे अंगूठे का नियम है: आपको उन्हें कभी भी घोंसला नहीं बनाना चाहिए, अन्यथा उन्हें / / के साथ बदलें, यह उस तरह से स्पष्ट होगा।
पियोवेज़न

यदि आप उनका उपयोग करेंगे, और उन्हें घोंसला बनाएंगे, तो मानवता के प्यार के लिए इसे पठनीय बनाने के लिए कोष्ठक और सफेद स्थान का उपयोग करें। अगर-और बदसूरत के रूप में बनाया जा सकता है। यह दिखाने के लिए आग्रह करें कि 'स्मार्ट' आप ऐसी चीजों को कैसे लिखते हैं जो कंपाइलर पढ़ सकते हैं लेकिन मनुष्य नहीं कर सकते। किसी दिन आप मानव होंगे जो नहीं कर सकते हैं।
candied_orange

24

कब है?: उपयुक्त

  • जब यह आपके कोड को अधिक संक्षिप्त और पठनीय बनाता है।

और यह कब नहीं है

  • जब यह आपके कोड को अपठनीय बनाता है।
  • यदि आप ऐसा सिर्फ रिफ़र्रिंग टूल जैसे कि रीशरपर को खुश करने के लिए कर रहे हैं न कि उस व्यक्ति को जिसे कोड को बनाए रखना है

यदि आपके पास टर्नरी अभिव्यक्ति के अंदर कोई तर्क या फ़ंक्शन कॉल है, तो आप इसे देखने के लिए भयानक बना रहे हैं।


यह एक बहुत उत्थान के हकदार हैं!
पियोवेज़न

22

एक अंतर जो (मुझे लगता है) किसी ने भी इंगित नहीं किया है कि यदि कोई और मूल्य वापस नहीं कर सकता है, जबकि टर्नरी ऑपरेटर कर सकता है।

एफ # से आ रहा है, मैं कभी-कभी पैटर्न के मिलान के लिए टर्नरी ऑपरेटर का उपयोग करना पसंद करता हूं।

match val with
| A -> 1
| B -> 3
| _ -> 0

बनाम

return val == A ? 1 : 
       val == B ? 3 : 
       0;

यह बहुत मजेदार है। ऐसा कभी नहीं सोचा था।
री मियासका

+1 @Benjol: मैं एक ही बात को इंगित करने जा रहा था (कि F # में, सब कुछ एक अभिव्यक्ति है, जिसमें if / elif / else शामिल है)। मैं आपके उदाहरण में भी टर्नरीज़ का उपयोग करता हूं, अब तक अनदेखा :)। एक और चीज जो मैं कर रहा हूं, जावास्क्रिप्ट में, शायद सबसे ऊपर, यह है: var res = function() {switch(input) {case 1: return "1"; case 2: return "2"; ...}}()भावों के रूप में स्विच का अनुकरण करना।
स्टीफन स्वेंसन

@ स्टीफन, मैं शब्दों का उपयोग करने जा रहा था expressionऔर statementमैं हमेशा चिंतित रहता हूं कि मैं उन्हें गलत तरीके से गोल कर
दूंगा

@ बैंजोल: मुझे पता है कि आपका क्या मतलब है!
स्टीफन स्वेनसेन

6
constचर को आरंभ करने के लिए C और C ++ में भी उपयोगी है जिन्हें बाद में नहीं बदला जा सकता है।
डेविड थोरले

13

एक वैध उपयोग का एक उदाहरण (IMHO):

printf("Success in %d %s\n", nr_of_tries, (nr_of_tries == 1 ? "try" : "tries"));

इसके परिणामस्वरूप 2 अलग-अलग प्रिंट स्टेटमेंट होने से अधिक पठनीय कोड होता है। नेस्टेड उदाहरण निर्भर करते हैं: (समझने योग्य? हाँ: नहीं)


11
बस ध्यान रखें कि यदि आप ऐसा करते हैं, तो आप इसे नरक बना रहे हैं, जिसे आपके आवेदन को स्थानीय बनाना है। बेशक, अगर यह कोई समस्या नहीं है, तो आगे बढ़ो।
आनन।

1
मेरे अंगूठे का यह नियम है: 1 स्तर का घोंसला बनाना (कुछ परिस्थितियों में)।
ओलिवर वीलर

7

बिल्कुल बुराई नहीं। वास्तव में, यह शुद्ध है , और यदि-तो-और नहीं है।

हास्केल, एफ #, एमएल आदि जैसी कार्यात्मक भाषाओं में, यह इफ-तत्कालीन कथन हैं जिन्हें बुराई माना जाता है।

इसका कारण यह है कि किसी भी "एक्शन" की तरह एक अनिवार्यता अगर-तब-तब बयान आपको इसकी परिभाषा से एक चर घोषणा को अलग करने की आवश्यकता है, और आपके फ़ंक्शन के लिए राज्य का परिचय देता है।

उदाहरण के लिए, निम्नलिखित कोड में:

const var x = n % 3 == 1
    ? Parity.Even
    : Parity.Odd;

बनाम

Parity x;
if (n % 3 == 1)
    x = Parity.Even;
else
    x = Parity.Odd;

पहले वाले को छोटे होने से अलग दो फायदे हैं:

  1. x एक स्थिर है, और इसलिए बग को शुरू करने की बहुत कम संभावना है, और संभवतः उन तरीकों से अनुकूलित किया जा सकता है जो दूसरा कभी नहीं हो सकता है।
  2. प्रकार को अभिव्यक्ति द्वारा स्पष्ट किया जाता है, इसलिए संकलक आसानी से अनुमान लगा सकता है कि xकिस प्रकार का होना चाहिए Parity

भ्रामक रूप से, कार्यात्मक भाषाओं में, टर्नरी ऑपरेटर को अक्सर if-अन्यथा कहा जाता है। हास्केल में, आप कह सकते हैं x = if n mod 3 == 1 then Odd else Even


हां, यह बिंदु @Benjol भी है। जावास्क्रिप्ट में अभिव्यक्तियों के रूप में स्विच स्टेटमेंट का अनुकरण करने के एक मजेदार तरीके के लिए उनके जवाब के लिए मेरी टिप्पणी देखें।
स्टीफन स्वेंसेन

7

वह विशेष अभिव्यक्ति मेरी आँखों को चोट पहुँचाती है; मैं अपनी टीम के किसी भी डेवलपर को बाहर कर दूंगा जिसने इसका इस्तेमाल किया क्योंकि यह अचूक है।

जब अच्छी तरह से इस्तेमाल किया जाता है तो टर्नरी ऑपरेटर बुरा नहीं है। उन्हें सिंगल लाइन भी नहीं होना चाहिए; एक लंबा एक जो अच्छी तरह से स्वरूपित है वह बहुत स्पष्ट और समझने में आसान हो सकता है:

return
      ( 'a' == $s ) ? 1
    : ( 'b' == $s ) ? 2
    : ( 'c' == $s ) ? 3
    :                 4;

मुझे पसंद है कि समकक्ष से बेहतर है अगर / फिर / अन्यथा श्रृंखला:

if ( 'a' == $s ) {
    $retval = 1;
}
elsif ( 'b' == $s ) {
    $retval = 2;
}
elsif ( 'c' == $s ) {
    $retval = 3;
}
else {
    $retval = 4;
}

return $retval;

मैं उन में सुधार करेंगे:

if    ( 'a' == $s ) { $retval = 1; }
elsif ( 'b' == $s ) { $retval = 2; }
elsif ( 'c' == $s ) { $retval = 3; }
else                { $retval = 4; }

return $retval;

यदि स्थितियां और असाइनमेंट आसान संरेखण की अनुमति देते हैं। फिर भी मैं टर्नरी संस्करण को पसंद करता हूं क्योंकि यह छोटा है और स्थितियों और असाइनमेंट के आसपास उतना शोर नहीं है।


मैं टिप्पणियों में लाइनब्रीक क्यों नहीं डाल सकता हूं? Arrgghh!
क्रिस्टोफर महन

3

VS.NET में ReSharper कभी-कभी ऑपरेटर के if...elseसाथ बदलने का सुझाव देता है ?:

ऐसा लगता है कि ReSharper केवल तभी सुझाव देता है जब स्थितियां / ब्लॉक एक निश्चित जटिलता स्तर से नीचे हों, अन्यथा यह साथ रहता है if...else


4
एक और शानदार फीचर मुझे ReSharper के बारे में बहुत पसंद है
अनाम टाइप

2

यह if / अन्यथा संयोजन के रूप में अच्छा दिखने के लिए पुन: स्वरूपित किया जा सकता है:

int median(int a, int b, int c)
{
    return
        (a<b)
        ?
            (b<c)
            ? b
            :
                (a<c)
                ? c
                : a
        :
            (a<c)
            ? a
            :
                (b<c)
                ? c
                : b;
}

लेकिन समस्या यह है कि मुझे वास्तव में यकीन नहीं है कि अगर मुझे इंडेंटेशन का प्रतिनिधित्व करने का अधिकार मिला तो वास्तव में क्या होगा। :-)


3
+1 मुझे लगता है कि यह एक समकक्ष if-elseसंरचना से कहीं बेहतर है । कुंजी स्वरूपण है।
परिक्रमा

13
अगर मैंने इसे एक कोड बेस में देखा, तो मैं गंभीरता से एक नई नौकरी की तलाश करूंगा।
निक लार्सन

+1 इस वास्तविक इंडेंटेशन के लिए नहीं, लेकिन इस उदाहरण के लिए यह सबसे अच्छा समाधान है ।
मार्क हर्ड

2
केवल यह कि एक और आकस्मिक स्वत: स्वरूपण उस सभी इंडेंटिंग को मिटा देगा, और पुनर्गठन के एक और दौर के लिए समय - बेहद उत्पादक :)
nawfal

2

बुराई से दूर, त्रिगुट संचालक एक देवता है।

  • यह सबसे उपयोगी है जब आप एक नेस्टेड अभिव्यक्ति में निर्णय करना चाहते हैं । क्लासिक उदाहरण एक फ़ंक्शन कॉल है:

    printf("I see %d evil construct%s in this program\n", n, n == 1 ? "" : "s");
    
  • आपके विशेष उदाहरण में, टर्नरी लगभग आभारी है, क्योंकि यह एक के तहत शीर्ष-स्तरीय अभिव्यक्ति है return। आप सशर्त को returnकीवर्ड के अलावा किसी अन्य चीज़ की नकल किए बिना बयान स्तर तक उठा सकते हैं ।

एनबी नथिंग कभी भी उस विशेष एल्गोरिथ्म को मध्ययुगीन पढ़ने में आसान बना देगा।


यह इतना पठनीय होना मुश्किल है कि आप इसे बेहतर नहीं बना सकते। printf("I see %d evil construct%s in this program\n", n, "s" unless (n == 1) "s");
पचेरियर

2
  1. "ईविल" एक तरफ तर्क देता है, मेरे अनुभव में मैंने एक प्रोग्रामर के उपयोग के बीच एक उच्च सहसंबंध पाया है टरनेरी ऑपरेटर और उसके या उसके पूरे कोडबेस की संभावना को पढ़ना, अनुसरण करना और बनाए रखना मुश्किल है (यदि बाहरी रूप से अवांछित नहीं है)। यदि किसी प्रोग्रामर का अपने चरित्र को समझने में सक्षम होने की तुलना में कुछ 1-2 वर्ण रेखाओं को बचाने के साथ अधिक चिंतित है, तो एक टर्नरी कथन को समझने वाला कोई भी मामूली भ्रम आमतौर पर हिमशैल का टिप है।

  2. टर्नरी संचालक जादू की संख्याओं को आकर्षित करते हैं जैसे s ** t मक्खियों को आकर्षित करता है।

यदि मैं किसी विशेष समस्या को हल करने के लिए एक ओपन सोर्स लाइब्रेरी की तलाश कर रहा था, और मैंने कोड को उक्त लाइब्रेरी के लिए एक उम्मीदवार के मूल पोस्टर टर्नरी ऑपरेटरों के रूप में देखा, तो चेतावनी की घंटी मेरे सिर में जा रही थी और मैं इस पर विचार करना शुरू करूंगा। से उधार लेने के लिए कुछ अन्य परियोजना के लिए।


2

यहाँ जब यह का एक उदाहरण है है बुराई:

oldValue = newValue >= 0 ? newValue : oldValue;

यह भ्रामक और बेकार है। संकलक दूसरी अभिव्यक्ति (oldValue = oldValue) का अनुकूलन कर सकता है , लेकिन कोडर ने पहले स्थान पर ऐसा क्यों किया?

एक और ख़ुशी:

thingie = otherThingie != null ? otherThingie : null;

कुछ लोगों को सिर्फ कोडर्स होने का मतलब नहीं है ...

ग्रेग कहते हैं कि यदि कथन 'शोर' के बराबर है। यह है अगर आप इसे महानता से लिखते हैं। लेकिन वही अगर लिखा जा सकता है:

if ('a' == $s) return 1;
if ('b' == $s) return 2;
if ('c' == $s) return 3;
return 4;

जो टर्नरी से ज्यादा शोर नहीं है। मुझे आश्चर्य है कि अगर टर्नरी शॉर्ट-कट; क्या सभी भावों का मूल्यांकन किया जाता है?


आपका दूसरा उदाहरण मुझे याद दिलाता है if (x != 0) x = 0;...
fredoverflow

2

बुराई? देखो, वे बस अलग हैं।

ifएक बयान है। (test ? a : b)अभिव्यक्ति है। वे एक ही बात नहीं कर रहे हैं

भाव व्यक्त करने के लिए मौजूद हैं। कथन कार्य करने के लिए मौजूद हैं। अभिव्यक्तियाँ बयानों के अंदर प्रकट हो सकती हैं, लेकिन इसके विपरीत नहीं। तो आप अन्य अभिव्यक्तियों के भीतर टर्नरी एक्सप्रेशंस का उपयोग कर सकते हैं, जैसे किसी समन में शर्तों के लिए, या किसी विधि के लिए तर्क के लिए, और इसी तरह। आपके पास नहीं है , लेकिन आप चाहें तो ऐसा कर सकते हैं । इसमें कुछ भी गलत नहीं है। कुछ लोग कह सकते हैं कि यह बुराई है, लेकिन यह उनकी राय है।

एक टर्नरी अभिव्यक्ति का एक मूल्य यह है कि यह आपको सच्चे और झूठे दोनों मामलों को संभालने के लिए बनाता है। ifबयान नहीं।

यदि आप पठनीयता के बारे में चिंतित हैं, तो आप उन्हें आसानी से प्रारूपित कर सकते हैं।

किसी तरह "बुराई" प्रोग्रामिंग शब्दावली में आता है। मुझे यह जानकर अच्छा लगा कि किसने सबसे पहले इसे गिराया। (वास्तव में, मुझे संदेह है - वह एमआईटी में है।) मैं बल्कि इस क्षेत्र में मूल्य निर्णय के लिए उद्देश्यपूर्ण कारण था, न कि केवल लोगों के स्वाद और नाम-पुकार।


1
क्या मुझे संदेह है कि संदिग्ध कौन है? बस क्षेत्र के अपने ज्ञान को थोड़ा सुधारने के लिए।
mlvljr

1
@mlvljr: वैसे मैं गलत हो सकता हूं, इसलिए बेहतर नहीं।
माइक डनलवे

1

इसका एक स्थान है। मैंने बहुत सी कंपनियों में काम किया है जहाँ डेवलपर्स के कौशल का स्तर भयानक से जादूगर तक है। चूंकि कोड को बनाए रखा जाना है, और मैं हमेशा के लिए नहीं रहूंगा, इसलिए मैं सामान लिखने की कोशिश करता हूं ताकि ऐसा लगे कि यह वहां है (मेरी आदतों के साथ टिप्पणियों को देखे बिना, यह आपके लिए सक्षम होने के लिए अत्यंत दुर्लभ है। उस कोड को देखें जिस पर मैंने काम किया है, जहां मैंने बदलाव किए हैं), और यह कि कोई अपने से कम कौशल वाला व्यक्ति इसे बनाए रख सकता है।

जबकि टर्नरी ऑपरेटर निट्ज़िफ़िक और शांत होता है, मेरा अनुभव यह है कि कोड ऑफ लाइन को बनाए रखना असंभव है। मेरे वर्तमान नियोक्ता में, हमारे पास ऐसे उत्पाद हैं जो लगभग 20 वर्षों से शिपिंग हैं। मैं उस उदाहरण का कहीं भी उपयोग नहीं करूंगा।


1

मुझे नहीं लगता कि टर्नरी ऑपरेटर बुराई है।

यहाँ एक गोटा है जो मुझे स्टम्प्ड किया गया था, हालाँकि। मैं कई (10+) के लिए एक सी प्रोग्रामर था और 1990 के दशक के अंत में मैं वेब आधारित एप्लिकेशन प्रोग्रामिंग में चला गया। एक वेब प्रोग्रामर के रूप में, मैं जल्द ही PHP में भाग गया, जिसमें एक टर्नरी ऑपरेटर भी है। मेरे पास PHP प्रोग्राम में एक बग था जिसे मैंने अंत में नेस्टेड टर्नरी ऑपरेटर के साथ कोड की एक पंक्ति में खोजा था। यह पता चला है कि PHP टर्नरी ऑपरेटर बाएं से दाएं जुड़ा हुआ है लेकिन C टर्नेरी ऑपरेटर (जिसे मैं इस्तेमाल किया गया था) दाएं से बाएं जोड़ देता है।


1

जो कुछ भी आपके कोड को बदसूरत बनाता है वह बुराई है।

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

"Hello ".($Male?"Mr":"Ms")." $Name

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


1

क्या मैं यह कह सकता हूँ? मैं टर्नरी ऑपरेशन बुराई के इस विशेष अनुप्रयोग को खोजने का प्रबंधन नहीं कर सकता :

  1. यह जो ऑपरेशन करता है वह बहुत तुच्छ होता है, और एक बार जब आप इसे छोड़ देते हैं, तो शायद ही यह संभव हो कि कुछ कीड़े निकल आएंगे;
  2. यह क्या करता है स्पष्ट रूप से फ़ंक्शन नाम में कहा गया है;
  3. लेने के लिए कुछ स्पष्ट है और इतना स्पष्ट रूप से भविष्य में सुधार नहीं होगा (जब तक कि एक जादू मंझला एल्गोरिथ्म अब तक नहीं चल पाया है)।

कृपया दया करें, मेरी प्रतिष्ठा पहले से ही काफी दयनीय है।


1

सबसे बड़ी जीत: यह दिखाना कि कार्रवाई का एक ही लक्ष्य है।

if ( $is_whatever )
    $foo = 'A';
else
    $foo = 'B';

दो कोड पथ हैं जिनका आप अनुसरण कर सकते हैं, और पाठक को यह देखने के लिए ध्यान से पढ़ना चाहिए कि कौन से दो चर निर्धारित किए जा रहे हैं। इस मामले में, यह केवल एक चर है, लेकिन पाठक को यह पता लगाने के लिए और अधिक पढ़ना है। आखिरकार, यह हो सकता है:

if ( $is_whatever )
    $foo = 'A';
else
    $bar = 'B';

टर्नेरी ऑपरेटर के साथ, यह स्पष्ट है कि केवल एक चर सेट किया जा रहा है।

$foo = $is_whatever ? 'A' : 'B';

सबसे निचले स्तर पर, यह DRY (अपने आप को दोहराना मत) सिद्धांत है। यदि आप $fooकेवल एक बार निर्दिष्ट कर सकते हैं , तो ऐसा करें।


0

यदि ... तो ... और स्थिति पर जोर देने के लिए और सशर्त रूप से किए जा रहे कार्यों पर जोर देने के लिए जाता है।

ternary ऑपरेटर विपरीत है, यह स्थिति को छिपाने के लिए जाता है और तब उपयोगी होता है जब ऑपरेशन किया जा रहा हो, यह स्थिति की तुलना में अधिक महत्वपूर्ण होता है।

कुछ भाषाओं में मामूली तकनीकी झगड़े हैं, कि वे एक बयान के कारण और एक अभिव्यक्ति के कारण काफी इंटरचेंज नहीं हैं, जैसे C ++ में सशर्त रूप से प्रारंभिक संकेतन।


0

कब उचित है, और कब नहीं?

मुझे लगता है कि जब एक सजातीय समूह के लोगों के लिए विकसित हो रहा है, तो कोई समस्या नहीं है, लेकिन जब आपको ऐसे लोगों से निपटना पड़ता है जो विभिन्न स्तरों को संभालते हैं, तो इस तरह के ऑनलिनर्स केवल कोड के लिए जटिलता का एक और स्तर पेश करते हैं। इसलिए, इस मामले पर मेरी नीति है: कोड स्पष्ट और कोड लघु के बजाय समझाएं और 123123 बार समझाएं।

क्या इसे शुरुआती लोगों से सिखाया या छिपाया जाना चाहिए?

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


0

IMO, ऑपरेटर स्वयं दुष्ट नहीं है, लेकिन C (और C ++) में इसके लिए प्रयुक्त सिंटैक्स अत्यधिक रूप से प्रचलित है। IMO, Algol 60 ने इसे बेहतर किया, इसलिए कुछ इस प्रकार है:

A = x == y ? B : C;

इस तरह अधिक दिखाई देगा (लेकिन सामान्य रूप से सी-जैसे सिंटैक्स से चिपके हुए):

A = if (x==y) B else C;

उसके साथ भी, अत्यधिक गहरे घोंसले के शिकार को पठनीयता के साथ समस्याएं हो सकती हैं, लेकिन कम से कम ए) जो कोई भी प्रोग्रामिंग करता है, वह इसे एक साधारण से समझ सकता है, और बी) जो लोग इसे समझते हैं वे काफी आसानी से बहुत अच्छे घोंसले को संभाल सकते हैं। OTOH, मैं यह भी ध्यान देता हूँ कि LISP में (उदाहरण के लिए) एक condबहुत ही टार्नेरी स्टेटमेंट की तरह है - बयानों का एक सेट नहीं है, लेकिन एक एकल अभिव्यक्ति एक मूल्य देता है (फिर फिर से, अधिकांश LISP की तरह है कि .. ।)


सिर्फ पठनीयता के लिए ऐसा क्यों नहीं? A = (x==y) ? B : C
जेरेमी हेइलर

@ जेरेमी: जबकि कुछ लोग पैरेन्स को उपयोगी पाते हैं, यहां तक ​​कि सबसे अच्छे रूप में वे ज्यादा मदद नहीं करते हैं । एक जोड़े से अधिक गहरा घोंसला और चीजों को सुलझाए रखने के लिए आपको अभी भी सावधान इंडेंटेशन (नंगे न्यूनतम के रूप में) की आवश्यकता है। निस्संदेह ऐसा ही अंततः अल्गोल में होगा, लेकिन मैं कभी भी इसमें कोई समस्या नहीं कहता, जैसे मैं अक्सर सी में करता हूं ...
जेरी कॉफिन

मैंने सिर्फ यह माना कि हर कोई इस बात पर सहमत था कि एक टर्नरी ऑपरेटर का घोंसला बनाना बुरा है। मैं विशेष रूप से आपके द्वारा दिए गए उदाहरणों के बारे में बोल रहा था। विशेष रूप से, पहले वाले को अधिकांश भाषाओं में दूसरे की तरह कैसे किया जा सकता है।
जेरेमी हेइलर

0

एक दुकान जो नियमित रूप से 600-1200-लाइन विधियों को लिखती है, मुझे यह नहीं बताना चाहिए कि एक टर्नरी "समझना मुश्किल है"। कोई भी दुकान जो नियमित रूप से एक कोड शाखा का मूल्यांकन करने के लिए पांच शर्तों की अनुमति देती है, मुझे यह नहीं बताना चाहिए कि एक त्रैमासिक में संक्षेप में प्रस्तुत की गई शर्तें "पढ़ने के लिए कठिन" हैं।


0

कब है ?: उपयुक्त, और यह कब नहीं है?

  • यदि आपको प्रदर्शन लाभ नहीं मिलता है, तो इसका उपयोग न करें; यह आपके कोड की पठनीयता को प्रभावित करता है।
  • एक बार इसका उपयोग करें और इसे घोंसला न दें।
  • डिबग करना कठिन है।

क्या इसे शुरुआती लोगों से सिखाया या छिपाया जाना चाहिए?

कोई फर्क नहीं पड़ता, लेकिन यह जानबूझकर छिपाया नहीं जाना चाहिए क्योंकि यह सीखने के लिए "शुरुआत" के लिए बहुत जटिल नहीं है।


-2

आपके उदाहरण में:

def median(a, b, c):
    if a < b < c: return b
    if a < c < b: return c
    if b < a < c: return a
    if b < c < a: return c
    if c < a < b: return a
    if c < b < a: return b

पढ़ने के लिए बहुत सरल है, और स्पष्ट है। <<के बीच का वैरिएबल रिटर्न वैल्यू है।

अपडेट करें

समान, लेकिन कोड की कम लाइनें। फिर भी सरल मुझे लगता है।

def median(a, b, c):
    if b<a<c or c<a<b: return a
    if a<b<c or c<b<a: return b
    if a<c<b or b<c<a: return c

इसके लिए सबसे बुरी स्थिति में 12 तुलनाओं की आवश्यकता होती है ...
फ़्रेडओवरफ़्लो 20

1
शायद, लेकिन यह सुपाठ्य है।
क्रिस्टोफर महान

-2

यह कब्ज के लिए भी आवश्यक है

const int nLegs  = isChicken ? 2: 4 ;

अजीब। मुझे लगता है कि इसका सी ++ या कुछ और है। मैंने सोचा था कि कॉन्स्ट हमेशा समय की निरंतरता थी (जैसा कि C # में)
nawfal

@nffal - यदि आप नहीं जानते हैं तो रनटाइम होने तक जारी रखें
मार्टिन बेकेट

हाँ, क्या। मुझे लगता constहै कि कुछ भाषाओं में ऐसा है। C # में constहमेशा समय ज्ञात मूल्य संकलित करना चाहिए। जिसका अर्थ है const int nLegs = isChicken ? 2: 4 ;अभ्यस्त काम है, लेकिन const int nLegs = true ? 2: 4 ;होगा
nawfal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.