2009-11-19 23 views
17

आह, क्या आपको सिर्फ एक अच्छा टर्नरी दुरुपयोग पसंद नहीं है? :) पर विचार करें निम्नलिखित अभिव्यक्ति:सी # में टर्नरी ऑपरेटर सहयोगीता - क्या मैं इस पर भरोसा कर सकता हूं?

true ? true : true ? false : false 

आप में से जो लोग अब पूरी तरह से उलझन में हैं, मैं आपको बता सकता है कि इस सच मूल्यांकन करता है। दूसरे शब्दों में, यह इसके बराबर है:

true ? true : (true ? false : false) 

लेकिन क्या यह विश्वसनीय है? कि कुछ परिस्थितियों में यह यह करने के लिए नहीं आएगा मैं कुछ किया जा सकता है:

(true ? true : true) ? false : false 

कुछ कह सकते हैं - अच्छी तरह से, बस कोष्टक तो जोड़ने या इसे पूरी तरह उपयोग नहीं करते हैं - सब के बाद, यह एक अच्छी तरह से ज्ञात तथ्य है वह टर्नरी ऑपरेटर बुराई हैं!

निश्चित रूप से वे हैं, लेकिन कुछ परिस्थितियां हैं जब वे वास्तव में समझ में आती हैं। जिज्ञासु लोगों के लिए - मैं कोड लिख रहा हूं जो गुणों की एक श्रृंखला द्वारा दो वस्तुओं की तुलना करता है। यह बहुत अच्छा होगा अगर मैं इसे इस तरह लिखता हूं:

obj1.Prop1 != obj2.Prop1 ? obj1.Prop1.CompareTo(obj2.Prop1) : 
obj1.Prop2 != obj2.Prop2 ? obj1.Prop2.CompareTo(obj2.Prop2) : 
obj1.Prop3 != obj2.Prop3 ? obj1.Prop3.CompareTo(obj2.Prop3) : 
obj1.Prop4.CompareTo(obj2.Prop4) 

साफ़ और संक्षिप्त। लेकिन यह पहले मामले की तरह काम कर रहे टर्नरी ऑपरेटर सहयोगीता पर निर्भर करता है। Parenthesis सिर्फ स्पेगेटी इसे बाहर कर देगा।

तो - क्या यह कहीं भी निर्दिष्ट है? मुझे यह नहीं मिला।

+0

क्या आप सुनिश्चित हैं कि आपका कोड आपका मतलब है? जैसे अगर obj1.Prop1! = obj2.Prop1 लेकिन obj1.Prop1.compareTo (obj2.Prop1) == 0, आपका कोड Prop2 की जांच करने के बजाय आगे बढ़ने के बजाय 0 उत्पन्न करेगा। क्या इसका इरादा है? – atzz

+5

सिर्फ इसलिए कि आप जिस तरह से दिखते हैं उसे सही नहीं बनाते हैं, और निश्चित रूप से इसे पठनीय नहीं बनाते हैं .. किसी और को उस कोड को देखने से कम से कम मानसिक रूप से ब्रांड्स को जोड़ना होगा, तो सभी को एक पक्ष क्यों न करें और कोड की उन पंक्तियों को दोबारा दोहराएं। –

+0

atzz - मान आदिम प्रकार हैं - यह तब तक नहीं होना चाहिए जब तक कि स्पेसटाइम में कोई वार न हो। मिकी डी - सुझाव? ध्यान रखें कि यह लैम्ब्डा अभिव्यक्ति के लिए है, इसलिए मैं इसे छोटा रखना चाहता हूं। इसके अलावा मैं टिप्पणियां जोड़ूंगा, जो कोड को देखने वाले किसी के लिए चीजों को स्पष्ट करना चाहिए। –

उत्तर

21

