मोटी मॉडल और पतली नियंत्रक भगवान मॉडल बनाने की तरह लगता है [बंद]


91

मैं बहुत सारे ब्लॉग पढ़ रहा हूं जो वसा मॉडल और पतला नियंत्रकों दृष्टिकोण, esp की वकालत करते हैं । रेल शिविर। नतीजतन, राउटर मूल रूप से सिर्फ यह पता लगा रहा है कि किस नियंत्रक और सभी नियंत्रक पद्धति पर कॉल करने की विधि मॉडल पर संबंधित विधि को कॉल करती है और फिर दृश्य लाती है। इसलिए मुझे यहाँ दो चिंताएँ हैं जो मुझे समझ में नहीं आती हैं:

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

आपने पंक्ति को कहां खींचा था? क्या यह सिर्फ ईश्वर की परिपाटी में नहीं है?

जवाबों:


136

RVC को MVC डिज़ाइन पैटर्न के मूल रूप में देखना सबसे अच्छा विचार नहीं हो सकता है। कहा फ्रेमवर्क कुछ अंतर्निहित कमियों के साथ बनाया गया था (मैं एक अलग पोस्ट में इस पर विस्तृत रूप से विस्तार किया गया है ) और समुदाय ने अब केवल नतीजों को संबोधित करना शुरू कर दिया है। आप पहले प्रमुख कदम के रूप में DataMapper2 विकास को देख सकते हैं ।

कुछ सिद्धांत

उस सलाह को देने वाले लोग काफी आम गलत धारणा से पीड़ित हैं। तो मुझे इसे साफ करने से शुरू करें: मॉडल, आधुनिक एमवीसी डिजाइन पैटर्न में, एक वर्ग या वस्तु नहीं है। मॉडल एक परत है।

एमवीसी पैटर्न के पीछे मूल विचार सेपरेशन ऑफ कंसर्न है और इसमें पहला कदम प्रेजेंटेशन लेयर और मॉडल लेयर्स के बीच का विभाजन है। जैसे प्रस्तुति परत नियंत्रकों (उदाहरणों, उपयोगकर्ता इनपुट से निपटने के लिए जिम्मेदार), विचार (उदाहरण, UI तर्क के लिए जिम्मेदार) और टेम्पलेट्स / लेआउट में टूट जाती है, वैसे ही मॉडल परत भी करती है।

मॉडल परत के प्रमुख भाग निम्न हैं:

  • डोमेन ऑब्जेक्ट

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

  • संग्रहण सार:

    आमतौर पर डेटा मैपर पैटर्न का उपयोग करके लागू किया जाता है ( ORMs के साथ भ्रमित न करें , जिन्होंने इस नाम का दुरुपयोग किया है)। इन उदाहरणों को आमतौर पर सूचना संग्रहण से और डोमेन ऑब्जेक्ट में पुनर्प्राप्ति-के साथ सौंपा जाता है। प्रत्येक डोमेन ऑब्जेक्ट में कई मैपर्स हो सकते हैं, जैसे स्टोरेज (डीबी, कैश, सेशन, कुकीज, / देव / मल) के कई रूप हैं।

  • सेवाएं:

    एप्लिकेशन लॉजिक के लिए जिम्मेदार संरचनाएं (यानी, डोमेन ऑब्जेक्ट्स के बीच इंटरैक्शन और डोमेन ऑब्जेक्ट्स और स्टोरेज एब्स्ट्रक्शन के बीच इंटरेक्शन)। उन्हें "इंटरफ़ेस" की तरह कार्य करना चाहिए जिसके माध्यम से प्रस्तुति परत मॉडल परत के साथ बातचीत करती है। यह आमतौर पर क्या होता है रेल-जैसे कोड नियंत्रकों में समाप्त होता है।

कई संरचनाएं भी हैं जो इन समूहों के बीच रिक्त स्थान में हो सकती हैं: डीएओ , काम की इकाइयां और रिपॉजिटरी

ओह ... और जब हम MVC एप्लिकेशन के साथ सहभागिता करने वाले उपयोगकर्ता के बारे में (वेब ​​के संदर्भ में) बात करते हैं , तो यह एक इंसान नहीं है। "उपयोगकर्ता" वास्तव में आपका वेब ब्राउज़र है।

तो देवताओं के बारे में क्या?

