"साइड इफेक्ट" क्या है?


87

मैंने साइड इफेक्ट की अवधारणा को स्पष्ट रूप से नहीं समझा है।

  • प्रोग्रामिंग में साइड इफेक्ट क्या है?
  • क्या यह प्रोग्रामिंग भाषा पर निर्भर है?
  • क्या बाहरी और आंतरिक साइड इफेक्ट जैसी कोई चीज है?

कृपया साइड इफेक्ट्स पैदा करने वाले कारणों का कुछ उदाहरण दें।


7
बहुत होमवर्क पसंद है।
gnasher729

3
@ gnasher729 जो इसकी देखभाल करता है वह TREMENDOUSLY उपयोगी है :)
चार्ली पार्कर

जवाबों:


108

एक साइड इफेक्ट बस कुछ प्रकार के राज्य के संशोधन को संदर्भित करता है - उदाहरण के लिए:

  • एक चर के मूल्य को बदलना;
  • डिस्क पर कुछ डेटा लिखना;
  • उपयोगकर्ता इंटरफ़ेस में एक बटन को सक्षम या अक्षम करना।

कुछ लोग जो कहते दिख रहे हैं उसके विपरीत :

  • साइड इफेक्ट को छिपाना या अप्रत्याशित नहीं होना है (यह हो सकता है, लेकिन इसका परिभाषा से कोई लेना-देना नहीं है क्योंकि यह कंप्यूटर साइंस पर लागू होता है);

  • एक साइड इफ़ेक्ट का आलस्य से कोई लेना देना नहीं है। एक इम्पोटेंट फंक्शन के साइड इफेक्ट्स हो सकते हैं और एक नॉन-इम्पोटेंट फंक्शन के कोई साइड इफेक्ट्स नहीं हो सकते हैं (जैसे कि मौजूदा सिस्टम डेट और टाइम प्राप्त करना)।

यह वास्तव में बहुत सरल है। साइड इफेक्ट = कहीं कुछ बदलना।

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


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

15
@ तैयार: +1। जब भी मुझे वह शब्द दिखाई देता है तो मैं मदद नहीं कर सकता, लेकिन अगर यह एफपी अधिवक्ताओं द्वारा चुना नहीं गया, तो यह ठीक है कि सूक्ष्म रूप से भयावह अर्थ है।
मेसन व्हीलर

6
@ मेसन व्हीलर। यह एफपी से बहुत पहले अस्तित्व में था। और यह एक सूक्ष्म रूप से भयावह अर्थ नहीं है। यह फ्लैट-आउट बुराई है और हमेशा रहा है। 3 दशकों से मैं कोडिंग कर रहा हूं, "क्रिप्टो-असाइनमेंट" बयान - साइड-इफेक्ट - लोगों को परेशान कर रहा है। एक सादे पुराने असाइनमेंट स्टेटमेंट का सामना करना बहुत आसान है।
एस.लॉट

7
@ मेसन व्हीलर: सी ++a। में। असाइनमेंट की तरह नहीं दिखता है। b = ++a;इसके दो दुष्प्रभाव हैं। स्पष्ट एक और क्रिप्टो-असाइनमेंट a। यह उस तरह का है जो एक पक्ष-प्रभाव है जो (कुछ को) वांछनीय है। लेकिन इसे सूक्ष्म नहीं बनाने के लिए मेरे पूरे करियर के लिए साइड-इफेक्ट कहा गया है।
एस.लॉट २

5
@Zachary, कृपया मेरे उत्तर में अंतिम बुलेट बिंदु देखें। आप जिस चीज का जिक्र कर रहे हैं, वह है उदासीन व्यवहार (या उसकी कमी)। जो आपको साइड इफेक्ट के बारे में कुछ नहीं बताता है। सिस्टम घड़ी जांच की जा रही है नहीं एक पक्ष प्रभाव; वास्तव में, "गेट" शब्द के साथ उपसर्ग किया गया कोई भी कार्य या विधि वह है जिससे आपको कोई दुष्प्रभाव होने की उम्मीद नहीं करनी चाहिए।
Aaronaught

36

