मॉडल, व्यू, कंट्रोलर और हेल्पर: क्या जाता है?


155

रूबी ऑन रेल डेवलपमेंट (या सामान्य रूप से एमवीसी) में, मुझे तर्क देने के लिए किस त्वरित नियम का पालन करना चाहिए।

कृपया जवाब दें - क्या आप इसे यहां नहीं डालते हैं , इसके बजाय इसे यहां रखें

जवाबों:


173

MVC

नियंत्रक : यहां वह कोड डालें जो उपयोगकर्ता को चाहिए, और यह तय करने के लिए कि उन्हें क्या देना है, क्या वे लॉग इन हैं, क्या उन्हें कुछ डेटा देखना चाहिए, आदि के साथ काम करना है। अंत में, नियंत्रक अनुरोधों को देखता है। और क्या डेटा (मॉडल) दिखाने के लिए और क्या दृश्य प्रस्तुत करने के लिए काम करता है। यदि आपको संदेह है कि क्या कोड नियंत्रक में जाना चाहिए, तो यह संभवतः नहीं होना चाहिए। अपने नियंत्रकों को पतला रखें ।

दृश्य : दृश्य में केवल आपके डेटा (मॉडल) को प्रदर्शित करने के लिए न्यूनतम कोड होना चाहिए, यह बहुत सारे प्रसंस्करण या गणना नहीं करना चाहिए, यह मॉडल द्वारा गणना की गई डेटा (या संक्षेप) प्रदर्शित करना चाहिए, या नियंत्रक से उत्पन्न होना चाहिए। यदि आपके दृश्य को वास्तव में प्रसंस्करण करने की आवश्यकता है जो मॉडल या नियंत्रक द्वारा नहीं किया जा सकता है, तो कोड को एक हेल्पर में डालें। एक दृश्य में बहुत सारे रूबी कोड पन्नों को पढ़ने में कठिन बनाते हैं।

मॉडल : आपका मॉडल ऐसा होना चाहिए जहां आपका सारा कोड आपके डेटा से संबंधित हो (ऐसी संस्थाएं जो आपकी साइट बनाती हैं जैसे उपयोगकर्ता, पोस्ट, अकाउंट, मित्र आदि) रहती हैं। यदि कोड को आपकी संस्थाओं से संबंधित डेटा को सहेजना, अपडेट या सारांशित करना है, तो इसे यहां रखें। यह आपके दृश्य और नियंत्रकों में पुन: प्रयोग करने योग्य होगा।


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

@AdamDonahue मुझे यकीन नहीं है कि वसा कुछ भी एक अच्छी चीज के रूप में देखा जा सकता है। सेवाओं में जिम्मेदारियों के टन बेहतर हैं।
फतुहोकू 11

35

पॉलिफ़ोनिक के उत्तर में जोड़ने के लिए:

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


वास्तव में हम हेल्पर में साइन_इन विधि भी नहीं डालते हैं? जैसा कि RoR ट्यूटोरियल ने यहां सुझाव दिया >>> ruby.railstutorial.org/book/…
इवान वांग

14

MVC पैटर्न वास्तव में केवल UI से संबंधित है और कुछ नहीं। आपको नियंत्रक में कोई जटिल व्यावसायिक तर्क नहीं रखना चाहिए क्योंकि यह दृश्य को नियंत्रित करता है लेकिन तर्क को नहीं। नियंत्रक को उचित दृश्य का चयन करने और डोमेन मॉडल (मॉडल) या व्यावसायिक परत को अधिक जटिल सामान सौंपने के साथ ही चिंता करनी चाहिए।

डोमेन ड्रिवेन डिज़ाइन में सेवाओं की एक अवधारणा है जो एक ऐसी जगह है जहाँ आप तर्क छड़ी करते हैं जिसे कई प्रकार की विभिन्न वस्तुओं को ऑर्केस्ट्रेट करने की आवश्यकता होती है जिसका आम तौर पर तर्क होता है जो स्वाभाविक रूप से मॉडल वर्ग पर नहीं होता है।

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

