2012-03-02 13 views
10

मुझे हाल ही में पता चला है कि जावा (और स्कैला) में गैर-शॉर्ट सर्किटिंग लॉजिकल ऑपरेटर &, |, और ^ शामिल हैं। मैंने पहले सोचा था कि ये केवल बिटवाई ऑपरेटरों के रूप में काम करते थे। जबकि शायद ^ के लिए कोई तर्क है, मैं गैर-शॉर्ट-सर्किटिंग लॉजिकल ऑपरेटरों का उपयोग करने के बहुत अच्छे कारणों के बारे में नहीं सोच सकता - हालांकि, मैं एक उदाहरण का विरोध कर सकता हूं।क्या जावा/स्कैला में गैर-शॉर्ट-सर्किटिंग लॉजिकल (बूलियन) ऑपरेटर के लिए अच्छे उपयोग हैं?

क्या ये ऑपरेटर उपयोगी हैं? वे हार्ड-टू-कैच बग का कारण बनने की अधिक संभावना रखते हैं।

scala> def foo = { 
    | println("foo") 
    | true 
    | } 
foo: Boolean 

scala> def bar = { 
    | println("bar") 
    | true 
    | } 
bar: Boolean 

scala> foo || bar 
foo 
res5: Boolean = true 

scala> foo | bar 
foo 
bar 
res6: Boolean = true 
+1

नहीं, बिटवाई ऑपरेटरों का केवल बिटवाई ऑपरेशंस के लिए उपयोग किया जाना चाहिए, IMHO :) –

+1

इस प्रश्न का एकमात्र संभावित उत्तर "गैर-शॉर्ट-सर्किटिंग ऑपरेटर उपयोगी हैं जब आप शॉर्ट सर्किट नहीं चाहते हैं"। तो असली सवाल यह है कि "आप शॉर्ट सर्किटिंग कब नहीं चाहते हैं"? –

उत्तर

14

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

+1

पूरी तरह से सहमत हैं, यह वास्तविक कोड में नहीं किया जाना चाहिए। –

+0

जैसा कि मैंने कहा था, मैं एक समेकित उदाहरण बना सकता हूं ;-) – schmmd

8

हम्म। मुझे पता है कि अगर वे ध्यान से इस्तेमाल किया जाता है तो वे सी/सी ++ कोड को अनुकूलित करने के लिए अविश्वसनीय रूप से उपयोगी हो सकते हैं। यह जावा पर भी लागू हो सकता है।

वास्तविक बिट ऑपरेशंस के अलावा सी में प्रमुख उपयोग - एक पाइपलाइन स्टॉल को निकालना है। शॉर्ट सर्किट ऑपरेटरों को शाखा संचालन की आवश्यकता होती है। Bitwise ऑपरेटर दोनों पक्षों की गणना करेगा और एक गलत भविष्यवाणी शाखा और परिणामी स्टाल के मौके को हटा देगा।

+0

मुझे लगता है कि आपको कोड निष्पादित करने की लागत के खिलाफ स्टाल की लागत को संतुलित करना होगा जो अन्यथा कार्यक्रम के नतीजे को चलाने/प्रभावित करने की आवश्यकता नहीं होगी – dty

+0

@dty: हाँ, बिल्कुल। ध्यान दें "अगर सावधानीपूर्वक इस्तेमाल किया जाता है।" :-) –

+5

जब मैं गुवा के 'com.google.common.math' लिख रहा था, जब दूसरी हालत विशेष रूप से तेज़ थी, तो मेरे मानक ने कभी-कभी संकेत दिया कि गैर-शॉर्ट-सर्किटिंग ऑपरेटर इस कारण से शॉर्ट सर्किटिंग ऑपरेटरों की तुलना में तेज़ थे। (उस ने कहा, अगर मैं बहुत ठोस, विस्तृत मानक नहीं था तो मैं उस परिवर्तन को नहीं कर सका होता।) –

0

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

उदाहरण के लिए, मान लीजिए कि आप है:

if(methodA() & methodB()){ 
    //some code 
} 

और methodB() विधि कुछ आवश्यक कोड चल रहा है के भीतर। यदि वह शॉर्ट सर्किट कोड था (& &) और methodA() गलत था, methodB() कभी नहीं चलाएगा।

यह उन प्रयोगों में से एक है जिन्हें मैं कम से कम सोच सकता हूं।

2

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

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

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