हां, आप इस पर भरोसा कर सकते हैं (न केवल सी # में, लेकिन सभी में (मुझे पता है) अन्य भाषाओं (except PHP ... आकृति पर जाएं) एक सशर्त ऑपरेटर के साथ) और आपका उपयोग-मामला वास्तव में एक सामान्य आम अभ्यास है हालांकि कुछ लोग इसे घृणा करते हैं।

ECMA-334 (सी # मानक) में प्रासंगिक अनुभाग 14.13 §3 है:

सशर्त ऑपरेटर, राइट-साहचर्य है जिसका अर्थ है कि आपरेशन दाईं से बाईं ओर वर्गीकृत किया है। [उदाहरण: a ? b : c ? d : e फॉर्म की एक अभिव्यक्ति का मूल्यांकन a ? b : (c ? d : e) के रूप में किया गया है। अंत उदाहरण]

+4

पठनीयता पर एक नोट। एक कार्यात्मक प्रोग्रामिंग पृष्ठभूमि वाला कोई भी व्यक्ति इसे तुरंत पहचान लेगा (यह लगभग उचित स्वरूपण के साथ हास्केल के गार्ड क्लॉज की तरह दिखता है)। इसलिए जब यह सार्वभौमिक रूप से स्वीकार्य और प्रयोग योग्य नहीं हो सकता है, यह निश्चित रूप से * कुछ मंडलियों में मूर्खतापूर्ण है और कुछ परियोजनाओं में बहुत उपयुक्त हो सकता है। एक और व्यक्तिगत नोट पर, * मैं * व्यक्तिगत परियोजनाओं में इसका उपयोग करता हूं, मुझे लगता है कि यह * अधिक * * जंजीर 'if's से अधिक पठनीय है, और यदि आप इसे पढ़ नहीं सकते हैं तो मेरे कोड से बाहर निकलें। –

+0

"कुछ मंडलियों [या परियोजनाओं] में" महत्वपूर्ण है! –

+0

आप PHP में इस पर भरोसा नहीं कर सकते: http://stackoverflow.com/questions/1921422/php-nested-conditional-operator-bug –

17

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

पुन: "पूरी चीज कोष्ठक के साथ लिखने का प्रयास करें।"

result = (obj1.Prop1 != obj2.Prop1 ? obj1.Prop1.CompareTo(obj2.Prop1) : 
     (obj1.Prop2 != obj2.Prop2 ? obj1.Prop2.CompareTo(obj2.Prop2) : 
     (obj1.Prop3 != obj2.Prop3 ? obj1.Prop3.CompareTo(obj2.Prop3) : 
            obj1.Prop4.CompareTo(obj2.Prop4)))) 

स्पष्टीकरण:

  • "। आप से पूछना करने के लिए है तो , नहीं है"
  • "कोई भी पढ़ रहा है कोड ..."

एक परियोजना में सम्मेलनों आम के बाद कैसे आप निरंतरता बनाए रखने, जो पठनीयता में सुधार है। यह आप जो लोग भी भाषा नहीं जानते सहित सभी — करने के लिए कोड पठनीय लिख सकते हैं सोचने के लिए एक मूर्ख काम होगा !

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

ने कहा कि — यदि बिना किसी ब्रांडेरी अभिव्यक्तियों का उपयोग करते हैं तो आपके प्रोजेक्ट में एक आम और स्वीकार्य सम्मेलन है, फिर इसका उपयोग करें, हर तरह से! आपको यह पूछना था कि यह आपकी परियोजना में सामान्य या स्वीकार्य नहीं है। यदि आप अपनी परियोजना में सम्मेलनों को बदलना चाहते हैं, तो स्पष्ट रूप से स्पष्ट करें, इसे अन्य परियोजना सदस्यों के साथ चर्चा करने के लिए कुछ चिह्नित करें, और आगे बढ़ें। यहां इसका मतलब है कि ब्रांड्स का उपयोग करना या यदि अन्यथा उपयोग करना है।

एक अंतिम बिंदु विचार करने के लिए, यदि आपके कोड के कुछ आप के लिए चालाक लगता है:

डिबगिंग दो बार के रूप में कठिन पहली जगह में कोड लिखने के रूप में। इसलिए, यदि आप जितना संभव हो सके कोड को लिखते हैं, तो आप परिभाषा के अनुसार, इसे डीबग करने के लिए पर्याप्त स्मार्ट नहीं हैं। — ब्रायन डब्ल्यू Kernighan

+0

यह एक लैम्ब्डा अभिव्यक्ति के लिए है। अन्य तरीकों से केवल मामूली बेहतर आईएमएचओ होगा। –

+4

बिल्कुल सहमत हुए। अगर आपको पूछना है, तो यह स्पष्ट नहीं है। यदि यह स्पष्ट नहीं है, तो इसके चारों ओर एफ-आईएनजी कोष्ठक डालें और एक चालाक प्रोग्रामर बनना बंद करें। यही वह जगह है जहां से सबसे बुरी चीजें आती हैं। दो वैध बिंदुओं के लिए –

+0

+1। – OregonGhost

1

MSDN को देखें:। http://msdn.microsoft.com/en-us/library/ty67wk28%28VS.80%29.aspx

"अगर हालत सही है, पहली अभिव्यक्ति का मूल्यांकन किया और परिणाम हो जाता है; झूठे हैं, दूसरी अभिव्यक्ति का मूल्यांकन किया और परिणाम हो जाता है केवल दो अभिव्यक्तियों में से एक का मूल्यांकन कभी किया जाता है। "

+0

सच है, लेकिन यह सहयोगीता के बारे में कुछ भी नहीं कहता है। –

+0

@ विल्क्स - हालांकि, आप सही हैं, हालांकि, प्रश्न के सहयोगी हिस्से को एक संपादन के दौरान जोड़ा गया था, जब मैंने पहले ही अपना जवाब दिया था (प्रश्न पर संपादन इतिहास देखें)। मूल प्रश्न पढ़ता है: "लेकिन यह टर्नरी ऑपरेटर प्राथमिकता पर निर्भर करता है"। तो मेरा जवाब प्राथमिकता पर आधारित था। – dcp

+0

वाह। पुराने उत्तरों की समीक्षा? :) वैसे भी, मैं अभी भी "सहयोगी बनाम प्राथमिकता" चीज़ के बारे में खुद को आलसी हूं, इसलिए - मेरी माफ़ी! :) –