ध्यान दें कि मैं रेल के बारे में बात नहीं कर रहा हूँ यहाँ मैं एक सामान्य स्थापत्य शैली के बारे में बात कर रहा हूँ जो आपकी विशेष समस्या का समाधान करती है।


यह एक महान जवाब है :)
कार्लोस मार्टिनेज

12

यहाँ पहले से ही सही व्याख्या, निष्कर्ष के रूप में एक बहुत ही सरल वाक्य और याद रखना आसान है:

हमें स्मार्ट मॉडल्स, THIN कंट्रोलर्स और DUMB व्यूज की जरूरत है।

http://c2.com/cgi/wiki?ModelViewController



7

कंट्रोलर / एक्सेस कंट्रोल से संबंधित सामान कंट्रोलर में रखें।

मॉडल आपके डेटा के बारे में हैं। मान्यता, संबंध, CRUD, व्यापार तर्क

दृश्य आपके डेटा को दिखाने के बारे में हैं। केवल इनपुट और प्रदर्शन करें।

नियंत्रक आपके मॉडल से आपके दृश्य में (और कौन सा दृश्य) और आपके दृश्य से आपके मॉडल पर जाने वाले डेटा को नियंत्रित करने के बारे में हैं। नियंत्रक बिना मॉडल के भी मौजूद हो सकते हैं।

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

इसी तरह अगर आप टेलर (दृश्य) को कुछ बताना चाहते हैं, तो मोटे तौर पर ऐसा ही होता है सिवाय दूसरे टेलर के आपको बताएगा कि क्या प्रबंधक ने आपकी जानकारी को स्वीकार किया है। यह भी संभव है कि सिक्योरिटी गार्ड / रिसेप्शनिस्ट (कंट्रोलर) ने आपको जानकारी देने के लिए कहा हो क्योंकि आप मैनेजर को उस जानकारी को बताने के लिए अधिकृत नहीं थे।

इसलिए रूपक का विस्तार करने के लिए, मेरी रूढ़िबद्ध और अवास्तविक दुनिया में, टेलर (विचार) बहुत सुंदर हैं, लेकिन खाली-सिर वाले हैं और अक्सर कुछ भी मानते हैं जो आप उन्हें बताते हैं, सुरक्षा गार्ड / रिसेप्शनिस्ट न्यूनतम विनम्र हैं, लेकिन बहुत ज्ञानी नहीं हैं, लेकिन जानते हैं कि लोगों को कहां और क्या करना चाहिए नहीं जाना चाहिए और प्रबंधकों वास्तव में बदसूरत और मतलब है, लेकिन सब कुछ जानते हैं और बता सकते हैं कि क्या सच है और क्या नहीं है।


4

एक चीज जो ठीक से अलग होने में मदद करती है, वह है "प्रतिमान से स्थानीय चर पास से बचने के लिए" विरोधी पैटर्न। इसके अलावा:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  def show
    @foo = Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...

इसे एक सहायक के रूप में उपलब्ध एक गेटर तक ले जाने की कोशिश करें:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  helper_method :foo

  def show
  end

  protected

  def foo
    @foo ||= Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...

इससे "@foo" में क्या डाला जाता है और इसे कैसे उपयोग किया जाता है, इसे संशोधित करना आसान हो जाता है। यह किसी भी अधिक जटिल बनाने के बिना नियंत्रक और दृश्य के बीच अलगाव को बढ़ाता है।


उम्म्म्म… युक। क्या आप ऐसा करने के लिए कुछ अच्छे कारण / परिदृश्य जोड़ सकते हैं। यह टूट जाता है चुंबन और YAGNI और बहुत बदबूदार है (बस एक और क्लिच में टॉस करने के लिए)
Sixty4Bit

