मैंने साइड इफेक्ट की अवधारणा को स्पष्ट रूप से नहीं समझा है।
- प्रोग्रामिंग में साइड इफेक्ट क्या है?
- क्या यह प्रोग्रामिंग भाषा पर निर्भर है?
- क्या बाहरी और आंतरिक साइड इफेक्ट जैसी कोई चीज है?
कृपया साइड इफेक्ट्स पैदा करने वाले कारणों का कुछ उदाहरण दें।
मैंने साइड इफेक्ट की अवधारणा को स्पष्ट रूप से नहीं समझा है।
कृपया साइड इफेक्ट्स पैदा करने वाले कारणों का कुछ उदाहरण दें।
जवाबों:
एक साइड इफेक्ट बस कुछ प्रकार के राज्य के संशोधन को संदर्भित करता है - उदाहरण के लिए:
कुछ लोग जो कहते दिख रहे हैं उसके विपरीत :
साइड इफेक्ट को छिपाना या अप्रत्याशित नहीं होना है (यह हो सकता है, लेकिन इसका परिभाषा से कोई लेना-देना नहीं है क्योंकि यह कंप्यूटर साइंस पर लागू होता है);
एक साइड इफ़ेक्ट का आलस्य से कोई लेना देना नहीं है। एक इम्पोटेंट फंक्शन के साइड इफेक्ट्स हो सकते हैं और एक नॉन-इम्पोटेंट फंक्शन के कोई साइड इफेक्ट्स नहीं हो सकते हैं (जैसे कि मौजूदा सिस्टम डेट और टाइम प्राप्त करना)।
यह वास्तव में बहुत सरल है। साइड इफेक्ट = कहीं कुछ बदलना।
PS जैसा कि टिप्पणी करने वाले बेंजोल बताते हैं, कई लोग एक शुद्ध फ़ंक्शन की परिभाषा के साथ एक साइड इफेक्ट की परिभाषा को स्वीकार कर सकते हैं , जो कि एक फ़ंक्शन है जो (ए) बेरोजगार है और (बी) का कोई साइड-इफेक्ट नहीं है। सामान्य कंप्यूटर विज्ञान में दूसरे का अर्थ नहीं है, लेकिन कार्यात्मक प्रोग्रामिंग भाषाएं आमतौर पर दोनों बाधाओं को लागू करती हैं।
++a
। में। असाइनमेंट की तरह नहीं दिखता है। b = ++a;
इसके दो दुष्प्रभाव हैं। स्पष्ट एक और क्रिप्टो-असाइनमेंट a
। यह उस तरह का है जो एक पक्ष-प्रभाव है जो (कुछ को) वांछनीय है। लेकिन इसे सूक्ष्म नहीं बनाने के लिए मेरे पूरे करियर के लिए साइड-इफेक्ट कहा गया है।
कोई भी ऑपरेशन जो कंप्यूटर की स्थिति को संशोधित करता है या जो बाहरी दुनिया के साथ बातचीत करता है, को साइड इफेक्ट कहा जाता है। साइड इफेक्ट पर विकिपीडिया देखें ।
उदाहरण के लिए, इस फ़ंक्शन का कोई दुष्प्रभाव नहीं है। इसका परिणाम केवल इसके इनपुट तर्कों पर निर्भर करता है, और कार्यक्रम की स्थिति या इसके वातावरण के बारे में कुछ भी नहीं कहा जाता है जब इसे कहा जाता है:
int square(int x) { return x * x; }
इसके विपरीत, इन कार्यों को कॉल करने से आपको उस आदेश के आधार पर अलग-अलग परिणाम मिलेंगे, जिसमें आप उन्हें कॉल करते हैं, क्योंकि वे कंप्यूटर की स्थिति के बारे में कुछ बदलते हैं:
int n = 0;
int next_n() { return n++; }
void set_n(int newN) { n = newN; }
इस फ़ंक्शन का आउटपुट पर डेटा लिखने का दुष्प्रभाव है। आप फ़ंक्शन को कॉल नहीं करते हैं क्योंकि आप इसकी वापसी मूल्य चाहते हैं; आप इसे कहते हैं क्योंकि आप "बाहरी दुनिया" पर इसका प्रभाव चाहते हैं:
int Write(const char* s) { return printf("Output: %s\n", s); }
Write
उदाहरण दर्शाता है कि साइड इफेक्ट्स का मतलब यह नहीं है कि फ़ंक्शन कभी भी अपने आउटपुट को अपने इनपुट के संबंध में बदलता है, या यहां तक कि इसका आउटपुट इनपुट पर निर्भर करता है।
square(x)
मॉड्यूल का कारण हो सकता है जहां फ़ंक्शन को डिस्क से लोड होने के लिए परिभाषित किया गया है। क्या इसे साइड-इफेक्ट माना जाना चाहिए? आखिरकार, यह मेन्स (पहला) कॉल अप्रत्याशित रूप से लंबा हो जाता है, कि रैम का उपयोग बढ़ जाता है, आदि
square(x)
क्योंकि आप चाहते हैं कि बाहरी कंप्यूटर स्थिति बदल जाए, तो आप इस पर विचार कर सकते हैं।
मुझे लगता है कि मौजूदा उत्तर काफी अच्छे हैं। मैं कुछ पहलुओं पर विस्तार से बताना चाहूंगा कि आईएमओ को पर्याप्त बल नहीं दिया गया है।
गणित में एक फ़ंक्शन मानों के टपल से एक मानचित्रण मात्र है। इसलिए, एक फ़ंक्शन f
और एक मान दिया जाता है x
, f(x)
हमेशा एक ही परिणाम होगा y
। आप अच्छी तरह से जगह ले सकती f(x)
साथ y
एक अभिव्यक्ति में हर जगह और कुछ भी नहीं बदल जाएगा।
कई प्रोग्रामिंग भाषा में एक फ़ंक्शन (या प्रक्रिया) क्या कहा जाता है एक निर्माण (कोड का टुकड़ा) जिसे निष्पादित किया जा सकता है:
तो प्रभाव राज्य से संबंधित हो सकता है लेकिन अन्य पहलुओं पर भी जैसे मिसाइल दागना या कुछ सेकंड के लिए रोकना।
शब्द के साइड-इफेक्ट नकारात्मक लग सकते हैं, लेकिन आम तौर पर किसी फ़ंक्शन को कॉल करने का प्रभाव फ़ंक्शन का एकमात्र उद्देश्य होता है। मुझे लगता है कि, चूंकि शब्द फ़ंक्शन मूल रूप से गणित में उपयोग किया गया था, इसलिए मूल्य की गणना को किसी फ़ंक्शन का प्राथमिक प्रभाव माना जाता है जबकि किसी अन्य प्रभाव को साइड-इफेक्ट माना जाता है । कुछ प्रोग्रामिंग भाषाएं गणितीय अर्थ में कार्यों के साथ भ्रम से बचने के लिए शब्द प्रक्रिया का उपयोग करती हैं।
ध्यान दें कि
sleep()
कि पायथन में, केवल उनके (साइड) प्रभावों के लिए उपयोगी हैं। इन्हें अक्सर ऐसे फ़ंक्शन के रूप में तैयार किया जाता है, जो एक विशेष मान None
, unit
या ()
या ... को लौटाते हैं , जो केवल इंगित करता है कि गणना सही ढंग से समाप्त हो गई है।एक साइड-इफेक्ट तब होता है जब किसी ऑपरेशन का वैरिएबल / ऑब्जेक्ट पर एक प्रभाव होता है जो इच्छित उपयोग के बाहर होता है।
यह तब हो सकता है जब आप किसी जटिल फ़ंक्शन को कॉल करते हैं जिसमें कुछ वैश्विक चर को बदलने का साइड-इफेक्ट होता है, भले ही वह कारण यह नहीं था कि आपने इसे बुलाया था (शायद आपने इसे डेटाबेस से कुछ निकालने के लिए कहा था)।
मैं मानता हूं कि मुझे एक साधारण उदाहरण के साथ आने में परेशानी हो रही है जो पूरी तरह से विरोधाभासी नहीं है, और जिन सामानों पर मैंने काम किया है उनके उदाहरण यहां पोस्ट करने के लिए बहुत लंबे समय से हैं (और जब से यह काम से संबंधित है, मुझे शायद वैसे भी नहीं होना चाहिए )।
एक उदाहरण जो मैंने देखा है (थोड़ी देर पहले) एक फ़ंक्शन था जिसने एक डेटाबेस कनेक्शन खोला था यदि कनेक्शन एक बंद राज्य में था। समस्या यह थी कि यह फ़ंक्शन के अंत में कनेक्शन को बंद करने वाला था, लेकिन डेवलपर उस कोड को जोड़ना भूल गया। तो यहाँ, एक अनपेक्षित साइड इफेक्ट था: एक प्रक्रिया को कॉल करना केवल एक क्वेरी करना था और साइड इफेक्ट यह था कि कनेक्शन खुला रहा और यदि फ़ंक्शन को दो बार पंक्ति में बुलाया गया था, तो एक त्रुटि यह कहते हुए उठाई जाएगी कि कनेक्शन था पहले से ही खुला।
ठीक है, इसलिए अब सभी के उदाहरण देने के बाद, मुझे लगता है कि मैं भी;)
/*code is PL/SQL-styled pseudo-code because that's what's on my mind right now*/
g_some_global int := 0; --define a globally accessible variable somewhere.
function do_task_x(in_a in number) is
begin
b := calculate_magic(in_a);
if b mod 2 == 0 then
g_some_global := g_some_global + b;
end if;
return (b * 2.3);
end;
फ़ंक्शन do_task_x
में कुछ गणनाओं के परिणाम को वापस करने का एक प्राथमिक प्रभाव होता है, और संभवतः एक वैश्विक चर को संशोधित करने का एक पक्ष प्रभाव होता है।
बेशक, जो प्राथमिक है और जो साइड इफेक्ट है वह व्याख्या के लिए खुला हो सकता है और वास्तविक उपयोग पर निर्भर हो सकता है। अगर मैं इस फ़ंक्शन को वैश्विक संशोधित करने के उद्देश्य से कहता हूं और मैं लौटाए गए मूल्य को छोड़ देता हूं तो मैं कहूंगा कि वैश्विक संशोधन प्राथमिक प्रभाव है।
कंप्यूटर विज्ञान में, एक फ़ंक्शन या अभिव्यक्ति को एक साइड इफेक्ट कहा जाता है यदि यह कुछ राज्य को संशोधित करता है या कॉलिंग फ़ंक्शन या बाहरी दुनिया के साथ एक नमूदार बातचीत करता है।
एक फ़ंक्शन, गणितीय अर्थ में, इनपुट से आउटपुट तक मानचित्रण है। किसी फ़ंक्शन को कॉल करने का इच्छित प्रभाव इसके इनपुट के आउटपुट के लिए मैप करने के लिए होता है। यदि फ़ंक्शन कुछ और करता है, तो इससे कोई फर्क नहीं पड़ता है, लेकिन अगर उसका कोई व्यवहार है जो आउटपुट के लिए मैपिंग नहीं कर रहा है, तो उस व्यवहार को साइड इफेक्ट के रूप में जाना जाता है।
अधिक सामान्य शब्दों में, एक साइड इफेक्ट कोई भी प्रभाव है जो निर्माण के डिजाइनर का इच्छित प्रभाव नहीं है।
एक प्रभाव कुछ भी है जो एक अभिनेता को प्रभावित करता है। अगर मैं एक फ़ंक्शन को कॉल करता हूं जो मेरी प्रेमिका को एक ब्रेकअप टेक्स्ट संदेश भेजता है, जो अभिनेताओं, मेरे, उसके, सेल फोन कंपनी के नेटवर्क, आदि का एक गुच्छा प्रभावित करता है, तो एक साइड-इफेक्ट फ्री फ़ंक्शन को कॉल करने का एकमात्र उद्देश्य फ़ंक्शन के लिए है। मुझे मेरे इनपुट से मैपिंग वापस करने के लिए। के लिए:
public void SendBreakupTextMessage() {
Messaging.send("I'm breaking up with you!")
}
यदि यह एक फ़ंक्शन होने का इरादा है, तो केवल एक चीज जो इसे करना चाहिए वह है शून्य। यदि यह साइड-इफ़ेक्ट फ्री था, तो यह वास्तव में टेक्स्ट मैसेज नहीं भेजना चाहिए।
अधिकांश प्रोग्रामिंग भाषा में, गणितीय फ़ंक्शन के लिए कोई निर्माण नहीं है। किसी भी निर्माण का उपयोग इस तरह से करने का इरादा नहीं है। इसीलिए अधिकांश भाषाएँ कहती हैं कि आपके पास तरीके या प्रक्रियाएँ हैं। डिजाइन द्वारा, उन लोगों को कई और प्रभाव करने में सक्षम होने का इरादा है। सामान्य प्रोग्रामिंग पार्लेंस में, कोई भी वास्तव में इस बात की मंशा के बारे में परवाह नहीं करता है कि एक विधि या एक प्रक्रिया क्या थी, इसलिए जब कोई कहता है कि इस फ़ंक्शन का साइड-इफेक्ट है, तो उनका प्रभावी रूप से मतलब है, यह निर्माण गणितीय फ़ंक्शन की तरह व्यवहार नहीं करता है। और जब कोई कहता है कि यह फ़ंक्शन साइड-इफ़ेक्ट फ्री है, तो उनका मतलब है, यह निर्माण एक गणितीय फ़ंक्शन की तरह प्रभावी ढंग से व्यवहार करता है।
एक शुद्ध कार्य हमेशा साइड इफेक्ट फ्री होता है, परिभाषा के अनुसार। एक शुद्ध कार्य, कहने का एक तरीका है, यह फ़ंक्शन, भले ही यह एक ऐसे निर्माण का उपयोग कर रहा है जो अधिक प्रभाव की अनुमति देता है, केवल एक गणितीय फ़ंक्शन के बराबर प्रभाव होता है।
मैं किसी को भी चुनौती देता हूं कि मुझे बताएं कि साइड-इफेक्ट फ्री फ़ंक्शन शुद्ध नहीं होगा। जब तक कि शुद्ध और साइड इफेक्ट मुक्त शब्द का उपयोग करते हुए वाक्य के संदर्भ का प्राथमिक इच्छित प्रभाव किसी फ़ंक्शन के गणितीय इच्छित प्रभाव नहीं है, तब तक वे हमेशा समान होते हैं।
जैसे, कभी-कभी, हालांकि अधिक शायद ही कभी, और मेरा मानना है कि यह स्वीकार किए गए उत्तर में लोगों की (और यह सबसे आम धारणा के रूप में) गलतफहमी का अभाव है, लेकिन कभी-कभी यह माना जाता है कि प्रोग्रामिंग फ़ंक्शन का इच्छित प्रभाव आउटपुट के लिए इनपुट पर जाएं, जहां इनपुट फ़ंक्शन के स्पष्ट मापदंडों के लिए बाध्य नहीं है, लेकिन आउटपुट स्पष्ट रिटर्न मूल्य के लिए विवश है। यदि आप मान लेते हैं कि यह इच्छित प्रभाव है, तो फ़ाइल को पढ़ने और फ़ाइल में जो कुछ भी है, उसके आधार पर एक अलग परिणाम देने वाला एक फ़ंक्शन अभी भी साइड-इफ़ेक्ट फ्री है, क्योंकि आपने इनपुट को अपने इच्छित प्रभाव में अन्य स्थानों से आने की अनुमति दी थी।
तो, यह सब क्यों महत्वपूर्ण है?
यह सब नियंत्रण और इसे रखने के बारे में है। यदि आप किसी फ़ंक्शन को कॉल करते हैं, और यह कुछ और करता है तो एक मान लौटाएं, इसके व्यवहार के बारे में तर्क करना कठिन है। आपको वास्तविक कोड के लिए फ़ंक्शन के अंदर देखने की आवश्यकता होगी ताकि यह अनुमान लगाया जा सके कि यह क्या कर रहा है और इसकी शुद्धता का दावा करता है। आदर्श स्थिति, यह है कि यह जानना बहुत स्पष्ट और आसान है कि फ़ंक्शन क्या इनपुट का उपयोग कर रहा है और यह कुछ और नहीं कर रहा है तो इसके लिए एक आउटपुट लौटाता है। आप इसे थोड़ा आराम कर सकते हैं, और कह सकते हैं कि वास्तव में यह जानते हुए कि यह किस इनपुट का उपयोग कर रहा है, यह उतना उपयोगी नहीं है जितना कि यह कुछ और नहीं कर रहा है, जिसके बारे में आपको पता नहीं हो सकता है, फिर एक मूल्य वापस करना, इसलिए हो सकता है कि आप केवल लागू करने से संतुष्ट हों यह कुछ और नहीं करता है तो मैप इनपुट, कोई फर्क नहीं पड़ता कि यह कहाँ से प्राप्त होता है, आउटपुट के लिए।
लगभग सभी मामलों में, एक कार्यक्रम का प्रभाव अन्य चीजों को प्रभावित करना होता है और फिर बाहर आने वाली चीजों को मैप करना। साइड-इफ़ेक्ट को नियंत्रित करने का विचार यह है कि आप एक तरह से कोड को व्यवस्थित कर सकते हैं जो समझना आसान है और इसके बारे में तर्क करना है। यदि आप सभी साइड इफेक्ट को एक साथ रखते हैं, तो एक जगह पर जो बहुत स्पष्ट और केंद्रीय है, यह जानना आसान है कि कहां देखना है और भरोसा करना है कि यह सब हो रहा है, अब और नहीं। यदि आपके पास इनपुट बहुत स्पष्ट है, तो यह विभिन्न इनपुट के लिए व्यवहार का परीक्षण करने में मदद करता है, और इसका उपयोग करना आसान है, क्योंकि आपको बहुत से अलग-अलग स्थानों में इनपुट को बदलने की आवश्यकता नहीं है, कुछ जो स्पष्ट नहीं हो सकते हैं, बस आप क्या चाहते हैं पाने के लिए।
क्योंकि किसी प्रोग्राम के व्यवहार को समझने, तर्क करने और नियंत्रित करने के लिए सबसे अधिक मददगार यह है कि सभी इनपुट को एक साथ और स्पष्ट रूप से समूहीकृत किया जाए, साथ ही सभी साइड-इफ़ेक्ट को एक साथ और स्पष्ट रूप से वर्गीकृत किया जाए, यह आम तौर पर लोग जब वे कहते हैं, के बारे में बात करते हैं। पक्ष-प्रभाव, शुद्ध, आदि।
क्योंकि सबसे अधिक सहायक साइड-इफेक्ट्स और उनके खोजकर्ता का समूहन है, कभी-कभी लोग केवल इसका मतलब ही निकालेंगे और यह कहकर भेद करेंगे कि यह शुद्ध नहीं है, लेकिन फिर भी "साइड-इफेक्ट" मुक्त है। लेकिन साइड-इफेक्ट ग्रहण किए गए "प्राथमिक प्रभाव" के सापेक्ष है, इसलिए यह एक प्रासंगिक शब्द है। मुझे लगता है कि यह कम अक्सर उपयोग किया जाता है, हालांकि आश्चर्यजनक रूप से इस धागे में बहुत कुछ के बारे में बात की जाती है।
अंत में, idempotent का अर्थ है इस फ़ंक्शन को एक ही इनपुट के साथ कई बार कॉल करना (कोई फर्क नहीं पड़ता कि वे कहाँ से आते हैं) हमेशा एक ही प्रभाव (साइड इफेक्ट या नहीं) में परिणाम होगा।
प्रोग्रामिंग में एक साइड इफेक्ट तब होता है जब एक प्रक्रिया अपने दायरे के बाहर से परिवर्तनशील परिवर्तन करती है। साइड इफेक्ट भाषा पर निर्भर नहीं हैं। भाषाओं के कुछ वर्ग हैं जो साइड इफेक्ट्स (शुद्ध कार्यात्मक भाषा) को खत्म करने का लक्ष्य रखते हैं, लेकिन मुझे यकीन नहीं है कि अगर कोई साइड इफेक्ट की आवश्यकता है, लेकिन मैं गलत हो सकता हूं।
जहाँ तक मुझे पता है, कोई आंतरिक और बाहरी दुष्प्रभाव नहीं हैं।
ये रहा एक सरल उदाहरण:
int _totalWrites;
void Write(string message)
{
// Invoking this function has the side effect of
// incrementing the value of _totalWrites.
_totalWrites++;
Debug.Write(message);
}
साइड इफेक्ट की परिभाषा प्रोग्रामिंग के लिए विशिष्ट नहीं है, इसलिए बस अपने मेड के साइड इफेक्ट्स या बहुत अधिक भोजन खाने की कल्पना करें।
x++
चर x
को संशोधित करता है आमतौर पर एक साइड इफेक्ट माना जाता है। अभिव्यक्ति का वह मूल्य पूर्व वेतन वृद्धि मूल्य है x
; यह अभिव्यक्ति का गैर-पक्ष प्रभाव हिस्सा है।
एक साइड इफेक्ट ऐसी चीजें हैं जो कोड में होती हैं जो स्पष्ट रूप से स्पष्ट नहीं हैं।
उदाहरण के लिए, मान लें कि आपके पास यह वर्ग है
public class ContrivedRandomGenerator {
public int Seed { get; set; }
public int GetRandomValue()
{
Random(Seed);
Seed++;
}
}
जब आप शुरू में कक्षा बनाते हैं तो आप इसे एक बीज देते हैं।
var randomGenerator = new ContrivedRandomGenerator();
randomGenerator.Seed = 15;
randomGenerator.GetRandomValue();
आप इंटर्न को नहीं जानते, आप बस एक यादृच्छिक मूल्य प्राप्त करने की उम्मीद करते हैं, और आप randomGenerator.S उम्मीद करेंगे कि अभी भी 15 हो सकते हैं ... लेकिन यह नहीं है।
फ़ंक्शन कॉल में सीड मान को बदलने का साइड इफेक्ट था।