2011-08-22 13 views
75

क्लोजर में जीन-क्लास, रीफाई, प्रॉक्सी और डेफटाइप और डिफ्रॉर्ड भी है जो नई कक्षा-जैसी डेटाटाइप को परिभाषित करने के लिए है। ऐसी भाषा के लिए जो सिंटैक्टिक सादगी को महत्व देती है और अनावश्यक जटिलता का पालन करती है, यह एक विचलन की तरह लगती है। कोई बता सकता है कि ऐसा क्यों है? क्या आम लिस्प-स्टाइल डिफ्लैस पर्याप्त हो सकता है?क्लोजर के पास केवल एक के बजाय कक्षा को परिभाषित करने के 5 तरीके क्यों हैं?

उत्तर

82

यह तीन अलग-अलग कारकों पर विचार करती है:

  1. JVM
  2. विभिन्न उपयोग मामलों के लिए थोड़ा अलग अर्थ विज्ञान के लिए की जरूरत है जब प्रकार
  3. तथ्य को परिभाषित करने के विशेष प्रकार के सिस्टम के कुछ है कि ये पहले विकसित किए गए थे, और कुछ बाद में, जैसे ही भाषा विकसित हुई है।

तो सबसे पहले, मान लें कि ये क्या करते हैं। डेफ्टाइप और जेन-क्लास समान हैं कि वे दोनों समय-समय पर संकलन के लिए नामित कक्षा को परिभाषित करते हैं। जेन-क्लास पहले आया, उसके बाद क्लोजर 1.2 में डेफटाइप किया गया। Deftype पसंद किया जाता है, और बेहतर प्रदर्शन विशेषताओं है, लेकिन अधिक प्रतिबंधक है। एक डेफटाइप वर्ग एक इंटरफ़ेस के अनुरूप हो सकता है, लेकिन किसी अन्य वर्ग से प्राप्त नहीं हो सकता है।

वस्तु के बारे में जैसे सोचना और प्रॉक्सी दोनों गतिशील कार्यावधि में एक गुमनाम वर्ग का एक उदाहरण बनाने के लिए इस्तेमाल कर रहे हैं। प्रॉक्सी पहले आया, क्लोजर 1.2 में deftype और defrecord के साथ आया। रिफी को प्राथमिकता दी जाती है, जैसे डेफटाइप है, जहां अर्थशास्त्र बहुत प्रतिबंधित नहीं है।

इससे सवाल उठता है कि दोनों एक ही समय में दिखाई देने के बाद, और एक समान भूमिका निभाते हैं। ज्यादातर उद्देश्यों के लिए, हम defrecord का उपयोग करना चाहेंगे: इसमें सभी विभिन्न क्लोजर भलाई है जो हम जानते हैं और प्यार करते हैं, अनुक्रमिकता और आगे। डेफटाइप का उद्देश्य अन्य डेटास्ट्रक्चर के कार्यान्वयन के लिए निम्न स्तर के बिल्डिंग ब्लॉक के रूप में उपयोग के लिए है। इसमें नियमित क्लोजर इंटरफेस शामिल नहीं होते हैं, लेकिन इसमें म्यूटेबल फ़ील्ड का विकल्प होता है (हालांकि यह डिफ़ॉल्ट नहीं है)।

आगे पढ़ने के लिए बाहर की जाँच:

The clojure.org datatypes page

The google group thread where deftype and reify were introduced

+1

Google समूह धागा बहुत मूल्यवान था। मेरी समझ जावा-इंटरऑप प्रॉक्सी के लिए है, जीन-क्लास को ज्यादातर सुधार और डिफाईप द्वारा सप्लाई किया जाता है। मुझे खुशी है कि अब हमारे पास प्रकारों को परिभाषित करने के लिए कम 'अनुशंसित' तरीके हैं। – Salil

+1

ग्रेट उत्तर, और थ्रेड लिंक के लिए धन्यवाद। –

+0

क्षमा करें, "अनुक्रमिकता" का क्या अर्थ है? Google मदद नहीं कर रहा है ... – Trylks

42

संक्षिप्त उत्तर वे सब अलग और उपयोगी प्रयोजनों होता है। जटिलता अंतर्निहित JVM की विभिन्न विशेषताओं के साथ प्रभावी ढंग से अंतःक्रिया करने की आवश्यकता के कारण है।

यदि आप किसी भी जावा इंटरऑप की आवश्यकता नहीं है तो 99% बार आप डिफ्रेकॉर्ड या एक साधारण क्लोजर मानचित्र के साथ चिपकने से सबसे अच्छे हैं।

  • उपयोग defrecord आप अन्यथा प्रोटोकॉल
  • उपयोग करना चाहते हैं एक नियमित रूप से Clojure नक्शा है शायद सबसे आसान और सबसे समझा जा सकता

अपनी आवश्यकताओं और अधिक जटिल हैं, तो निम्न प्रवाह संचित्र के लिए एक महान उपकरण है समझा तुम क्यों दूसरों पर इन विकल्पों में से एक का चयन होगा:

http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

Flowchart for choosing the right clojure type definition form

+1

फ्लो-चार्ट के लिंक के लिए बहुत बहुत धन्यवाद। यह मदद करता है कि ब्लॉग ओरेली के सह-लेखक - प्रोग्रामिंग क्लोजर द्वारा है। मुझे लगता है कि यह निर्णय लेने काफी जटिल है। क्या इंटरफ़ेस और कंक्रीट क्लास के बीच अंतर या स्थिर विधियों को परिभाषित करने की आवश्यकता है या नहीं या नाम या अज्ञात प्रकार का नाम इतना विशाल है कि उन्हें एक अलग भाषा निर्माण की आवश्यकता है? – Salil

+3

मतभेद विशाल नहीं हैं, लेकिन आप जो हासिल करने की कोशिश कर रहे हैं उसके संदर्भ में वे * दार्शनिक रूप से भिन्न * हैं। मुझे लगता है कि क्लोजर में कई दृष्टिकोण इन अंतर्निहित मतभेदों को प्रतिबिंबित करते हैं, जो एक अच्छा कारण है कि उन्हें अलग-अलग नाम क्यों दिए जाने चाहिए। – mikera

+0

+1। पहले फ्लोचार्ट नहीं देखा था, यह कमाल है। –

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

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