2015-11-17 4 views
9

documentation of Clojure's type mechanisms में, यह कहा गया है किक्लोजर कोर लाइब्रेरी कंक्रीट व्युत्पन्न का उपयोग क्यों करती है?

  • कंक्रीट व्युत्पत्ति बुरा
    • आप ठोस वर्ग से डेटाटाइप्स प्राप्त नहीं सकता है, केवल इंटरफेस

हालांकि, कुछ core Clojure classes कंक्रीट व्युत्पन्न का उपयोग करें (टी यहाँ अन्य उदाहरण हैं, लेकिन इनमें से केवल मामलों में सुपर क्लास clojure.lang का हिस्सा) है कर रहे हैं:

  • ARef फैली AReference
  • Agent फैली ARef
  • Atom फैली ARef
  • Namespace फैली AReference
  • RefARef
  • 01 बढ़ाता है
  • Var फैली ARef

इसके अलावा, कई सार वर्ग हैं। हालांकि, क्लोजर में एक अमूर्त वर्ग के बराबर बनाने का कोई तरीका नहीं है, और मेरे लिए, एक अमूर्त वर्ग के विस्तार में नियमित कंक्रीट व्युत्पन्न के रूप में सभी समान कमीएं होती हैं।

कंक्रीट व्युत्पन्न यहां क्यों उपयोग किया जाता है?

+0

वही पृष्ठ उत्परिवर्तन और encapsulation के खिलाफ भी चेतावनी देता है, फिर भी 'clojure.lang' में कक्षाओं में बहुत से परिवर्तनीय निजी क्षेत्र शामिल हैं। इस भाषा के आंतरिक कार्यान्वयन विवरण को भ्रमित न करें कि इसका उपयोग कैसे किया जाना है। – Alex

+1

@Alex एकमात्र कारण मुझे लगता है कि 'clojure.lang' में इंटरफेस का विस्तार क्लोजर में नए डेटा संरचनाओं को लागू करने के लिए * केवल * तरीका है जो' clojure.core' में फ़ंक्शंस के अनुकूल हैं। अगर उस पैकेज में सब कुछ वास्तव में कार्यान्वयन विवरण है, तो इस तरह के विस्तार के लिए इसके कार्यकलापों के ज्ञान की आवश्यकता नहीं होनी चाहिए। –

उत्तर

2

दर्शनशास्त्र सामग्री की बात करते समय मुझे अपने आप को आधिकारिक पर्याप्त महसूस नहीं होता है, लेकिन यहां मेरे दो सेंट हैं।

आपके उद्धृत पाठ का कारण वहां दिखाई देता है, defrecord और deftype के दुरुपयोग पर चेतावनी देना है। क्लोजर एपीआई के रूप में रिकॉर्ड/प्रकारों को उजागर करने को प्रोत्साहित नहीं करता है। इसके बजाए, जब भी संभव हो, इंटरफ़ेस का खुलासा करना चाहिए। आखिरकार, ओओ-भाषा कक्षाओं का खुलासा करती है और एफपी-भाषा कार्यों/विधियों/इंटरफेस का खुलासा करती है।

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

+0

यह समझ में आता है, लेकिन मुझे यह विश्वास करने के लिए आपके तर्क के लिए और अधिक समर्थन देखने की आवश्यकता होगी कि यहां सार तत्वों का उपयोग केवल "आवश्यक बुराई" है और, JVM की प्रदर्शन विशेषताओं के बिना, इसका उपयोग करने के लिए निम्न होगा शुद्ध इंटरफेस। ऐसा लगता है कि रिच हिकी के यहां बहुत जानबूझकर कारण है। –

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