क्लोजर में जीन-क्लास, रीफाई, प्रॉक्सी और डेफटाइप और डिफ्रॉर्ड भी है जो नई कक्षा-जैसी डेटाटाइप को परिभाषित करने के लिए है। ऐसी भाषा के लिए जो सिंटैक्टिक सादगी को महत्व देती है और अनावश्यक जटिलता का पालन करती है, यह एक विचलन की तरह लगती है। कोई बता सकता है कि ऐसा क्यों है? क्या आम लिस्प-स्टाइल डिफ्लैस पर्याप्त हो सकता है?क्लोजर के पास केवल एक के बजाय कक्षा को परिभाषित करने के 5 तरीके क्यों हैं?
उत्तर
यह तीन अलग-अलग कारकों पर विचार करती है:
- JVM
- विभिन्न उपयोग मामलों के लिए थोड़ा अलग अर्थ विज्ञान के लिए की जरूरत है जब प्रकार
- तथ्य को परिभाषित करने के विशेष प्रकार के सिस्टम के कुछ है कि ये पहले विकसित किए गए थे, और कुछ बाद में, जैसे ही भाषा विकसित हुई है।
तो सबसे पहले, मान लें कि ये क्या करते हैं। डेफ्टाइप और जेन-क्लास समान हैं कि वे दोनों समय-समय पर संकलन के लिए नामित कक्षा को परिभाषित करते हैं। जेन-क्लास पहले आया, उसके बाद क्लोजर 1.2 में डेफटाइप किया गया। Deftype पसंद किया जाता है, और बेहतर प्रदर्शन विशेषताओं है, लेकिन अधिक प्रतिबंधक है। एक डेफटाइप वर्ग एक इंटरफ़ेस के अनुरूप हो सकता है, लेकिन किसी अन्य वर्ग से प्राप्त नहीं हो सकता है।
वस्तु के बारे में जैसे सोचना और प्रॉक्सी दोनों गतिशील कार्यावधि में एक गुमनाम वर्ग का एक उदाहरण बनाने के लिए इस्तेमाल कर रहे हैं। प्रॉक्सी पहले आया, क्लोजर 1.2 में deftype और defrecord के साथ आया। रिफी को प्राथमिकता दी जाती है, जैसे डेफटाइप है, जहां अर्थशास्त्र बहुत प्रतिबंधित नहीं है।
इससे सवाल उठता है कि दोनों एक ही समय में दिखाई देने के बाद, और एक समान भूमिका निभाते हैं। ज्यादातर उद्देश्यों के लिए, हम defrecord का उपयोग करना चाहेंगे: इसमें सभी विभिन्न क्लोजर भलाई है जो हम जानते हैं और प्यार करते हैं, अनुक्रमिकता और आगे। डेफटाइप का उद्देश्य अन्य डेटास्ट्रक्चर के कार्यान्वयन के लिए निम्न स्तर के बिल्डिंग ब्लॉक के रूप में उपयोग के लिए है। इसमें नियमित क्लोजर इंटरफेस शामिल नहीं होते हैं, लेकिन इसमें म्यूटेबल फ़ील्ड का विकल्प होता है (हालांकि यह डिफ़ॉल्ट नहीं है)।
आगे पढ़ने के लिए बाहर की जाँच:
The clojure.org datatypes page
The google group thread where deftype and reify were introduced
संक्षिप्त उत्तर वे सब अलग और उपयोगी प्रयोजनों होता है। जटिलता अंतर्निहित JVM की विभिन्न विशेषताओं के साथ प्रभावी ढंग से अंतःक्रिया करने की आवश्यकता के कारण है।
यदि आप किसी भी जावा इंटरऑप की आवश्यकता नहीं है तो 99% बार आप डिफ्रेकॉर्ड या एक साधारण क्लोजर मानचित्र के साथ चिपकने से सबसे अच्छे हैं।
- उपयोग defrecord आप अन्यथा प्रोटोकॉल
- उपयोग करना चाहते हैं एक नियमित रूप से Clojure नक्शा है शायद सबसे आसान और सबसे समझा जा सकता
अपनी आवश्यकताओं और अधिक जटिल हैं, तो निम्न प्रवाह संचित्र के लिए एक महान उपकरण है समझा तुम क्यों दूसरों पर इन विकल्पों में से एक का चयन होगा:
http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/
फ्लो-चार्ट के लिंक के लिए बहुत बहुत धन्यवाद। यह मदद करता है कि ब्लॉग ओरेली के सह-लेखक - प्रोग्रामिंग क्लोजर द्वारा है। मुझे लगता है कि यह निर्णय लेने काफी जटिल है। क्या इंटरफ़ेस और कंक्रीट क्लास के बीच अंतर या स्थिर विधियों को परिभाषित करने की आवश्यकता है या नहीं या नाम या अज्ञात प्रकार का नाम इतना विशाल है कि उन्हें एक अलग भाषा निर्माण की आवश्यकता है? – Salil
मतभेद विशाल नहीं हैं, लेकिन आप जो हासिल करने की कोशिश कर रहे हैं उसके संदर्भ में वे * दार्शनिक रूप से भिन्न * हैं। मुझे लगता है कि क्लोजर में कई दृष्टिकोण इन अंतर्निहित मतभेदों को प्रतिबिंबित करते हैं, जो एक अच्छा कारण है कि उन्हें अलग-अलग नाम क्यों दिए जाने चाहिए। – mikera
+1। पहले फ्लोचार्ट नहीं देखा था, यह कमाल है। –
- 1. क्या केवल एक आइटम के साथ टुपल को परिभाषित करने के और तरीके हैं?
- 2. क्लोजर के पास "प्रतीकों" के अतिरिक्त "कीवर्ड" क्यों हैं?
- 3. जीएलएसएल कार्यक्रम में वीएओ पास करने के कई तरीके क्यों हैं?
- 4. समवर्ती प्रोग्रामिंग के लिए जावा के बजाय क्लोजर क्यों
- 5. केवल कॉन्फ़िगर करने योग्य-पार्सर्स के बजाय पार्सर जेनरेटर क्यों?
- 6. परिभाषित करने के बजाय def और defn का उपयोग करने के पीछे तर्क क्या है?
- 7. मेरी पायथन कक्षा का दावा क्यों है कि मेरे पास 2 के बजाय 2 तर्क हैं?
- 8. किसी ऑब्जेक्ट को परिभाषित करने के तरीके को कैसे जांचें?
- 9. कक्षा कक्षा - उदाहरण बनाम कक्षा के तरीके
- 10. कॉलिंग अभिभावक कक्षा के तरीके
- 11. केवल एक पंक्ति में कक्षा को परिभाषित करने के लिए कैसे?
- 12. क्लोजर फ़ंक्शंस डीबग करने के लिए अनुशंसित तरीके?
- 13. फ़ंक्शन के अंदर एक फ़ंक्शन को परिभाषित करने के लिए
- 14. कक्षा के नाम के बजाय var का उपयोग क्यों करें?
- 15. "नया" उपयोग करने के बजाय एक बनाएँ विधि क्यों है?
- 16. क्यों मूल्य के बजाय कॉन्स्ट संदर्भ द्वारा पास?
- 17. क्या मैं एक उदाहरण के बजाय कक्षा के लिए __repr__ परिभाषित कर सकता हूं?
- 18. स्ट्रिंग अक्षर के लिए उपलब्ध स्ट्रिंग.प्रोटोटाइप के तरीके क्यों हैं?
- 19. Data.String.IsString टाइपक्लास केवल एक रूपांतरण को परिभाषित क्यों करता है?
- 20. गणित वर्ग के तरीके क्यों स्थिर हैं?
- 21. टेस्ट क्लास के बजाय testFixture क्यों?
- 22. कक्षा के तरीके कक्षा के उदाहरणों के आकार में वृद्धि करते हैं?
- 23. सुझाई गति सुधार जब तुरंत मान के साथ स्ट्रिंग को परिभाषित करने के बजाय
- 24. रिलीज के बजाय एनडीईबीयूजी क्यों?
- 25. विज़ुअलाइज़ करने के तरीके
- 26. संपत्ति सजावट केवल कक्षाओं के लिए परिभाषित क्यों है?
- 27. क्या मुझे कक्षा के सभी तरीके मिल सकते हैं?
- 28. कई पुनरावृत्तियों पर उपयोग के लिए एकाधिक regexes को परिभाषित करने के पाइथोनिक और कुशल तरीके
- 29. [झंडे] विशेषता के साथ सी # Enums को परिभाषित करने के कई तरीके?
- 30. डेटा.table परिभाषित क्यों किया गया है: = ओवरलोडिंग के बजाय <-?
Google समूह धागा बहुत मूल्यवान था। मेरी समझ जावा-इंटरऑप प्रॉक्सी के लिए है, जीन-क्लास को ज्यादातर सुधार और डिफाईप द्वारा सप्लाई किया जाता है। मुझे खुशी है कि अब हमारे पास प्रकारों को परिभाषित करने के लिए कम 'अनुशंसित' तरीके हैं। – Salil
ग्रेट उत्तर, और थ्रेड लिंक के लिए धन्यवाद। –
क्षमा करें, "अनुक्रमिकता" का क्या अर्थ है? Google मदद नहीं कर रहा है ... – Trylks