साथ काम करने के लिए कुछ डरावना और अखंड मॉडल होने के बजाय, नियंत्रकों को सेवाओं के साथ बातचीत करनी चाहिए। आप किसी विशिष्ट सेवा (उदाहरण के लिए करने के लिए उपयोगकर्ता इनपुट से डेटा पास MailServiceया RecognitionService)। इस तरह से नियंत्रक मॉडल परत की स्थिति को बदल देता है, लेकिन यह एक स्पष्ट एपीआई का उपयोग करके और आंतरिक संरचनाओं के साथ खिलवाड़ किए बिना किया जाता है (जो एक टपका हुआ अमूर्त का कारण होगा)।

इस तरह के परिवर्तन या तो कुछ तत्काल प्रतिक्रिया का कारण बन सकते हैं, या केवल उस डेटा को प्रभावित कर सकते हैं जो दृश्य परत मॉडल परत, या दोनों से अनुरोध करता है।

प्रत्येक सेवा डोमेन ऑब्जेक्ट और स्टोरेज एब्स्ट्रक्शन के किसी भी नंबर (हालांकि, यह आमतौर पर केवल एक मुट्ठी भर) के साथ बातचीत कर सकती है। उदाहरण के लिए, RecogitionServiceलेखों के लिए भंडारण सार के बारे में कम परवाह नहीं कर सकता।

नोट बंद करना

इस तरह से आपको एक आवेदन मिलता है जो किसी भी स्तर पर इकाई-परीक्षण किया जा सकता है, इसमें कम युग्मन (यदि सही ढंग से लागू किया गया है) और स्पष्ट रूप से समझने योग्य वास्तुकला है।

हालांकि, ध्यान रखें: MVC छोटे अनुप्रयोगों के लिए नहीं है। यदि आप MVC पैटर्न का उपयोग करते हुए एक गेस्टबुक पेज लिख रहे हैं, तो आप इसे गलत कर रहे हैं। यह पैटर्न बड़े पैमाने पर अनुप्रयोगों के लिए कानून और व्यवस्था को लागू करने के लिए है ।

जो लोग PHP को प्राथमिक भाषा के रूप में उपयोग कर रहे हैं, उनके लिए यह पोस्ट प्रासंगिक हो सकती है। यह कोड के कुछ स्निपेट्स के साथ मॉडल परत का थोड़ा लंबा वर्णन है।


बहुत उपयोगी और पूरा जवाब! क्या आप किसी भी किताब को जानते हैं जो एमवीसी वास्तुशिल्प पैटर्न को थोड़ा और समझाती है? पूरी तरह से मॉडल भाग पर, जो हर कोई गलती से सोचता है "मॉडल डेटा का प्रतिनिधित्व करता है, और कुछ नहीं करता है।" और जो डोमेन ऑब्जेक्ट के विचार की तरह लगता है, 'मॉडल' नहीं -> tomdalling.com/blog/software-design/…
thermz

1
@thermz, afaik , वास्तव में ऐसी कोई किताबें नहीं हैं जो विशेष रूप से MVC पैटर्न के साथ काम करती हैं। मैं आमतौर पर लोगों को PoEAA पढ़ने के लिए कहता हूं , और फिर खुदाई करता हूं । हो सकता है कि लिंक की यह सूची उपयोगी हो। मुझे लगता है कि, जब लोगों के पास ओओपी सिद्धांतों और अवधारणाओं पर एक ठोस पकड़ होती है, तो पैटर्न को समझना काफी आसान हो जाता है।
तेरेको

@ tereško सुंदर जवाब। क्या हाइबरनेट इसे प्राप्त करता है? मैं यहाँ के जवाबों से आश्वस्त नहीं हूँ -> stackoverflow.com/questions/1308096/…
अंकन-ज़ेरोब

@ अंकन-ज़ेरोब जैसा कि आप देख सकते हैं, मैं एक जावा डेवलपर नहीं हूं, लेकिन हाइबरनेट के बारे में जो मुझे पता है, वह दृढ़ता परत के लिए एक पूर्ण टूलसेट प्रदान करता है। यह तुम क्या देखते वर्णित का हिस्सा दे देंगे, लेकिन नहीं एक पूरा मॉडल परत।
tereško

