हर बार जब आप एक वैश्विक वैर बनाते हैं जिसे आप फिर से बांधने की योजना बनाते हैं, तो आप उस चर को एक्सेस करने वाले प्रत्येक फ़ंक्शन के लिए एक अतिरिक्त निहित तर्क जोड़ रहे हैं। उचित (स्पष्ट) तर्कों के विपरीत, यह छुपा तर्क फ़ंक्शन के हस्ताक्षर में दिखाई नहीं देता है और यह संकेत हो सकता है कि फ़ंक्शन इसका उपयोग कर रहा है। आपका कोड कम "कार्यात्मक" हो जाता है; एक ही तर्क को उसी तर्क के साथ बुलाकर परिणामस्वरूप इन वैश्विक गतिशील युद्धों की वर्तमान स्थिति के आधार पर अलग-अलग रिटर्न मूल्य हो सकते हैं।
वैश्विक वर्रों का लाभ यह है कि आप आसानी से एक डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं, और यह आपको उस वर्क को हर फंक्शन के पास पास करने के लिए आलसी होने की अनुमति देता है।
नकारात्मकता यह है कि आपका कोड पढ़ने, परीक्षण, उपयोग और डीबग करना कठिन है। और आपका कोड संभावित रूप से अधिक त्रुटि-प्रवण हो जाता है; इससे पहले कि आप इसे इस्तेमाल करने वाले फ़ंक्शन को कॉल करने से पहले var को बांधना या फिर से बांधना भूलना आसान हो, लेकिन session
पैरामीटर में गुजरने के लिए भूलना आसान नहीं है, जब यह सही है।
तो आप रहस्य कीड़े के साथ समाप्त होते हैं, और कार्यों के बीच अजीब अंतर्निहित निर्भरताएं समाप्त करते हैं। इस परिदृश्य पर विचार करें:
user> (defn foo [] (when-not (:logged-in *session*) (throw (Exception. "Access denied!"))))
#'user/foo
user> (defn bar [] (foo))
#'user/bar
user> (defn quux [] (bar))
#'user/quux
user> (quux)
; Evaluation aborted. ;; Access denied!
quux
के व्यवहार एक मूल्य होने के सत्र पर परोक्ष निर्भर करता है, लेकिन आपको पता नहीं होता कि जब तक आप quux
कॉल हर कार्य के माध्यम से नीचे खोदा, और हर कार्य करते हैं उन कार्यों कहते हैं। *session*
के आधार पर नीचे एक समारोह के साथ कॉल श्रृंखला 10 या 20 स्तरों की गहराई की कल्पना करें। मजेदार डिबगिंग है कि।
इसके बजाय यदि आपने (defn foo [session] ...)
, (defn bar [session] ...)
, (defn quux [session] ...)
था, इसे तुरंत आप के लिए स्पष्ट है कि यदि आप quux
फोन, तो आप बेहतर एक सत्र के लिए तैयार होगा होगा।
व्यक्तिगत रूप से, मैं स्पष्ट तर्कों का उपयोग जब तक कि मैं एक मजबूत, समझदार डिफ़ॉल्ट मान है कि कार्यों की टन का इस्तेमाल किया, कि मैं बहुत कम या कभी rebind करने की योजना बनाई थी होगा। (उदाहरण के लिए एसटीडीओयूटी को कुछ भी प्रिंट करना चाहते हैं जो प्रत्येक फंक्शन को एक स्पष्ट तर्क के रूप में पास करने के लिए मूर्खतापूर्ण होगा।)
उत्तर के लिए धन्यवाद। बहुत सूचनाप्रद। में इसे याद रखूंगा। :) – Rayne
आप, ज़ाहिर है, इस चर्चा मैं अचानक याद आया के लिए एक लिंक पोस्ट करने के लिए स्वागत है, हालांकि मुझे लगता है कि ब्रायन साथ आया था और हड़कंप मच गया आप के लिए बातें ... असल में मैं वापस कर रहा हूँ: http://groups.google .com/group/clojure/Browse_thread/thread/a7d020f8c76ecb77/dbd4f016fbb5f2e4 - थ्रेड का शीर्षक "रिंग्स के लिए सत्र" है। रिंग सर्वर-साइड काम करता है, लेकिन मुझे लगता है कि चर्चा अभी भी आपकी मदद कर सकती है। विचारों को परमाणुओं (सत्र प्रति एक सत्र) और कार्यात्मक शुद्धता में सत्र डेटा संग्रहीत करने के बीच विभाजित किया जाता है ... दोनों तरफ से अच्छे तर्क, अपना चयन करें। –
ओह, भी, परमाणुओं के साथ भी संस्करण के लिए उन्हें एक सत्र जो चारों ओर स्पष्ट रूप से पारित हो जाता है में डालता है, लेकिन रिंग सत्र की अंगूठी के कोड * के एक बड़े हिस्से के लिए प्रासंगिक हैं और * वहाँ की उन्हें हर समय चारों ओर पारित किया जा रहा एक भीड़ होने की संभावना है । दूसरी तरफ, एक ई-मेल क्लाइंट के साथ, आप सभी प्रासंगिक जानकारी को केवल एक डेटा संरचना में डाल सकते हैं (संभवतः कई सर्वरों के लिए लॉगिन प्रमाण-पत्र आदि शामिल हैं - लेकिन उनमें से सभी एक ही इंसान से संबंधित हैं होने वाला) जो हमेशा * वहां होगा। यह मेरी आंखों में, वेबपैप से कुछ अलग जानवर बनाता है ... फिर भी, वाईएमएमवी। –