2009-07-24 15 views
5

तो मैं इस बारे में बस उत्सुक हूँ: एक ओर जहां सक्रिय रिकॉर्ड विरासतडेटामैपर मिश्रित बनाम विरासत का उपयोग क्यों करता है?

class Post < ActiveRecord::Base 

का उपयोग करता है किसी को पता है कि क्यों DataMapper करने के लिए चुना है

DataMapper अपने मॉडल

class Post 
    include DataMapper::Resource 

के लिए एक mixin का उपयोग करता है इस तरह से (या क्यों एआर ने नहीं चुना)?

उत्तर

3

मुझे लगता है कि विचार यह है कि ActiveRecord डेटाबेस समर्थित बैक पहलू को मॉडल वर्ग की मुख्य विशेषता मानता है ताकि यह उस व्यवहार को प्राप्त कर सके। डेटामैपर ऐसा लगता है कि यह कक्षा के एक पहलू होने के लिए बैकग्राउंड डेटाबेस का समर्थन करता है जिसे कक्षा में जोड़ा जा सकता है।

यह मेरा अनुमान है। येहुदा काट्ज़ आपको निश्चित रूप से बता सकता है।

+0

मैंने सोचा कि यह पूरी तरह से 'दार्शनिक' कारण हो सकता है - चलिए देखते हैं कि अन्य लोग क्या कहते हैं। – cloudhead

5

यह आपको एक अन्य वर्ग से प्राप्त करने देता है जो डीएम वर्ग नहीं है।

यह डीएम सुविधाओं को फ्लाई पर कक्षा में जोड़ने की भी अनुमति देता है।

def datamapper_class 
    klass = self.dup 
    klass.send(:include, DataMapper::Resource) 
    klass.storage_names[:default] = @table_name 
    klass.property(:id, DataMapper::Types::Serial) 
    klass.property(:created_at, DateTime, :nullable => false) 
    klass.property(:updated_at, DateTime, :nullable => false) 
    columns_with_types { |n, t| klass.property(n, t, :field => n.to_s) } 
    klass 
end 

यह मैं एक SAXMachine वर्ग (बहुत हल्के) लेने के लिए और यह तुरंत एक Datamapper वर्ग में बदल जाते हैं, और इसके साथ DataMappery सामान करने देता है: यहाँ एक मॉड्यूल से एक वर्ग विधि मैं पर काम कर रहा हूँ अभी है । आप इसे ऑब्जेक्ट की सिंगलटन कक्षा में भी कर सकते हैं।

मैं कल्पना है कि यह मेरी स्मृति पदचिह्न जब मैं XML से 100K वस्तुओं का आयात कर रहा हूँ (मैं बड़े पैमाने पर आयात के लिए डीएम का उपयोग नहीं करते) को कम करता है, और केवल और अधिक जटिल डेटाबेस कार्यों में मिश्रण जब मैं उन्हें जरूरत

चाहते
+0

दिलचस्प, मैंने इसके बारे में सोचा नहीं था। – cloudhead

0

यह वास्तव में विरासत बनाम चुनने का सवाल है रचना।

मैं व्यक्तिगत रूप से रचना का पक्ष लेता हूं क्योंकि यह कक्षाओं और वस्तुओं के निर्माण का एक और प्राकृतिक तरीका प्रतीत होता है।

संरचना आपको अपने वर्ग में कौन से व्यवहार शामिल करना चाहते हैं, इस पर अधिक नियंत्रण प्रदान करती है। विरासत के लिए आप या तो सबकुछ या कुछ भी नहीं मिलता है। संरचना आपको चेरी को अपने इच्छित व्यवहार चुनने की अनुमति देती है।

+1

मिक्सिन के पास रचना के साथ कुछ लेना देना नहीं है। विरासत की तरह, एक मिक्सिन एक सब कुछ या कुछ भी प्रस्ताव नहीं है। और संरचना के विपरीत, आप ऑब्जेक्ट को रन टाइम पर मिश्रित नहीं कर सकते हैं। – KaptajnKold

4

डेटामैपर पैटर्न एक परत प्रदान करने का इरादा है जो डोमेन ऑब्जेक्ट मॉडल को स्कीमा से अलग करने की अनुमति देता है। ActiveRecord ऑब्जेक्ट मॉडल और संबंधपरक डेटाबेस संरचना को एकीकृत करता है।

Martin Fowler प्रति:

वस्तुओं और रिलेशनल डेटाबेस संरचना डेटा के लिए अलग तंत्र है। किसी ऑब्जेक्ट के कई हिस्सों, जैसे संग्रह और विरासत, संबंधपरक डेटाबेस में मौजूद नहीं हैं। जब आप बहुत से व्यवसाय तर्क के साथ एक ऑब्जेक्ट मॉडल बनाते हैं तो डेटा और उसके साथ चलने वाले व्यवहार को व्यवस्थित करने के लिए इन तंत्रों का उपयोग करना महत्वपूर्ण है। ऐसा करने से वेरिएंट स्कीमा की ओर जाता है; यानी, ऑब्जेक्ट स्कीमा और रिलेशनल स्कीमा मेल नहीं खाते हैं।

आपको अभी भी दो स्कीमा के बीच डेटा स्थानांतरित करने की आवश्यकता है, और यह डेटा स्थानांतरण अपने आप में एक जटिलता बन जाता है। यदि इन-मेमोरी ऑब्जेक्ट्स रिलेशनल डेटाबेस स्ट्रक्चर के बारे में जानती हैं, तो एक में परिवर्तन दूसरे के लिए लहर होते हैं।

डेटा मैपर सॉफ़्टवेयर की एक परत है जो इन-मेमोरी ऑब्जेक्ट को डेटाबेस से अलग करता है। इसकी ज़िम्मेदारी दो के बीच डेटा स्थानांतरित करना और उन्हें एक-दूसरे से अलग करना है। डेटा मैपर के साथ इन-मेमोरी ऑब्जेक्ट्स को यह भी पता नहीं होना चाहिए कि डेटाबेस मौजूद है; उन्हें कोई एसक्यूएल इंटरफ़ेस कोड की आवश्यकता नहीं है, और निश्चित रूप से डेटाबेस स्कीमा का कोई ज्ञान नहीं है। (डेटाबेस स्कीमा हमेशा उपयोग करने वाली वस्तुओं से अनजान है।) चूंकि यह मैपर (473) का एक रूप है, इसलिए डेटा मैपर डोमेन परत के लिए भी अज्ञात है।

0

ActiveRecord वास्तव में विरासत का उपयोग नहीं करना चाहिए, बल्कि एक मॉडल/कक्षा में व्यवहार (अधिकतर दृढ़ता) जोड़ने के लिए एक मॉड्यूल शामिल करना चाहिए। ActiveRecord बस गलत प्रतिमान का उपयोग कर रहा है!

इसी कारण से, मुझे मोंगोएड पर मोंगोएड की तरह बहुत पसंद है, क्योंकि यह डेवलपर को समस्या डोमेन में सार्थक कुछ मॉडलिंग के तरीके के रूप में विरासत का उपयोग करने का मौका देता है।

यह दुख की बात है कि रेल समुदाय में बहुत ज्यादा कोई भी "रूबी विरासत" का उपयोग नहीं कर रहा है जिस तरह से इसका उपयोग किया जाना चाहिए - क्लास पदानुक्रमों को परिभाषित करने के लिए, केवल व्यवहार जोड़ने के लिए नहीं।

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