लाभ यह है कि शुद्ध कार्य आपके कोड को तर्क के लिए आसान बनाते हैं। या, दूसरे शब्दों में, साइड इफेक्ट्स आपके कोड की जटिलता को बढ़ाते हैं।
computeProductPriceविधि का उदाहरण लें ।
एक शुद्ध विधि आपको एक उत्पाद की मात्रा, एक मुद्रा आदि के लिए पूछेगा। आप जानते हैं कि जब भी विधि को समान तर्कों के साथ कहा जाता है, तो यह हमेशा एक ही परिणाम देगा।
- आप इसे कैश भी कर सकते हैं और कैश्ड संस्करण का उपयोग कर सकते हैं।
- आप इसे आलसी बना सकते हैं और इसकी कॉल को स्थगित कर सकते हैं जब आपको वास्तव में इसकी आवश्यकता होगी, यह जानकर कि मूल्य इस बीच नहीं बदलेगा।
- आप कई बार विधि कह सकते हैं, यह जानते हुए कि इसके दुष्प्रभाव नहीं होंगे।
- आप दुनिया से अलग-थलग रहने के तरीके के बारे में तर्क दे सकते हैं, यह जानते हुए कि इसके लिए सभी तर्क हैं।
एक गैर-शुद्ध विधि उपयोग करने और डिबग करने के लिए अधिक जटिल होगी। चूंकि यह तर्कों के अलावा अन्य चर की स्थिति पर निर्भर करता है और संभवतः उन्हें बदल देता है, इसका मतलब है कि यह कई बार कॉल किए जाने पर अलग-अलग परिणाम दे सकता है, या एक ही व्यवहार नहीं है जब बिल्कुल भी नहीं बुलाया जाता है या बहुत जल्द या बहुत देर से बुलाया जाता है।
उदाहरण
कल्पना कीजिए कि ढांचे में एक विधि है जो एक संख्या को पार करती है:
decimal math.parse(string t)
इसमें संदर्भात्मक पारदर्शिता नहीं है, क्योंकि यह इस पर निर्भर करता है:
पर्यावरण चर जो संख्या प्रणाली को निर्दिष्ट करता है, वह है बेस 10 या कुछ और।
mathलाइब्रेरी के भीतर चर जो पार्स करने के लिए संख्याओं की शुद्धता को निर्दिष्ट करता है। तो, मान के साथ 1, स्ट्रिंग "12.3456"को पार्स करना होगा 12.3।
संस्कृति, जो अपेक्षित प्रारूपण को परिभाषित करती है। उदाहरण के लिए, साथ fr-FR, पार्सिंग "12.345"देगा 12345, क्योंकि अलगाव चरित्र होना चाहिए ,, नहीं.
कल्पना करें कि इस तरह की विधि के साथ काम करना कितना आसान या कठिन होगा। एक ही इनपुट के साथ, आप उस समय के आधार पर अलग-अलग परिणाम प्राप्त कर सकते हैं जब आप विधि को कॉल करते हैं, क्योंकि कुछ, कहीं न कहीं पर्यावरण चर को बदल देता है या संस्कृति को बदल देता है या एक अलग परिशुद्धता सेट करता है। विधि का गैर-निर्धारक चरित्र अधिक कीड़े और अधिक डीबगिंग दुःस्वप्न को जन्म देगा। कुछ समानांतर कोड को पार्स करने के बाद से एक उत्तर के रूप में कॉलिंग math.parse("12345")और प्राप्त करना 5349अच्छा नहीं है।
इस स्पष्ट रूप से टूटी हुई विधि को कैसे ठीक करें? रेफरेंशियल ट्रांसपेरेंसी की शुरुआत करके। दूसरे शब्दों में, वैश्विक स्थिति से छुटकारा पाने के लिए, और विधि के मापदंडों के लिए सब कुछ आगे बढ़ रहा है:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
अब जब कि विधि शुद्ध है, तो आप जानते हैं कि जब आप विधि को कॉल करते हैं, तो कोई बात नहीं, यह हमेशा समान तर्कों के लिए एक ही परिणाम देगा।