3
@ जॉनी जहाँ तक मैं नहीं जानता। Php के अधिकांश तथाकथित "mvc चौखटे" रेल के रूपांतर हैं। और, पाठ्यक्रम के हिस्से के रूप में, उनमें से अधिकांश कुछ सक्रिय रिकॉर्ड आधारित ओआरएम समाधानों के साथ आते हैं (वे चीजें डीबी के लिए कुख्यात हैं)। आप SF2.x या ZF2.x के साथ कुछ इस तरह से लागू कर सकते हैं , लेकिन एक रूपरेखा का बिंदु किसी विशिष्ट वास्तुकला को लागू करना / लागू करना नहीं है, बल्कि उपकरण प्रदान करना है। इसके अलावा, जब यह एमवीसी की बात आती है, तो इसे एप्लीकेशन कोड द्वारा लागू किया जाता है, न कि फ्रेमवर्क द्वारा।
tereško 14

5

यदि "मॉडल" कक्षाएं खराब तरीके से लागू की जाती हैं, तो आपकी चिंता प्रासंगिक है। एक मॉडल वर्ग को ईमेल (बुनियादी ढांचा कार्य) नहीं करना चाहिए।

असली सवाल यह है कि MVC में मॉडल का क्या मतलब है। यह कुछ विधियों के साथ POCO वर्गों तक सीमित नहीं है। एमवीसी में मॉडल का मतलब डेटा और बिजनेस लॉजिक है। इसे क्लासिक कोर POCO मॉडल के सुपरसेट के रूप में समझें।

दृश्य ==== नियंत्रक ==== मॉडल ---> व्यवसाय प्रक्रिया परत -> कोर मॉडल

इन्फ्रास्ट्रक्चर असेंबली और डेटा एक्सेस लेयर्स में फेंक दें और इंजेक्शन का उपयोग करके बीपीएल में डाल दें, फिर आपकी प्रक्रिया एमवीसी का उपयोग कर रही है।

बीपीएल यूओडब्ल्यू / रिसपोजिटरी पैटर्न को लागू कर सकता है, और व्यापार नियमों को निष्पादित कर सकता है और इंजेक्शन वाली वस्तुओं या इंटरफ़ेस पेटेंट के माध्यम से इन्फ्रास्ट्रक्चर सुविधाओं को कॉल कर सकता है।

तो एक नियंत्रक स्कीनी doesn't को क्लासिक कोर मॉडल में "व्यक्ति" वर्ग रखने की सिफारिश में 50 विधियां होनी चाहिए, और सीधे ईमेल को कॉल करना चाहिए। आपको यह सोचना सही है कि यह गलत है।

नियंत्रक को अभी भी इन्फ़्रास्ट्रक्चर कक्षाओं को तुरंत BPL या कोर लेयर में इंजेक्ट करने की आवश्यकता हो सकती है यदि सीधे कहा जाता है। क्लासिक ऑब्जेक्ट मॉडल कक्षाओं में एक व्यावसायिक परत या कम से कम कक्षाएं ऑर्केस्ट्रेटिंग कॉल होनी चाहिए। वैसे भी मेरे "दृश्य";;

एमवीसी पर सामान्य विवरण के लिए विकी विवरण http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

एक छोटा सा ब्लॉग जो एमवीसी में "एम" के बारे में बात करता है। http://www.thedeveloperday.com/skinny-controllers/


1
यदि आप कम से कम अपने दृष्टिकोण को सही ठहराने के लिए पर्याप्त विनम्र हैं
दीन सोई

-1

मुझे लगता है कि आप एकल वसा मॉडल (संभवतः ऐप या एप्लिकेशन नाम) के बीच अंतर कर सकते हैं, और कई वसा मॉडल तार्किक समूहों (व्यापार, ग्राहक, आदेश, संदेश) में टूट गए हैं। बाद का तरीका यह है कि मैं अपने ऐप्स को कैसे संरचना करता हूं, और प्रत्येक मॉडल मोटे तौर पर एक डेटाबेस तालिका में एक संबंधपरक डेटाबेस या एक संग्रह डेटाबेस में संग्रह से मेल खाता है। ये मॉडल मॉडल को बनाने वाले डेटा को बनाने, अपडेट करने, और हेरफेर करने के सभी पहलुओं को संभालते हैं, चाहे वह डेटाबेस से बात कर रहा हो या एक एपीआई कॉल कर रहा हो। नियंत्रक बहुत कम के लिए जिम्मेदार है, जो कि उचित मॉडल को बुलाता है और एक टेम्पलेट का चयन करता है।

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