कोई भी ऑपरेशन जो कंप्यूटर की स्थिति को संशोधित करता है या जो बाहरी दुनिया के साथ बातचीत करता है, को साइड इफेक्ट कहा जाता है। साइड इफेक्ट पर विकिपीडिया देखें ।

उदाहरण के लिए, इस फ़ंक्शन का कोई दुष्प्रभाव नहीं है। इसका परिणाम केवल इसके इनपुट तर्कों पर निर्भर करता है, और कार्यक्रम की स्थिति या इसके वातावरण के बारे में कुछ भी नहीं कहा जाता है जब इसे कहा जाता है:

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); }

1
यह एक अच्छी परिभाषा है, लेकिन मैं विस्तार के बारे में पागल नहीं हूं - जैसे कि थोरबजोरन के जवाब में, इसका एक हिस्सा यह है कि इस तरह के कार्यों के साथ साइड इफेक्ट्स के मुद्दे को भ्रमित किया जा रहा है; जैसा कि आपका Writeउदाहरण दर्शाता है कि साइड इफेक्ट्स का मतलब यह नहीं है कि फ़ंक्शन कभी भी अपने आउटपुट को अपने इनपुट के संबंध में बदलता है, या यहां तक ​​कि इसका आउटपुट इनपुट पर निर्भर करता है।
Aaronaught

6
यह बेकार होने के बारे में नहीं है। तथ्य यह है कि यह उत्पादन करता है इसका मतलब है कि इसका एक दुष्प्रभाव है।
क्रिस्टोफर जॉनसन

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

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

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

20

मुझे लगता है कि मौजूदा उत्तर काफी अच्छे हैं। मैं कुछ पहलुओं पर विस्तार से बताना चाहूंगा कि आईएमओ को पर्याप्त बल नहीं दिया गया है।

गणित में एक फ़ंक्शन मानों के टपल से एक मानचित्रण मात्र है। इसलिए, एक फ़ंक्शन fऔर एक मान दिया जाता है x, f(x)हमेशा एक ही परिणाम होगा y। आप अच्छी तरह से जगह ले सकती f(x)साथ yएक अभिव्यक्ति में हर जगह और कुछ भी नहीं बदल जाएगा।

कई प्रोग्रामिंग भाषा में एक फ़ंक्शन (या प्रक्रिया) क्या कहा जाता है एक निर्माण (कोड का टुकड़ा) जिसे निष्पादित किया जा सकता है:

  1. यह गणितीय अर्थों में एक फ़ंक्शन की गणना करता है, अर्थात दिए गए इनपुट मान, यह एक परिणाम देता है, या
  2. यह कुछ प्रभाव पैदा करता है, जैसे स्क्रीन पर कुछ प्रिंट करता है, एक डेटाबेस पर एक मूल्य बदलता है, मिसाइल लॉन्च करता है, 10 सेकंड के लिए सोता है, एक एसएमएस भेजता है।

तो प्रभाव राज्य से संबंधित हो सकता है लेकिन अन्य पहलुओं पर भी जैसे मिसाइल दागना या कुछ सेकंड के लिए रोकना।

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

ध्यान दें कि

  1. कुछ प्रक्रियाएँ उनके रिटर्न वैल्यू और उनके साइड-इफ़ेक्ट दोनों के लिए उपयोगी हैं।
  2. कुछ प्रक्रियाएं केवल परिणाम मान की गणना करती हैं और कोई अन्य प्रभाव नहीं डालती हैं। उन्हें अक्सर शुद्ध कार्य कहा जाता है क्योंकि वे जो कुछ भी करते हैं वह गणितीय अर्थों में एक फ़ंक्शन की गणना करता है।
  3. कुछ प्रक्रियाएं, जैसे sleep()कि पायथन में, केवल उनके (साइड) प्रभावों के लिए उपयोगी हैं। इन्हें अक्सर ऐसे फ़ंक्शन के रूप में तैयार किया जाता है, जो एक विशेष मान None, unitया ()या ... को लौटाते हैं , जो केवल इंगित करता है कि गणना सही ढंग से समाप्त हो गई है।

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

4

