2009-10-10 16 views
24

क्लोजर एक कार्यात्मक lisp है, जो कि सभी ऑब्जेक्ट उन्मुख पर नहीं है, भले ही यह JVM पर चलता है, एक ऑब्जेक्ट उन्मुख भाषा के लिए डिज़ाइन किया गया वीएम। क्लोजर सूच नामक एक इंटरफ़ेस को सारणित करके सूचियों और वैक्टरों पर पुनरावृत्त करने के लिए समान इंटरफेस प्रदान करता है। यह आईएसईक नामक जावा इंटरफेस का आंतरिक रूप से भी कार्यान्वित किया जाता है। क्या यह वस्तु-उन्मुख अमूर्तता का उदाहरण नहीं है? यह दावा कैसे किया जा सकता है कि क्लोजर ऑब्जेक्ट उन्मुख नहीं है?क्लोजर ऑब्जेक्ट उन्मुख है अपने दिल में? (Seqs में polymorphism)

मुझे लगता है कि इस प्रश्न के लिए एक अनुशासन --- जब polymorphism ऑब्जेक्ट ओरिएंटेशन से अलग माना जा सकता है?

+0

के लिए एक स्रोत का लिंक "कथित तौर पर बिल्कुल नहीं वस्तु उन्मुख" है कि क्या तर्क पता लगाना में मददगार होगा तकनीकी बनाम राजनीतिक है ... –

+2

http://clojure.org/rationale ओओपी के बारे में वार्ता और क्यों क्लोजर इसे टालता है। –

+0

http://blog.thinkrelevance.com/2009/8/12/rifle-oriented-programming-with-clojure-2 एक दिलचस्प लेख है जो चर्चा करता है कि कैसे क्लोजर वास्तव में सभी प्रमुख ओओ प्रिंसिपल के उपयोग की अनुमति देता है। हालांकि मुझे लगता है कि उन्हें गठबंधन करना मुश्किल है। उदाहरण के लिए बंद encapsulation का उपयोग विरासत द्वारा विस्तार को शामिल नहीं करता है। सामान्य दृष्टिकोण विस्तारशीलता के पक्ष में encapsulation से गुजरना प्रतीत होता है। –

उत्तर

27

इडियोमैटिक क्लोजर स्वतंत्र कार्यों को परिभाषित करने का पक्ष लेता है जो कोर डेटा संरचनाओं के बहुत छोटे सेट पर काम करते हैं; विधियों और डेटा का यह अनबंडल ऑब्जेक्ट ओरिएंटेशन और कार्यात्मक शैली के पक्ष में एक मजबूत कथन है। रिच हिकी (क्लोजर के निर्माता) ने बार-बार इसका महत्व बताया है; उदाहरण के लिए यहां: "Clojure eschews the traditional object-oriented approach of creating a new data type for each new situation, instead preferring to build a large library of functions on a small set of types."

कोर डेटा संरचनाओं पर निर्भरता अन्य कार्यात्मक भाषाओं की तुलना में क्लोजर में और भी महत्वपूर्ण है क्योंकि आप क्लोजर के एसटीएम से केवल पूर्ण लाभ प्राप्त करेंगे जब आप क्लोजर के लगातार डेटा संरचनाओं का उपयोग कर रहे हों।

मुझे लगता है कि इस प्रश्न के लिए एक अनुशासन --- जब polymorphism ऑब्जेक्ट ओरिएंटेशन से अलग माना जा सकता है?

मैं Clojure के मुल्टीमेथड्स (अर्थात बहुरूपी सुविधाओं) का उपयोग कर रहा एक फ़ाइल नाम के विस्तार के आधार पर विभिन्न कार्यान्वयन के लिए प्रेषण करने के लिए - सब पर उन्मुख, लेकिन बहुरूपी आपत्ति नहीं।

+14

"10 डेटा संरचनाओं पर 10 कार्यों की तुलना में एक डेटा संरचना पर 100 कार्य संचालित करना बेहतर है।" - एलन जे पेरिस – Jonas

16

मुझे लगता है कि इस प्रश्न के लिए एक अनुशासन --- जब polymorphism ऑब्जेक्ट ओरिएंटेशन से अलग माना जा सकता है?

पॉलिमॉर्फिज्म ऑब्जेक्ट-ओरिएंटेशन से बिल्कुल कोई संबंध नहीं है। इसका मतलब यह है कि एक ही ऑपरेशन अपने ऑपरेटरों के प्रकार (ओं) के आधार पर अलग-अलग व्यवहार कर सकता है।

एमएल या हास्केल जैसी कार्यात्मक भाषाओं में 30 से अधिक वर्षों के लिए पॉलिमॉर्फिज्म है, और पीएल इतिहास के बेहतर ज्ञान वाले किसी व्यक्ति को शायद कुछ उदाहरण पूर्व -1962 (यानी पूर्व-ओओ) बता सकते हैं।

क्रिस्टोफर स्ट्रैची ने 1 9 67 में पैरामीट्रिक पॉलिमॉर्फिज्म और एड-हाक पॉलिमॉर्फिज्म के बीच भेद का वर्णन किया, इसलिए पॉलिमॉर्फिज्म में पहले से ही मौजूद था। चूंकि पॉलिमॉर्फिज्म केवल सिमुला-67 में ओओ में पेश किया गया था, मेरा अनुमान है कि ओलिओ में पेश होने से पहले पॉलीमोर्फिज्म मौजूद होना चाहिए।

4

क्लोजर पॉलीमोर्फिज्म जावा का एक नाटकीय विस्तार है। जावा विधियों में कक्षा के अनुसार प्रेषित हैं। क्लोजर में यह आपको विस्तारित किसी भी चीज़ के आधार पर कॉल भेजने की अनुमति देने के लिए बढ़ाया गया है। वर्ग पर प्रेषण करना अभी भी वास्तव में आसान है, उस समय के अधिकांश समय में यह कैसे किया जाता है। अगर आप कुछ और चाहते हैं तो आप अपना खुद का प्रेषक लिख सकते हैं। बिल्ट इन फ़ंक्शन derive जो भी आप चाहते हैं उसके आधार पर पदानुक्रम बनाने के लिए और फिर isa पर प्रेषित करें।

अधिक अच्छाई पर: http://clojure.org/multimethods

5

ध्यान रखें कि ISeq तरह बातें जावा हैं।

क्लोजर में seq abstraction वास्तव में केवल 'कुछ' है जिसे आप पहले, आराम और nth कार्यों में आपूर्ति कर सकते हैं (ध्यान दें कि आप पहले एक सीक पर कॉल नहीं करते हैं, आप पहले सेक तर्क के साथ कॉल करते हैं)। क्लोजर भाषा कोर फ़ंक्शंस सभी संग्रह, seqs, या आदिम प्रकारों पर काम करते हैं। खुला इंटरफेस में विधियों के साथ कोई डेटा बंडल नहीं किया गया है। तो क्लोजर का कार्यान्वयन जावा में है और जेवीएम के साथ सभी इंटरऑप कक्षाओं/ऑब्जेक्ट्स को शामिल करने जा रहा है, लेकिन भाषा को क्लोजर नहीं करता है।

डेटा संरचनाओं के साथ बंडलिंग विधियां क्लोजर को हतोत्साहित करती हैं।

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

(def farms [{:name "Swansea", :value 100} 
      {:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]} 
      {:name "Snug", :value 50, :animals [:goats :pigs]}]) 
(reduce + (map :value farms)) 
-> 350 
(reduce + (map :value (filter :animals farms))) 
-> 50 
संबंधित मुद्दे