शॉर्ट-सर्किट मूल्यांकन खराब कब है?


12

थोड़ा और स्पष्ट होने के लिए, मैं बताता हूँ कि मैंने विभिन्न भाषाओं के साथ बहुत समय बिताया है। लेकिन अब तक यह या तो यह हर समय इसका उपयोग करेगा या यह इसका बिल्कुल समर्थन नहीं करता है।

अब काम मुझे उन परियोजनाओं पर शुरू करना है जिनके लिए VB.net की आवश्यकता है और मुझे लगता है कि यह AND और ANDALSO दोनों के संदर्भ में इसे प्रदान करता है । पहले वाला शॉर्ट सर्किट नहीं करता है, और दूसरा वाला करता है।

तो यह मुझे आश्चर्य होता है कि क्यों? जैसा कि इस तरह से सेटअप होने का अर्थ है कि यह बहुत बार आएगा कि कोई मोड स्विच करना चाहेगा। लेकिन मैं ऐसी किसी भी स्थिति के बारे में नहीं सोच सकता जहाँ शॉर्ट सर्किट का उपयोग करना बुरी बात होगी ।

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

हालांकि मैं उम्मीद कर रहा हूं कि कम से कम एक आधिकारिक उत्तर हो, क्योंकि दोनों विकल्प बेहतर होने के बाद हमेशा शॉर्ट सर्किट कर रहे हैं , जब यह उपलब्ध हो।



1
इन्हें भी देखें: softwareengineering.stackexchange.com/questions/246549/…
Doc Brown

जवाबों:


5

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

if not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

अन्य मामलों में, आप शेष शर्तों में से किसी का भी मूल्यांकन नहीं करना चाहते हैं यदि पहले का मूल्यांकन गलत है।

if IsAirborne() and not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

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

VB का ANDALSO कुरकुरा है और यह अभ्यास को अधिक स्वीकार्य बनाने का प्रयास प्रतीत होता है।

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


4
जबकि तथ्यात्मक रूप से सही है, यह एक महान डिजाइन नहीं है।
रॉबर्ट हार्वे

2
@RobertHarvey, मैं एक नियंत्रण प्रणाली नहीं लिख सकता है जिसके दुष्प्रभाव नहीं हैं और यदि मैं परिणामों पर प्रतिक्रिया नहीं करता हूं तो मैं इस प्रणाली को सही ढंग से नियंत्रित नहीं कर सकता। दूसरे शब्दों में, इसे खत्म हो;)।
jwdonahue

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

3
@jwdonahue भ्रम के जोखिम कम होने पर "बड़े शब्दों" का उपयोग करना ठीक है। इस तरह के कोड के एक ब्लॉक के भ्रम और लापता विशेष बारीकियों का जोखिम बहुत अधिक है और तर्क के लिए विनाशकारी हो सकता है। रीडिंग डेवलपर को बहुत कठिन लगता है।
jpmc26

5
"तार्किक अभिव्यक्ति के कुछ शब्दों के साइड इफेक्ट्स हो सकते हैं" - जबकि यह प्रारंभिक कथन सही है, मुझे लगता है कि यह उत्तर यह इंगित करने में विफल रहता है कि साइड-इफेक्ट्स पर भरोसा करना बुरा है । सुदूर मूल्यांकन को रोकने के लिए शॉर्ट-सर्किट मूल्यांकन पर भरोसा करने की तुलना में, वास्तव में बदतर। यह उत्तर जो सुझाव देता है वह खराब रूप हो सकता है।
aroth

20

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

शॉर्ट-सर्किट मूल्यांकन कब बुरा है?

बस है: जब यह पश्चगामी संगतता का उल्लंघन करता है

ठीक है, अब आप कह सकते हैं कि VB.NET पुराने VB6 या VBA के लिए बहुत पीछे की ओर नहीं है, हालांकि कम से कम भाषा के कुछ हिस्से हैं। पुराने और OR शब्दार्थ (अल्प-परिवृत्त के बिना) रखने के Microsoft के निर्णय ने VB.NET में पुराने VB कार्यक्रमों को पोर्ट करते समय त्रुटियों की एक बड़ी श्रेणी उत्पन्न होने की संभावना कम कर दी।

