क्या किसी फ़ंक्शन को किसी अन्य फ़ंक्शन से शुद्ध माना जाता है?


9

मैं बिना साइड इफ़ेक्ट के फंक्शन्स बनाते समय डिफॉल्ट वेरिएबल वैल्यूज़ को हैंडल करने का एक तरीका निकालने की कोशिश कर रहा हूँ और निम्नलिखित के साथ समाप्त हो गया है:

function getDefaultSeparator() {
    return ':';
}

function process(input, separator) {
    var separator = separator || getDefaultSeparator();

    // Use separator in some logic

    return output;
}

डिफ़ॉल्ट विभाजक का उपयोग अन्य कार्यों में किया जाएगा और मैं केवल इसे एक स्थान पर परिभाषित करना चाहता हूं।

यदि यह एक शुद्ध कार्य है, तो इसके बजाय केवल एक वैश्विक DEFAULT_SEPARATOR निरंतर का उपयोग करने से क्या अंतर है?


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

3
एक फ़ंक्शन के संभावित डुप्लिकेट क्या एक पैरामीटर के रूप में एक फ़ंक्शन लेता है, तो यह तुरंत अशुद्ध हो जाता है? । प्रश्न एक सटीक डुप्लिकेट नहीं है, लेकिन उत्तर समान होना चाहिए। ("यह दूसरे फ़ंक्शन की शुद्धता पर निर्भर करता है।")
jpmc26

1
एक वैश्विक स्थिरांक का उपयोग एक समारोह अशुद्ध नहीं करता है। वैश्विक मान का उपयोग करना जो आपको लगता है कि निरंतर है।
चेपनर

Btw, आप करी process(उल्टे पैरामीटर ऑर्डर के साथ) करी कर सकते हैं और करी समारोह को करने के लिएvar processDefault = process(":")
bob

जवाबों:


22

क्या किसी फ़ंक्शन को किसी अन्य फ़ंक्शन से शुद्ध माना जाता है?

यह इस बात पर निर्भर करता है कि अन्य फ़ंक्शन क्या करता है, और कॉलिंग फ़ंक्शन क्या करता है। अशुद्धता संक्रामक है, शुद्धता नहीं है।

शुद्ध फ़ंक्शन को कॉल करने से कॉलिंग फ़ंक्शन की शुद्धता नहीं बदलती है। एक अशुद्ध फ़ंक्शन कॉल करना स्वचालित रूप से कॉलिंग फ़ंक्शन को भी अशुद्ध बनाता है।

इसलिए, आपके उदाहरण में, यह आपके द्वारा छोड़े गए भाग की शुद्धता पर निर्भर करता है: यदि वह शुद्ध है, तो पूरा कार्य शुद्ध है।

यदि यह एक शुद्ध कार्य है, तो इसके बजाय केवल एक वैश्विक DEFAULT_SEPARATOR निरंतर का उपयोग करने से क्या अंतर है?

कुछ भी तो नहीं। एक फ़ंक्शन जो हमेशा एक ही मान लौटाता है वह एक स्थिर से अविभाज्य है। वास्तव में, यह ठीक है कि कैसे स्थिरांक λ-पथरी में मॉडलिंग की जाती है।


2
"अशुद्ध फ़ंक्शन को कॉल करना स्वचालित रूप से कॉलिंग फ़ंक्शन को अशुद्ध बनाता है" क्या आप इस बारे में निश्चित हैं? AFAICS, एक अशुद्ध फ़ंक्शन को कॉल करना स्वचालित रूप से कॉलर को अशुद्ध नहीं करता है, हालांकि ऐसा करने से हो सकता है।
डिडुप्लिकेटर

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

6

हाँ, वे दोनों शुद्ध कार्य हैं (माना भाग भी शुद्ध है) क्योंकि:

  1. परिणाम केवल मापदंडों पर निर्भर करता है।
  2. इसके कोई दुष्प्रभाव नहीं हैं।

ध्यान दें कि यदि getDefaultSeparator()शुद्ध कार्य नहीं था, तो न तो process()शुद्ध होगा ।

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

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


1

जैसा कि अन्य कह रहे हैं, निश्चित रूप से, यह अभी भी एक शुद्ध कार्य है।

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

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

सवाल यह है कि किसी को इसकी जरूरत है या नहीं?

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

भले ही उपभोक्ता (एस) और प्रदाता अलग-अलग मॉड्यूल में हैं, फिर भी मॉड्यूल एक साथ संस्करणबद्ध हैं (उदाहरण के लिए, आप एक मिनिज़र का उपयोग करते हैं, ताकि उपभोक्ताओं और प्रदाता के मॉड्यूल एक ही फ़ाइल में हों), YAGNI भी लागू हो सकते हैं।

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

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

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