Clojure संस्कृति है कच्चे डेटा प्रकारों का दृढ़ समर्थन। बस इतना है। लेकिन स्पष्ट प्रकार उपयोगी हो सकते हैं। जब आपके सादे डेटाटाइप पर्याप्त जटिल और विशिष्ट होते हैं, तो आपके पास अनिवार्य रूप से विनिर्देश के बिना एक अंतर्निहित डेटाटाइप होता है।
रचनाकारों पर निर्भर। यह एक ओओपी तरह से थोड़ा गंदा लगता है, लेकिन एक कन्स्ट्रक्टर एक ऐसे फ़ंक्शन से अधिक कुछ नहीं है जो आपके डेटा प्रकार को सुरक्षित और आसानी से बनाता है। सादा डेटा संरचनाओं की कमी यह है कि वे फ्लाई पर डेटा बनाने को प्रोत्साहित करते हैं। तो, कॉल करने के बजाय (myconstructor ...), मैं अपने डेटा को सीधे लिखने का प्रयास करता हूं। और त्रुटि के लिए बहुत अधिक संभावनाओं के साथ-साथ समस्याएं अगर मुझे अंतर्निहित डेटा प्रकार को बदलने की आवश्यकता है।
रिकॉर्ड्स मीठा स्थान हैं। कच्चे डेटा प्रकारों के बारे में सभी झगड़े के साथ, यह भूलना आसान है कि रिकॉर्ड बहुत सी चीजें करते हैं जो मानचित्र कर सकते हैं। उन्हें उसी तरह से पहुंचा जा सकता है। आप उन पर seq कॉल कर सकते हैं। आप उन्हें उसी तरह से नष्ट कर सकते हैं। एक मानचित्र की अपेक्षा रखने वाले कार्यों का विशाल बहुमत भी एक रिकॉर्ड स्वीकार करेगा।
मेटा डेटा आपको सहेज नहीं पाएगा। मेटा डेटा पर भरोसा करने के लिए मेरा मुख्य आपत्ति यह है कि यह समानता में प्रतिबिंबित नहीं होता है।
user> (= (with-meta [1 2 3] {:type :A}) (with-meta [1 2 3] {:type :B}))
true
चाहे कि स्वीकार्य है या है आप पर निर्भर नहीं है, लेकिन मैं इस नए सूक्ष्म कीड़े को शुरू करने के बारे में चिंता होगी।
अन्य dataype विकल्प:
- deftype केवल नए बुनियादी या विशेष उद्देश्य डेटा संरचनाओं बनाने में निम्न स्तर के काम के लिए है। Defrecord के विपरीत, यह इसके साथ सभी क्लोजर भलाई नहीं लाता है। अधिकांश कार्यों के लिए, यह आवश्यक या सलाह नहीं है।
- डिफ्रैक्ट को बहिष्कृत किया जाना चाहिए। जब रिच हिकी ने प्रकार और प्रोटोकॉल पेश किए, तो उन्होंने अनिवार्य रूप से कहा कि defrecord को हमेशा पसंद किया जाना चाहिए।
प्रोटोकॉल बहुत उपयोगी होते हैं, भले ही वे (कार्यों + डेटा) प्रतिमान से एक प्रस्थान का एक सा की तरह लग रहा है। यदि आप खुद को रिकॉर्ड बनाते हैं, तो आपको प्रोटोकॉल को परिभाषित करने पर विचार करना चाहिए।
संपादित: यदि आप वेब प्रोग्रामिंग कर रहे हैं, सादा डेटाटाइप्स करने से और कुशलता से और आसानी से JSON से परिवर्तित किया जा सकता: मैं सादे डेटाटाइप्स कि पहले मेरे लिए स्पष्ट नहीं किया गया था के लिए एक और लाभ की खोज की। (ऐसा करने के लिए पुस्तकालयों में clojure.data.json, clj-json, और मेरे पसंदीदा, चेशर शामिल हैं)। रिकॉर्ड और डेटाटाइप के साथ, कार्य काफी परेशान है।
स्रोत
2011-10-27 18:58:57
ठीक है, इसलिए मुझे 'defrecord' और' defprotocol' को समझने की आवश्यकता है, 'defstruct' को अनदेखा कर सकते हैं, और 'deftype' के बारे में ज्यादा चिंता करने की आवश्यकता नहीं है। क्या यह एक क्लोजर प्रोग्राम के लिए महत्वपूर्ण है, कि 'defrecord' जावा कोड बनाता है - इस अर्थ में कि मैं जावा क्लास रखने की चिंता नहीं करना चाहता, लेकिन अगर क्लोजर एक निजी तौर पर उपयोग करना चाहता है, तो यह ठीक है? महान जवाब, बहुत ही हंसमुख। –
ठीक है, एक सादा नक्शा एक जावा क्लास भी है, जैसा कि आप https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentMap.java –
पर देख सकते हैं तो यह वास्तव में नहीं है एक बड़ा सौदा है कि defrecord एक जावा वर्ग बनाता है। रिकॉर्ड का उपयोग करके हमारे दृष्टिकोण से, इससे कोई फर्क नहीं पड़ता - निर्माण के अलावा, यह पूरी तरह से क्लोजर डेटा की तरह महसूस करेगा। –