क्लोज़र के पास केवल एक के बजाय एक वर्ग को परिभाषित करने के 5 तरीके क्यों हैं?


84

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

जवाबों:


90

यह तीन अलग-अलग कारकों का मिश्रण है:

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

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

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

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

आगे पढ़ने के लिए देखें:

Clojure.org डेटाटिप्स पेज

Google समूह थ्रेड जहां deftype और reify पेश किए गए थे


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

2
@ ट्रिक्क्स: कुंजी-मूल्य जोड़े के अनुक्रम के रूप में वस्तु का इलाज करने की क्षमता। बहुत ज्यादा सब कुछ है जो देशी है क्लोजर को एक अनुक्रम के रूप में माना जा सकता है, जो बहुत शक्तिशाली है।
रोब लछलन

proxyकभी-कभी पसंद किया जाता है क्योंकि यह रनटाइम के तरीकों को संशोधित करने की अनुमति देता है। (उदाहरण, द जॉय ऑफ क्लोजर , 2 डी एड। यह एक वेब हैंडलर में कॉलबैक को संशोधित करने के लिए उपयोगी हो सकता है।)
मंगल

52

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

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

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

यदि आपकी ज़रूरतें अधिक जटिल हैं, तो निम्नलिखित फ़्लोचार्ट यह समझाने का एक बढ़िया साधन है कि आप दूसरों में से एक विकल्प क्यों चुनेंगे:

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

फ्लोचार्ट सही क्लोजर टाइप डेफिनिशन फॉर्म चुनने के लिए


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

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

फ़्लोचार्ट बहुत अच्छा है, लेकिन एक या दूसरे विकल्प या उनमें से संयोजन का उपयोग करने की सभी संभावनाओं या कारणों को कवर नहीं करता है। कोई सरल चार्ट नहीं कर सका।
मंगल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.