2012-05-10 9 views
16

मैं Raphael.js के स्रोत कोड के माध्यम से देख रहा था कि यह पता लगाने के लिए कि उसने आरजीबी मूल्यों को एचएसबी में कैसे परिवर्तित किया। मैं समारोह में उन्होंने यह किया पता चला और मैं इसे अजगर को बदलने जब मैं यह अच्छा ट्रिपल नेस्ट त्रिगुट ऑपरेटर से टकरा की प्रक्रिया में था:कुछ हद तक दर्दनाक ट्रिपल-नेस्टेड टर्नरी ऑपरेटर

H = (C == 0 ? null : 
    V == r ? (g - b)/C : 
    V == g ? (b - r)/C + 2 : 
      (r - g)/C + 4 
    ); 

यह मुझे एक पाश के लिए फेंक दिया क्योंकि अजगर नहीं है जावास्क्रिप्ट करता है कि एक ही तरह का टर्नरी ऑपरेटर है। मैं थोड़ी देर के खर्च इस पर देख रही है और अंत में यह कुछ हद तक saner कोड टुकड़ों में बांटा (का उपयोग करते हुए केवल/else if) इससे बाहर:

if (C == 0) { 
    H = null; 
} else { 
    if(V == r) { 
     H = (g - b)/C; 
    } else { 
     if(V == g) { 
      H = (b - r)/C + 2; 
     } else { 
      H = (r - g)/C + 4; 
     } 
    } 
} 

मेरी व्याख्या सही था? मैं केवल यह पूछ रहा हूं क्योंकि यदि यह सही नहीं है, तो मुझे डीबगिंग के लॉट का सामना करना पड़ रहा है। इसलिए। क्या मैंने इसे "प्राप्त किया"?

+0

हां, ऐसा लगता है कि आपको कुछ पूंजीकरण विसंगतियों से अलग तर्क मिल गया है, –

+1

'if (c == 0) 'पर पहला' सी' पूंजी 'सी' होना चाहिए, नहीं? –

+0

हू, क्या मैंने किया? मुझे लगता है कि एक डार्टबोर्ड पर एक डार्ट फेंक दिया गया है, मेरे पीछे की ओर मेरी बाहों के पीछे बंधे हुए हैं, अंधाधुंध हो गए हैं, और एक बुलसेई बनाया है। और हाँ, @ निफ्टीडुड, यह सही है। पकड़ने के लिए धन्यवाद! –

उत्तर

20

मुझे लगता है कि आप इस हो सकता है गहरी घोंसले से बचने के लिए:

var H 

if (C == 0) 
    H = null; 
else if (V == r) 
    H = (g - b)/C; 
else if (V == g) 
    H = (b - r)/C + 2; 
else 
    H = (r - g)/C + 4; 

यह है क्योंकि घुंघराले ब्रेसिज़ छोड़ संभव है:

var H 

if(C == 0){ 
    H = null; 
} 
else if(V == r){ 
    H = (g - b)/C; 
} 
else if (V == g){ 
    H = (b - r)/C + 2; 
} 
else { 
    H = (r - g)/C + 4; 
} 
+0

क्यों एक अच्छा [सच्चाई स्विच स्टेटमेंट] का उपयोग नहीं करें (https: // stackoverflow।कॉम/प्रश्न/5464362/जावास्क्रिप्ट-एक-हालत-इन-स्विच-केस/9055603 # 9055603) जब आप इसमें हों;) –

+0

@ गुस्तावंद क्या आपको पता चलेगा कि इसका जवाब 5 साल पहले सही था? – Joseph

+0

ओह हाँ मैं –

5

यही तर्क बेहद सरल तरीका में लिखा जा सकता है प्रत्येक शर्त में एक ही बयान। और यह देखते हुए कि शर्तें पारस्परिक रूप से अनन्य हैं, else if का उपयोग if एस घोंसले से कहीं अधिक स्पष्ट है।

+1

बहुत अच्छा, धन्यवाद। मैं ज्यादातर तर्क सत्यापन की तलाश में था, हालांकि, बस fyi। :) –

+0

यह बहुत व्यापक रूप से स्वीकार किया गया है कि ब्रैकेट का उपयोग न करने की जगह/"सफाई" बचत कोड रखरखाव के खतरनाक प्रभावों से काफी अधिक है। http://stackoverflow.com/a/2125078/205192 – DougW

2

हां, यह सही है (पूंजीकरण मतभेदों के अलावा)। फिर भी, यह क्लीनर, किसी भी कोष्ठक के बिना लिखा जा सकता है पठनीय elseif के रूप में:

const H = 
    C == 0 ? null   : 
    V == r ? (g - b)/C  : 
    V == g ? (b - r)/C + 2 : 
      (r - g)/C + 4 ; 
+0

चूंकि मैं इसे पायथन में परिवर्तित कर दूंगा, सिंटैक्स वास्तव में कोई फर्क नहीं पड़ता। वैसे भी धन्यवाद, यद्यपि! –

+2

मुझे लगता है कि पाइथन बराबर 'elif' होगा ... बिंदु जो हर कोई अनावश्यक इंडेंटेशन से बचने के लिए करना चाहता है। –

+1

@GGG: यह सही है। और हाँ। मुझे लगता है कि यदि आप एक प्रोग्रामर हैं तो आपकी प्राकृतिक वृत्ति कुछ भी पठनीय बनाने के लिए है ... इसके लिए किसी को दोष नहीं दे सकता! –

15
मेरी व्यक्तिगत स्वाद के लिए

, एक सावधानी से गठबंधन नेस्टेड त्रिगुट अगर-esle गड़बड़ धड़कता है इस इंडेंटेशन प्लेसमेंट पैटर्न का उपयोग करके दान अब्रामोव को देखा है। जबकि मुझे यह नहीं लगता कि सशर्त ऑपरेटर ? अब इस स्थिति का स्पष्ट रूप से पालन कैसे करता है, मैं इसे @ लॉल्मॉस के उदाहरण की तरह कुछ पसंद करता हूं जिसमें इंडेंटेशन सशर्त आकार के बावजूद हमेशा सुसंगत रहेगा।

आप वास्तव में इसे ? सच : झूठी के रूप में देखना शुरू कर देते हैं जो यहां पर दृष्टिहीन है। और इस तरह, मुझे लगता है कि टर्नरी आसपास के कोड से स्पॉट और अंतर करने के लिए बहुत आसान है।

3
H = C == 0 
    ? null 
    : V == r 
     ? (g - b)/C 
     : V == g 
      ? (b - r)/C + 2 
      : (r - g)/C + 4 

मैं:

if (C == 0) 
    h = null; 
else if (V == r) 
    h = (g - b)/C; 
else if (V == g) 
    h = (b - r)/C + 2; 
else 
    h = (r - g)/C + 4;