2
1) आपके दृश्य उदाहरण के लिए नियंत्रक के उदाहरण चर की प्रतिलिपि बनाने के लिए रेल बहुत सारे जादू करता है। 2) सुझाए गए कार्यान्वयन केवल फू को लोड करता है यदि यह एक्सेस किया जाता है, जो कुछ समय के कुछ काम को बचा सकता है। महत्वपूर्ण उत्तर वास्तव में 1) है, हालांकि।
webmat

11
साई यह भयानक है। रेल उदाहरण चर साझाकरण एक ऐसी विशेषता है जो एक प्रतिमान नहीं है। यह एक सर्वव्यापी, कम मानसिक-ओवरहेड सिंटैक्टिक शुगर है जो शायद ही कभी वास्तविक दुनिया की समस्याओं का कारण बनता है। यदि आप इसे पसंद नहीं करते हैं, तो ठीक है, लेकिन एक गैर-मानक संरचना के साथ इसके चारों ओर कोडिंग करना चीजों को असीम रूप से बदतर बना देता है। इस मामले में आप प्रभावी रूप से फू को एक वैश्विक (वैसे भी प्रति) चर बना रहे हैं। नाटकीय रूप से दायरा बढ़ाकर परिवर्तनशील स्कोपिंग के एक कथित दुरुपयोग को सही करने का प्रयास बेहद विडंबनापूर्ण है।
gtd

1
मैं इसे नहीं खरीद रहा हूँ, dasil003 का दायरा fooऔर @fooसमान हैं - वे दोनों को <नियंत्रकक्लास, अनुरोध> जोड़ी के लिए स्कोप किया गया है। इसके अतिरिक्त, गेट्टर संस्करण का उपयोग करके, मैं यह बदल सकता हूं कि उस Fooवस्तु को कैसे पाया / संग्रहीत / कैश किया गया है, बिना यह देखे बिना कि यह कैसे पहुंचता है।
जेम्स ए। रोसेन

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

2

खैर, यह इस बात पर निर्भर करता है कि तर्क के साथ क्या करना है ...

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

इसके अलावा, Google के त्वरित बिट से पता चलता है कि कहां जाता है।

मॉडल: सत्यापन की आवश्यकताएं, डेटा संबंध, विधियां बनाना, विधियां अद्यतन करना, विधियां नष्ट करना, विधियां ढूंढना (ध्यान दें कि आपके पास न केवल इन विधियों के सामान्य संस्करण होने चाहिए, लेकिन अगर ऐसा कुछ है जो आप बहुत कुछ कर रहे हैं, जैसे कि लाल रंग वाले लोगों को खोजना अंतिम नाम से बाल, फिर आपको उस तर्क को निकालना चाहिए ताकि आपको बस इतना करना है कि find_redH_by_name ("स्मिथ") या ऐसा कुछ कहें)

दृश्य: यह सभी डेटा के प्रारूपण के बारे में होना चाहिए, न कि डेटा के प्रसंस्करण के लिए।

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

उम्मीद है की वो मदद करदे।


0

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

नियंत्रकों के पास अनुरोधित नौकरी के लिए प्रासंगिक मॉडल की ओर कोड / संकेत होंगे।

दृश्य उपयोगकर्ता इनपुट / इंटरैक्शन को स्वीकार करेंगे और परिणामी प्रतिक्रिया प्रदर्शित करेंगे।

इनमें से कोई भी बड़ा विचलन उस हिस्से पर अवांछित दबाव डालेगा और समग्र आवेदन प्रदर्शन प्रभावित हो सकता है।


-1

परीक्षण, परीक्षण ... मॉडल में जितना संभव हो उतना तर्क रखें और फिर आप इसे ठीक से परख सकेंगे। इकाई परीक्षण डेटा का परीक्षण करता है और जिस तरह से यह मॉडल का परीक्षण करके बनता है, और कार्यात्मक परीक्षण नियंत्रक को परीक्षण करके जिस तरह से इसे नियंत्रित या नियंत्रित किया जाता है, इसलिए यह परीक्षण करता है कि आप डेटा की अखंडता का परीक्षण तब तक नहीं कर सकते जब तक कि यह न हो आदर्श।

जे

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