दूसरी ओर, VB.NET भाषा डिजाइनरों ने संभवतः शॉर्ट-सर्कुलेटिंग के बारे में आपकी राय साझा की है जो एक अच्छी बात है। जब मुझे सही ढंग से याद है, तो पहले VB.NET के पूर्व-रिलीज़ संस्करणों ने लघु-संचलन के साथ AND या ऑपरेटर प्रदान किए थे, लेकिन डेवलपर की प्रतिक्रिया इतनी खराब होनी चाहिए कि MS VB.NET 1.0 के प्रकट होने से पहले इस निर्णय को वापस ले ले। इसलिए डिजाइनरों ने इसे नए कीवर्ड के रूप में लागू करने ANDALSOऔर ORELSEपीछे की संगतता और उपयोगिता के बीच एक व्यापार-बंद के रूप में लागू करने का फैसला किया ।

IMHO यह एक अच्छा निर्णय था। मुझे पिछले दशक में कई पुराने कार्यक्रमों को पोर्ट करना पड़ा, और AND और / या OR (दंडात्मक उद्देश्य) सहित हर तर्क अभिव्यक्ति के लिए एक भारी प्रभाव विश्लेषण करने के लिए नहीं होने से उस कार्य को बहुत आसान और अधिक आर्थिक बना दिया। दूसरी ओर, जब भी मुझे VB.NET में एक नई तार्किक अभिव्यक्ति लिखनी है, तो ऑपरेटरों के लिए मेरी डिफ़ॉल्ट पसंद शॉर्ट-सर्किट फॉर्म हैं, यही वह है जिसका उपयोग मैं C, C ++, C # आदि से कर रहा हूं, और यह अनुमति देता है मुझे और अधिक संक्षिप्त रूप में कई मुहावरे लिखने के लिए (भले ही ANDALSO को टाइप करने के लिए 4 वर्णों की आवश्यकता हो)।

यदि आप आश्वस्त नहीं हैं, तो मैं जोएल स्पोल्स्की के मार्टियन हेडसेट्स के बारे में शानदार लेख पढ़ने की सलाह देता हूं , जिसके बारे में है कि सॉफ्टवेयर डेवलपमेंट में शुरुआती डिजाइन के फैसले आसानी से रद्द नहीं किए जा सकते क्योंकि घटक या भाषा या एपीआई हिस्सेदारी में एक निश्चित आकार के उपयोगकर्ता आधार तक पहुंच गई है। ।


ठीक है, यह एक शेख़ी के रूप में अर्हता प्राप्त करता है और मार्टियन हेडसेट के लिए लिंक बिल्कुल संबंधित नहीं लगता है।
jwdonahue

6
@jwdonahue: मुझे नहीं पता कि आपको क्यों लगता है कि यह एक शेख़ी है, जो बिल्कुल विपरीत है। और मार्टिअन हेडसेट्स के बारे में लेख इस बारे में है कि कई दशकों पहले किए गए सॉफ़्टवेयर डेवलपमेंट में कुछ डिज़ाइन निर्णयों को घटक या भाषा या एपीआई के एक निश्चित आकार के उपयोगकर्ता आधार तक पहुंचने के बाद आसानी से रद्द नहीं किया जा सकता है। क्या सादृश्य वास्तव में इतना कठिन नहीं है? VB6 अतीत में बहुत लोकप्रिय था , और मुझे यकीन है कि अभी भी दुनिया की सौ हजारों कंपनियों के मिशन महत्वपूर्ण ऐप्स VB6 या VBA में चल रहे हैं।
डॉक ब्राउन

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

