13

एएसपी.NET एमवीसी के साथ काम करने के बाद, यह मुझे रेल के बारे में सोच रहा है। मैंने पहले रेल के साथ काम किया, लेकिन थोड़ा जंगली हूँ। ASP.Net एमवीसी ट्यूटोरियल रिपोजिटरी पैटर्न के साथ डेटा लेयर कार्यान्वयन छिपाने की पुनर्मूल्यांकन। यह यूनिट परीक्षण के लिए easiesr निर्भरता इंजेक्शन, और मॉडल कार्यान्वयन से नियंत्रक के अच्छे decoupling की अनुमति देता है।रिपोजिटरी पैटर्न के साथ रेल पर रूबी?

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

तो मेरे सवाल है, क्या नवीनतम सबसे अच्छा अभ्यास यहाँ है? वास्तविक (मजाक नहीं) डेटाबेस अभी भी यूनिट परीक्षण के लिए उपयोग किए जाते हैं? क्या रेल डेवलपर सीधे ActiveRecord को कॉल करते हैं, या एक अमूर्तता?

उत्तर

7

ActiveRecord भी वास्तव में "डेटा परत" का गठन करता है, मुझे आश्चर्य है? आखिरकार, इसका उद्देश्य अमूर्त (काफी उचित सीमा तक) वास्तविक बातचीत भंडारण है। अगर मेरे पास एक मॉडल है जो ActiveRecord::Base से प्राप्त होता है और मैं उस मॉडल को नियंत्रक में संदर्भित करता हूं, तो क्या मैं वास्तव में डेटा परत से बातचीत कर रहा हूं?

Repository Pattern का एक संक्षिप्त विवरण को देखते हुए मैं कहना चाहता हूँ कि find_by_ के तरीकों पहले से ही आप यह क्या वर्णन करता है की ज्यादा है, जो अच्छा है, दे रहे हैं ना? ठीक है, अबास्ट्रक्शन लेयर लीकी है (एक अधिक उदारता से "व्यावहारिक" कह सकता है) यदि आवश्यकता हो तो हम धातु के बहुत करीब जा सकते हैं, और find_by_sql उदाहरण के लिए यह बहुत स्पष्ट होगा कि हम एक संबंध से निपट रहे हैं किसी प्रकार का डेटाबेस।

मैं कभी भी सिफारिश नहीं करता (या शायद मुझे शायद ही कभी और अत्यधिक औपचारिकता के बिना नहीं कहना चाहिए "- यह निरंतर उपयोग करके हमेशा मुश्किल होता है) नियंत्रकों में कोड डालने से डेटा प्लेटफ़ॉर्म का उपयोग करना संभव हो जाता है। इसे सभी मॉडलों में धकेल दिया जाना चाहिए - named_scope यहां बहुत उपयोगी हो सकता है। जटिल परिणामों के लिए, इंटरफ़ेस के रूप में "प्रस्तुति" ऑब्जेक्ट्स का उपयोग करने पर विचार करें (Struct और मेरा व्यक्तिगत पसंदीदा OpenStruct यहां बहुत उपयोगी हो सकता है)।

जबकि ActiveRecord डी वास्तविक मानक है, यह देखते हुए कि यह रेल के साथ स्थापित है, यह शहर में एकमात्र गेम नहीं है। गैर SQL डेटाबेस के लिए, कुछ अलग करने के लिए आवश्यक है, लेकिन फिर भी एसक्यूएल डोमेन वहाँ Datamapper (eponymous PoEAA pattern पर आधारित है कि?)

रेल 3.0 में यह इस तरह के रूप में Yehuda ORM के रूप में एक बहुत pick and choose components के लिए आसान होने जा रहा है और लड़के इंटरफेस को अनपिक और साफ करते हैं।

+0

हाँ 1000x यह डेटा परत का गठन करता है। यह विक्रेता-विशिष्ट एसक्यूएल तारों का उपयोग करने के रूप में काफी कसकर नहीं है, लेकिन अधिकांश भाग के लिए एआर कक्षाएं डेटाबेस तालिकाओं के साथ 1 से 1 मानचित्र बनाती हैं। यह (और यह आमतौर पर रेलों के बारे में सच है) प्रोग्रामिंग की एक शैली को प्रोत्साहित करता है जिसमें व्यापार वस्तुओं और डीबी टेबल के बीच कोई अंतर नहीं होता है। आरपी विशेष रूप से इस भेद को बनाने के लिए डिज़ाइन किया गया है। – Jonah

9

मेरा अनुभव रहा है कि रूबी ऑन रेल्स ActiveRecord इतना कसकर एकीकृत (ज्यादातर मामलों में, यह लगभग पूरी तरह से पारदर्शी बन सकता है) कि डेवलपर्स अक्सर किसी भी अमूर्त के बिना इसका इस्तेमाल।

याद रखने की बात यह है कि रिपोजिटरी पैटर्न और सक्रिय रिकॉर्ड पैटर्न दोनों को Patterns of Enterprise Architecture by Martin Fowler में सुझाया गया था (जो, यदि आपने इसे अभी तक नहीं पढ़ा है ... आपको चाहिए)। सक्रिय रिकॉर्ड रेल में कड़ाई से एकीकृत है। माइक्रोसॉफ्ट .NET आपको एक पैटर्न से जोड़ता नहीं है ... इसलिए अधिकांश डेवलपर्स द्वारा रिपोजिटरी पैटर्न अपनाया गया था।

+0

मैं हमेशा सोचता हूं कि ActiveRecord नहीं चाहते हैं, इसका मतलब है कि रेल मेरे लिए उपकरण नहीं है। – SystematicFrank

+0

@ सिस्टममैटिक फ्रैंक क्या आपका मतलब ActiveRecord, रूबी मणि या ActiveRecord, पैटर्न है। अधिकांश ढांचे में ActiveRecord शिपिंग है और उनमें कसकर एकीकृत किया गया है। – iGbanam

0

रेल सम्मेलनों folllowing हमेशा कम से कम दर्दनाक यादें का मार्ग नीचे की ओर जाता है, तो यह सलाह दी जाती है।

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

रेल डेवलपर्स, इस डेटा के सीधे ActiveRecord फोन असली दुनिया में के रूप में।

0

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

+0

रेल एमवीसी नहीं है, रेल मॉडल 2 है। – siefca

+0

"मॉडल 2 एक जटिल डिजाइन पैटर्न है जो ** जावा ** वेब अनुप्रयोगों के डिजाइन में उपयोग किया जाता है जो सामग्री को प्राप्त करने और कुशलतापूर्वक उपयोग करने के लिए उपयोग किए गए तर्क से सामग्री का प्रदर्शन अलग करता है।" http://en.wikipedia.org/wiki/Model_2 –

+0

आरओआर एमवीसी की तुलना में मॉडल 2 के करीब है। – siefca

2

आप इसे किसी भी तरह से कर सकते हैं। अक्सर, रेल के कार्यात्मक परीक्षण डेटाबेस के सभी तरह से जाने के लिए लिखे जाते हैं, जहां वर्णन करते समय डेटा फिक्स्चर से पॉप्युलेट किया जाता है।

लेकिन यह सेवा परत कॉल बाहर उपहास करने के लिए, उदाहरण के लिए असामान्य बात नहीं है:

User.expects(:find_by_id).with("1").returns(u); 
get :show, :id=>"1" 

... या ऐसा ही कुछ। असल में, मैं हर समय मॉडल ऑब्जेक्ट का नियंत्रण करता हूं (या उस पर नकली भी)।

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