क्या किसी साइड इफेक्ट के लिए सशर्त ठीक है? [बन्द है]


10

मैं इंटरमीडिएट डेटा स्ट्रक्चर्स कोर्स को सीएस एमएस प्रोग्राम में प्रवेश के लिए एक शर्त के रूप में ले रहा हूं, अमेरिका में हर किसी ने सुना है। कोड की एक पंक्ति जो कक्षा में लिखी गई थी, उसने मेरी आंख को पकड़ लिया:

if (a > 33 | b++ < 54) {...}

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

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

मैं ऐसी दुनिया की कल्पना नहीं कर सकता, जिसमें कोड की यह रेखा कभी स्वीकार्य हो, अकेले वांछनीय हो। क्या मै गलत हु? यह ठीक है? अधिक सामान्य मामले के बारे में क्या: दुष्प्रभाव के साथ सशर्त? क्या वे कभी ठीक हैं?


7
उस लाइन को ऑर्बिट से nuked किया जाना चाहिए। अच्छे उपाय के लिए दो बार।
ब्लरफुल

8
एक नट: एक एकल पाइप (ऊर्ध्वाधर पट्टी) एक तार्किक "या" के बजाय एक बिटवाइज़-या अधिकांश भाषाओं में है। यदि बाएं हाथ की ओर सत्य है तो यह शॉर्ट-सर्किट नहीं करता है। चूंकि इस सशर्त का दाहिनी ओर साइड इफेक्ट है, इसलिए यह परिणाम में विशेष रूप से बड़ा बदलाव करता है।
जोनाथन यूनिस

2
विभिन्न भाषाओं में उपयोग किए जाने वाले मुहावरे हैं जो इस श्रेणी में आते हैं, लेकिन क्योंकि वे "अच्छी तरह से ज्ञात हैं" या "सामान्य" समस्याएं पैदा नहीं करते हैं। प्रश्न में लाइन मुहावरेदार उपयोग की श्रेणी में नहीं आती है इसलिए मैं इससे बचूँगा।
Jaydee

2
@JonathanEunice, हाँ, कुछ लोग शॉर्ट-सर्किट मूल्यांकन के बारे में भ्रमित थे। मेरी ओर से टाइपो नहीं।
रियांज

5
अच्छा पक्ष देखो। अब आप एक और कंपनी जानते हैं जहाँ आप साक्षात्कार नहीं करना चाहते हैं।
जॉन आर। स्ट्रॉहम

जवाबों:


23

नहीं है एक अर्द्ध सशर्त पक्ष प्रभाव मुझे लगता है कि ठीक है के बारे में सोच सकते हैं:while(iter.MoveNext())

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

मैं ऐसे परिदृश्य के बारे में सोच भी नहीं सकता जहाँ वह विशेष रेखा स्वीकार्य होगी, लेकिन मैं ऐसे परिदृश्य के बारे में भी नहीं सोच सकता जहाँ यह विशेष पंक्ति उपयोगी होगी , इसलिए जिस संदर्भ में यह है, उसकी कल्पना करना कठिन है।


यह कक्षा के दौरान एक विधि में सिर्फ एक फेंक रेखा थी। यह उपयोगी कुछ भी करने का इरादा नहीं था।
रियांज

4
समान रूप से, while(v = *p++)एक शून्य-समाप्त सरणी (जैसे सी स्ट्रिंग) के माध्यम से सी / सी ++ शैली स्कैन बहुत आम हैं और व्यापक रूप से स्वीकार किए जाते हैं।
फिल मिलर

3
मैंने अक्सर फॉर्म के लूप while(c = input.read() != '\n')कंडीशंस को यथोचित मुहावरेदार माना है ।

1
कुछ सामान्य स्वीकार्य मुहावरे हो सकते हैं, लेकिन स्पष्ट रूप से "स्पष्टता की कीमत पर चतुर होना" NEVER शिविर में आता है।
जूलिया हेवर्ड

मैं पूरी तरह से iter.MoveNext () के बारे में भूल गया था। एक साइड इफेक्ट वाले सशर्त के लिए एक पूरी तरह से उचित मामला। धन्यवाद!
रियांज

8

मेरी दुनिया में, मेमोरी से एक रीड को साइड इफेक्ट माना जा सकता है (जैसे मेमोरी मैप्ड IO)।

अब, निम्नलिखित पर विचार करें:

    while( ( *memory_mapped_device_status_register & READY_FLAG) == 0) {
       // Wait
    }

और इसकी तुलना करें:

    status = *memory_mapped_device_status_register;
    while( ( status & READY_FLAG) == 0) {
        // Wait
        status = *memory_mapped_device_status_register;
    }

क्या साइड इफेक्ट (पढ़ने) से बचने की स्थिति में पठनीयता में मदद मिली; या यह सिर्फ डुप्लिकेट कोड और अव्यवस्था जोड़ दिया?

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


3

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

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

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

जितनी अधिक ये मितव्ययी परिस्थितियाँ लुप्त होंगी, उतना ही अजनबी निर्माण होगा। यदि एक विशेष लूप प्रकार (जैसे if((c = getc()) == 'x') { quit(); }कि भाषा समुदाय द्वारा अच्छी तरह से जाना जाता है और स्वीकार किया जाता है, तो यह एक समस्या से बहुत कम है जब आप इसे सहज रूप से आविष्कार करते हैं, आदि। आपकी उदाहरण पंक्ति उस मानक से कम हो जाती है, लेकिन मैं बहुत कल्पना कर सकता हूं, बहुत कुछ अधिक भयानक जो मैं भी टाइप नहीं करूंगा, वे बहुत भयानक हैं।


2

हालांकि, वास्तव में बदबूदार कोड है, इसमें समतुल्य होने का फायदा है (और शायद तेज़ हो तो आपके पास समकक्ष की तुलना में अच्छा अनुकूलन करने वाला कंपाइलर नहीं है) if (a > 33 | b < 54) {b++; ...} else b++;

लेकिन निश्चित रूप से इसे निम्नलिखित के लिए अनुकूलित करना संभव है (लेकिन बाहर देखो! यह एक अति व्यवहार के मामले में अलग व्यवहार है):) b++; if (a > 33 | b < 53) {...}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.