3
@ सुपरकार्ट: यह पहले से ही मौजूद ट्रिलियन्स ऑफ नट्स (या वीबी 6 कोड) की मौजूदा और उपयोग में है, और अब बोल्ट (या इस मामले में वीबी कंपाइलर) को एक नई पीढ़ी द्वारा बदल दिया जाएगा। यदि मौजूदा पागल केवल गैर-मीट्रिक बोल्टों के लिए फिट होते हैं, तो यह केवल नए बोल्ट मीट्रिक-सिस्टम बनाने के लिए आर्थिक नहीं है।
डॉक्टर ब्राउन

tl; dr: VB, BASIC की एक बोली है, जो 1964 से चली आ रही एक भाषा है, और BASIC में Andऑपरेशन में शॉर्ट सर्किट नहीं होता है, न तो SQL (1974) में, न ही FORTRAN (1956) में, न ही पास्कल (1970) में।
बेन

3

शॉर्ट-सर्कट मूल्यांकन कब बुरा है?

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


1

कैविएट : यह लगभग सभी मामलों में थोड़ा गूढ़ है, डेवलपर्स को इसके बारे में चिंता नहीं करनी चाहिए। लेकिन ... सशर्त मूल्यांकन के कारण एक प्रदर्शन हिट हो सकता है क्योंकि यह निष्पादन में शाखा बनाता है। एक गैर-शॉर्ट सर्किट ऑपरेशन शाखा नहीं करता है और अधिक अनुमानित है।

यह शायद ही कभी मायने रखता है कि लागत आमतौर पर छोटी है और आमतौर पर दूसरी (या तीसरी, आदि) स्थिति का मूल्यांकन करने की लागत से आगे निकल जाती है। यह केवल कभी-कभी महंगी महंगी दिनचर्या में मायने रखता है जब उच्च प्रदर्शन की आवश्यकता होती है और यह तब भी मायने नहीं रखता है।


मुझे लगता है कि आप केवल एक तार्किक कथन को अब तक अनुकूलित कर सकते हैं, अंततः आपको शाखाएं लेनी होंगी।
jwdonahue

@jwdonahue मुझे आपकी बात नहीं आती। माफ़ करना।
जिम्मीजम्स

हम यहां कॉम्बिनेटरियल लॉजिक की बात कर रहे हैं। शॉर्ट सर्किट मूल्यांकन या नहीं, आपके पास एक या एक से अधिक शब्द हैं जिनका मूल्यांकन पहले के शब्द के आधार पर किया जाना चाहिए। इसलिए, ब्रांचिंग शामिल है।
jwdonahue

1
@jwdonahue बेशक लेकिन हर शॉर्ट-सर्किट एक अतिरिक्त शाखा है। कुछ परिदृश्यों में दो अभिव्यक्तियों को निष्पादित करना (उदाहरण के लिए) दूसरे को निष्पादित करने से पहले पहले के परिणाम की जांच करने से तेज है, भले ही यह अक्सर ऐसा हो कि दूसरा अप्रासंगिक है। फिर, यह शायद ही कभी महत्वपूर्ण है। इसके लिए मेरे द्वारा किया गया मामला मैट्रिक्स गुणन जैसी चीजों के लिए था जहां आपके पास बहुत सारे सरल मूल्यांकन हैं।
जिम्मीजम्स

1
मैंने आपके उत्तर को क्रेडिट के साथ अपडेट किया।
jwdonahue

0

पास्कल ने परिभाषित नहीं किया कि क्या और या शॉर्ट सर्किट मूल्यांकन का उपयोग करें या नहीं, आपको दोनों दुनिया का सबसे बुरा दे।

C और C ++ में बिटवाइज़ ऑपरेशंस और | जो व्यवहार में आपको गैर-शॉर्ट सर्किट ऑपरेशन देता है। और कंपाइलर किसी भी तरह से मूल्यांकन करने के लिए स्वतंत्र हैं अगर उन्हें कोई फर्क नहीं पड़ता है।


@ डुप्लिकेटर: जैसा कि उल्लेख किया गया है, पास्कल परिभाषित नहीं था कि क्या और / या शॉर्ट-सर्किट मूल्यांकन का उपयोग करें। इसका मतलब है "न जाने"।
सुपरकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.