एक साइड-इफेक्ट तब होता है जब किसी ऑपरेशन का वैरिएबल / ऑब्जेक्ट पर एक प्रभाव होता है जो इच्छित उपयोग के बाहर होता है।

यह तब हो सकता है जब आप किसी जटिल फ़ंक्शन को कॉल करते हैं जिसमें कुछ वैश्विक चर को बदलने का साइड-इफेक्ट होता है, भले ही वह कारण यह नहीं था कि आपने इसे बुलाया था (शायद आपने इसे डेटाबेस से कुछ निकालने के लिए कहा था)।

मैं मानता हूं कि मुझे एक साधारण उदाहरण के साथ आने में परेशानी हो रही है जो पूरी तरह से विरोधाभासी नहीं है, और जिन सामानों पर मैंने काम किया है उनके उदाहरण यहां पोस्ट करने के लिए बहुत लंबे समय से हैं (और जब से यह काम से संबंधित है, मुझे शायद वैसे भी नहीं होना चाहिए )।

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


ठीक है, इसलिए अब सभी के उदाहरण देने के बाद, मुझे लगता है कि मैं भी;)

/*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में कुछ गणनाओं के परिणाम को वापस करने का एक प्राथमिक प्रभाव होता है, और संभवतः एक वैश्विक चर को संशोधित करने का एक पक्ष प्रभाव होता है।

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


2
मुझे नहीं लगता कि यह एक अच्छी सार्वभौमिक परिभाषा है। कई प्रोग्रामर जानबूझकर अपने साइड इफेक्ट के लिए विशेष रूप से निर्माण का उपयोग करते हैं।
सीबी बेली

@ घर: काफी साफ। उस मामले में, आप इसे कैसे परिभाषित करेंगे?
FrustratedWithFormsDesigner

2
मुझे लगता है कि @KristopherJohnson की स्पष्ट परिभाषा है। जो कुछ भी उस कार्यक्रम या उसके वातावरण की स्थिति को बदल देता है या वास्तविक विश्व प्रभाव पैदा करता है जैसे कि आउटपुट उत्पन्न करना।
सीबी बेली 20

@Charles बेली: यह परिभाषा नहीं बदलती है। साइड-इफेक्ट के लिए चीजों का उपयोग करना ठीक है। जब तक आप समझते हैं कि साइड-इफेक्ट है। यह इस परिभाषा के बारे में कुछ भी नहीं बदलता है।
एस.लॉट

1
@SLott: इस उत्तर (यानी पहले पैराग्राफ) में परिभाषा में क्लॉज शामिल है: "इच्छित उपयोग के बाहर"। मुझे लगता है कि मेरी टिप्पणी उचित थी।
सीबी बेली

3

कंप्यूटर विज्ञान में, एक फ़ंक्शन या अभिव्यक्ति को एक साइड इफेक्ट कहा जाता है यदि यह कुछ राज्य को संशोधित करता है या कॉलिंग फ़ंक्शन या बाहरी दुनिया के साथ एक नमूदार बातचीत करता है।

से विकिपीडिया - साइड इफेक्ट

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

अधिक सामान्य शब्दों में, एक साइड इफेक्ट कोई भी प्रभाव है जो निर्माण के डिजाइनर का इच्छित प्रभाव नहीं है।

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

   public void SendBreakupTextMessage() {
        Messaging.send("I'm breaking up with you!")
   }

यदि यह एक फ़ंक्शन होने का इरादा है, तो केवल एक चीज जो इसे करना चाहिए वह है शून्य। यदि यह साइड-इफ़ेक्ट फ्री था, तो यह वास्तव में टेक्स्ट मैसेज नहीं भेजना चाहिए।

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

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

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

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

तो, यह सब क्यों महत्वपूर्ण है?

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

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

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

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

अंत में, idempotent का अर्थ है इस फ़ंक्शन को एक ही इनपुट के साथ कई बार कॉल करना (कोई फर्क नहीं पड़ता कि वे कहाँ से आते हैं) हमेशा एक ही प्रभाव (साइड इफेक्ट या नहीं) में परिणाम होगा।


मुझे लगता है कि साइड इफेक्ट की व्याख्या करने के साथ एक बड़ी समस्या यह है कि जब तक आप ओकेमेल या हास्केल जैसी भाषा का उपयोग नहीं करते हैं, तब तक साइड-इफेक्ट फ्री (लगभग!) प्रोग्रामिंग के बारे में तर्क करना बहुत मुश्किल हो सकता है।
जेमी स्ट्रॉस

2

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

जहाँ तक मुझे पता है, कोई आंतरिक और बाहरी दुष्प्रभाव नहीं हैं।


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

मुझे लगता है कि MS-BASIC और QBasic जैसी कुछ पूर्व-गिनी प्रोग्रामिंग भाषाएं 'साइड इफ़ेक्ट' भाषा के समान ही हो सकती हैं, जो आपको मिल सकती हैं। और हाँ आपके आंतरिक और बाहरी दोनों तरह के दुष्प्रभाव हो सकते हैं।
जेम्स के।

0

ये रहा एक सरल उदाहरण:

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; यह अभिव्यक्ति का गैर-पक्ष प्रभाव हिस्सा है।
सीबी बेली

@Charles - मैं सहमत हूं, हालांकि मूल उदाहरण वर्तमान के रूप में स्पष्ट नहीं था।
ChaosPandion

@ एडम - ठीक है, यह वास्तव में भाषा पर निर्भर करता है। यदि यह C # होता तो इसे साइड इफेक्ट नहीं माना जाता।
ChaosPandion

@ पेटोसपांडियन: व्यक्तिगत रूप से, मैं असहमत हूं। मूल उदाहरण बहुत सरल और स्पष्ट था।
सीबी बेली 20

-2

एक साइड इफेक्ट ऐसी चीजें हैं जो कोड में होती हैं जो स्पष्ट रूप से स्पष्ट नहीं हैं।

उदाहरण के लिए, मान लें कि आपके पास यह वर्ग है

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 हो सकते हैं ... लेकिन यह नहीं है।

फ़ंक्शन कॉल में सीड मान को बदलने का साइड इफेक्ट था।


10
साइड इफेक्ट्स को छिपाना नहीं पड़ता है। आप बोलचाल या चिकित्सा उपयोग के बारे में सोच रहे हैं; प्रोग्रामिंग में, एक साइड इफेक्ट बस कुछ राज्य को संशोधित करने के लिए संदर्भित करता है।
Aaronaught

1
कंसोल पर मुद्रण एक साइड इफेक्ट है। यह छिपा नहीं है। से विकिपीडिया : "कंप्यूटर विज्ञान में, एक समारोह या अभिव्यक्ति है, एक मूल्य के लौटने के अलावा, यह भी कुछ राज्य को संशोधित करता है या एक है एक पक्ष प्रभाव कहा जाता है कि फोन करने के कार्य या साथ नमूदार बातचीत बाहर की दुनिया ।"

साइड इफेक्ट्स हैं कि गैर कार्य (अर्थात प्रक्रियाएं) किसी भी कार्य को कैसे पूरा करती हैं। एक्स = 1; X = Y (10) दो शुद्ध कार्य हैं। जब आप "x = जो कुछ भी" दायरे से बाहर कदम रखते हैं, चाहे स्क्रीन पर आउटपुट लिखना है? ड्राइव | प्रिंटर | "x = y" प्रारूप के बाहर इनपुट का नेतृत्व किया या पढ़ा है या बस एक चर का मान एक चीज से दूसरी चीज में बदल सकता है। , यह एक साइड इफेक्ट है।
जेम्स के

मुझे लगता है कि 'छिपी हुई' से उसका मतलब गैर-स्पष्ट है। जैसे x = f (y, z) x को y और z के आधार पर माना जा सकता है। जबकि proc (x, y, z) आपको बताता है कि क्या चल रहा है। प्रत्येक संस्करण को बदला जा सकता है, या कोई भी नहीं। प्रोक च के लिए एक एनालॉग हो सकता है, या पूरी तरह से असंबंधित हो सकता है। एक शुद्ध कार्य का एक ही उत्तर होता है: 'x'। उस पार जाओ, यह एक साइड इफेक्ट है। पूरी तरह से इरादा है, लेकिन दुष्प्रभाव।
जेम्स के

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