2009-07-02 10 views
13

क्या कोई मुझे निम्नलिखित पंक्ति में "साइड इफेक्ट" का अर्थ बता सकता है?साइड इफेक्ट - यह क्या है?

यदि आप एक ईएल फ़ंक्शन को कॉल कर रहे हैं जो कुछ भी वापस नहीं करता है, तो आप इसे केवल इसके दुष्प्रभावों के लिए बुला रहे हैं।

उत्तर

9

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

अधिक जानकारी के लिए pure functions पर विकिपीडिया प्रविष्टि देखें।

+0

"ऐसा फ़ंक्शन हमेशा एक मान देता है, जिसे पूरी तरह से इसके इनपुट पैरामीटर द्वारा तय किया जाता है।" यह वास्तव में यह बताता है। और कार्यात्मक प्रोग्रामिंग पर महान बिंदु। इसमें देखेंगे। –

33

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

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

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

+5

+1 साइड इफेक्ट्स का अच्छा विवरण। लेकिन - यही कारण है कि जावा इसके बजाय "विधि" शब्द का उपयोग नहीं करता है।यह अच्छा पीआर के लिए नहीं है, यह है कि "विधि" ओओ के भीतर शब्दावली है, जावा के पहले कभी भी। –

+5

मुझे संदेह है कि ओओ शब्दावली के रूप में "विधि" ठीक से बनाया गया था क्योंकि ओओ का सार उन कार्यों के साथ डेटा का समावेशन है जो डेटा को बदलते हैं और इसलिए वास्तव में कार्य नहीं करते हैं। –

3

एक दुष्प्रभाव तब होता है जब कोई विधि कॉल कक्षा के राज्य को बदलती है। तो

public class SideEffectClass{ 

    private int state = 0; 


    public doSomething(int arg0){ 
     state += arg0; 
    } 
} 

यहाँ, DoSomething (पूर्णांक arg0) राज्य चर बदलने की ओर प्रभाव पड़ता है।

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

+0

उपरोक्त वर्णित अनुसार, एक वर्ग प्रभाव को बदलने से अन्य दुष्प्रभाव हो सकते हैं। – DJClayworth

2

चलो तुलना में स्पष्ट करने के लिए दिए गए कोड को थोड़ा सा ऊपर से जोड़ दें।

public class SideEffectClass{ 

    private int state = 0; 

    public doSomething(...){//Does not matter 
     state ++; 
    } 
} 
0

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

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