क्या ActiveRecord पैटर्न SOLID डिजाइन सिद्धांतों का पालन / प्रोत्साहन करता है?


43

मुझे दिलचस्पी है कि क्या ActiveRecord पैटर्न, रूबी ऑन रेल्स से प्रसिद्ध हुआ, SOLID डिजाइन सिद्धांतों के उपयोग को प्रोत्साहित या हतोत्साहित करता है ।

उदाहरण के लिए, मुझे ऐसा लगता है कि ActiveRecord ऑब्जेक्ट में डोमेन लॉजिक और दृढ़ता तर्क दोनों होते हैं, जो कि सिंगल रिस्पॉन्सिबिलिटी का उल्लंघन है।


6
जिम वेइरिच, 2009 के रूबी सम्मेलन में अपनी ठोस रूबी टॉक के अंत में , दर्शकों से पूछते हैं: "ActiveRecord ऑब्जेक्ट एक डोमेन अवधारणा और एक दृढ़ता अवधारणा को लागू करते हैं। क्या यह SRP (एकल जिम्मेदारी सिद्धांत) का उल्लंघन करता है?" दर्शक सहमत हैं कि यह एसआरपी का उल्लंघन करता है। जिम पूछता है कि क्या यह उन्हें परेशान करता है। दर्शकों के कई सदस्य हां कहते हैं। क्यों? यह कठिन परीक्षण करता है। यह दृढ़ता वस्तु को बहुत अधिक भारी बना देता है।
डेविड जे।

जवाबों:


56

ActiveRecord पर कुछ मान्य आलोचना है। हमेशा की तरह, अंकल बॉब ने इसे पूरी तरह से गाया :

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

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

विकिपीडिया ने आलोचना को एक चिंता का विषय बताया :

ओओपी में एन्कैप्सुलेशन की अवधारणा अक्सर चिंताओं के पृथक्करण की अवधारणा के साथ है। सामान्यतया, पैटर्न जो चिंताओं को अलग करने के पक्ष में होते हैं, वे अलग-अलग यूनिट परीक्षणों के लिए अधिक उपयुक्त होते हैं जबकि पैटर्न जो पक्ष एनकैप्सुलेशन से एपीआई का उपयोग करना आसान होता है। सक्रिय रिकॉर्ड बहुत हद तक उस बिंदु पर एनकैप्सुलेशन का पक्षधर है जहां डेटाबेस के बिना परीक्षण करना काफी कठिन है।

विशेष रूप से रूबी ऑन रेल्स कार्यान्वयन के लिए, गेविन किंग लिखते हैं (जोर मेरा):

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

रूबों पर रेल के कार्यान्वयन पर भी, जॉन जानुसज़ाक लिखते हैं (जोर मेरा):

समस्या # 1: स्टेटिक विधि

...

कुछ लोग स्टैटिक विधियों का उपयोग करके प्रक्रियात्मक प्रोग्रामिंग के लिए राशियाँ कहेंगे, और इसलिए खराब ऑब्जेक्ट ओरिएंटेड डिज़ाइन है। दूसरों का कहना है कि स्थैतिक तरीके परीक्षण क्षमता के लिए मौत हैं।

समस्या # 2: वैश्विक संकेतन सेटिंग

...

इसलिए मेरे उदाहरण में खाता वर्ग पर और खाते के विस्तार पर कोई निर्भरता इंजेक्शन नहीं है । जैसा कि हम सभी को अभी तक पता होना चाहिए, चीजों की तलाश बहुत खराब है!

ActiveRecord और ORM को आमतौर पर एंटी-पैटर्न क्यों माना जाता है, इस पर कुछ और संसाधन:

ActiveRecord हमेशा एक अत्यंत उपयोगी विरोधी-पैटर्न की तरह महसूस करता था , लेकिन मैं इस बात से सहमत हूं कि यह SRP और अतिरिक्तता के खिलाफ जाता है और यह निर्भरता व्युत्क्रम सिद्धांत के खिलाफ जाता है।


रेल के लिए महत्वपूर्ण अपडेट 5+: "और मेरी आईडीई उन्हें कैसे ऑटो कर सकती है? निश्चित रूप से, रेल के लोगों के पास इस सवाल का एक त्वरित उत्तर है ओह, बस अपने डेटाबेस क्लाइंट को फायर करें और डेटाबेस में देखें!" मान्य नहीं है अब और। API की विशेषताओं के साथ आप सभी उपलब्ध स्तंभों को मॉडल पर परिभाषित कर सकते हैं
Filip Bartuzi

6

(मैं मान रहा हूँ कि ActiveRecord वर्ग निर्भरता इंजेक्शन के लिए किसी भी संभावना के बिना लागू किया गया है)।

व्यक्तिगत अनुभव से मैं कह सकता हूं कि ActiveRecord पैटर्न इकाई परीक्षण लिखने के लिए एक बड़ी बाधा बन जाता है। एकल "ActiveRecord वर्ग" में दृढ़ता परत और व्यावसायिक तर्क का युग्मन इकाई परीक्षण लिखना असंभव बनाता है (जब तक कि आप पहले रिफ्लेक्टर नहीं करते)। इसलिए, एकमात्र विकल्प एकीकरण परीक्षण लिख रहा है; और यह इकाई-परीक्षणों की तरह प्रभावी नहीं है। यह एक प्रमुख मुद्दा बन जाता है, खासकर यदि आप बहुत सारे ActiveRecord वर्गों के साथ एक प्रोजेक्ट लेते हैं; यह उच्च जटिल एकीकरण परीक्षणों की पैदावार करता है जिन्हें बनाए रखना कठिन होता है।

इसलिए, ActiveRecord SRP के विरुद्ध बहुत अधिक आता है और कुछ रखरखाव सिरदर्द बनाता है; यह यूनिट-परीक्षण लिखने की शक्ति को दूर ले जाने लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.