4

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

obj1.Prop1 != obj2.Prop1 
    ? obj1.Prop1.CompareTo(obj2.Prop1) 
    : obj1.Prop2 != obj2.Prop2 
      ? obj1.Prop2.CompareTo(obj2.Prop2) 
      : obj1.Prop3 != obj2.Prop3 
        ? obj1.Prop3.CompareTo(obj2.Prop3) 
        : obj1.Prop4.CompareTo(obj2.Prop4); 
+2

पुन: आपका अंतिम वाक्य। मुझे लगता है कि सवाल मूल्यांकन के आदेश के बारे में नहीं था, यह सहयोगीता के बारे में था। वो दो चीजें पूरी तरह से अलग हैं। –

+0

मुझे और अधिक स्पष्ट होना चाहिए था कि यह इस तरह से संबद्ध है जो अभिव्यक्ति को अपेक्षित फैशन में बाएं से दाएं मूल्यांकन करने की अनुमति देता है। – tvanfosson

1
x = cond1 ? result1 
    : cond2 ? result2 
    : cond3 ? result3 
    : defaultResult; 

बनाम
if (cond1) x = result1; 
else if (cond2) x = result2; 
else if (cond3) x = result3; 
else x = defaultResult; 

मैं पहले एक अच्छा लगता है।

हां, आप सशर्त ऑपरेटर सहयोगीता पर भरोसा कर सकते हैं। मैनुअल में, लिंक पर कृपया डीसीपी द्वारा प्रदान की गई लिंक पर, उदाहरण के साथ "सशर्त ऑपरेटर सही-सहयोगी" है। और, जैसा कि आपने सुझाव दिया था और मैं और अन्य सहमत हैं, तथ्य यह है कि आप इस पर भरोसा कर सकते हैं स्पष्ट कोड की अनुमति देता है।

+3

बधाई। अब सवाल पढ़ें। –

+0

हां, आप सशर्त ऑपरेटर सहयोगीता पर भरोसा कर सकते हैं। मैनुअल में, लिंक पर कृपया डीसीपी द्वारा प्रदान की गई लिंक पर, उदाहरण के साथ "सशर्त ऑपरेटर सही-सहयोगी" है। और, जैसा कि आपने सुझाव दिया था और मैं और अन्य सहमत हैं, तथ्य यह है कि आप इस पर भरोसा कर सकते हैं स्पष्ट कोड की अनुमति देता है। – Tim

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