नियंत्रक परत में कितने व्यावसायिक तर्क मौजूद होने चाहिए?


39

कभी-कभी हमारे पास हमारे अनुप्रयोगों के नियंत्रक कोड में कुछ व्यावसायिक तर्क होते हैं। यह आमतौर पर तर्क है कि मॉडल से कॉल करने के तरीके और / या उन्हें पास करने के लिए क्या तर्क अलग-अलग हैं।

इसका एक और उदाहरण नियंत्रक कार्यों का एक सेट है जो नियंत्रक में मौजूद है जो व्यवसाय नियमों के एक सेट के अनुसार मॉडल से लौटाए गए डेटा को प्रारूपित या साफ करने के लिए काम कर सकता है।

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

मेरा प्रश्न यह है कि नियंत्रक में और कितने परिस्थितियों में, यदि कोई हो, तो व्यावसायिक तर्क को अनुमति दी जानी चाहिए?


1
बड़ा सवाल है। मैं लोगों की राय देखने के लिए उत्सुक हूं।
नाथन टेलर

जवाबों:


20

आदर्श रूप से कोई नहीं

लेकिन यह हमेशा संभव नहीं है। मैं आपको 20% या 10 लाइनों की तरह हार्ड नंबर नहीं दे सकता, जो कि उस बिंदु के अधीन है जिसका जवाब नहीं दिया जा सकता है। मैं वर्णन कर सकता हूं कि मैं डिज़ाइन पैटर्न और परिस्थितियों का उपयोग कैसे करता हूं जो उन्हें थोड़ा झुकने की आवश्यकता होती है।

मेरे दिमाग में यह पूरी तरह से आवेदन के उद्देश्य तक है। पोस्ट करने के लिए एक साधारण REST एपीआई का निर्माण? स्वच्छ पृथक्करण या एक पैटर्न के बारे में भूल जाओ। आप एक घंटे के भीतर काम कर रहे संस्करण का मंथन कर सकते हैं। कुछ बड़ा बनाना? शायद इस पर काम करना सबसे अच्छा है।

व्यक्तिगत रूप से निहित प्रणालियों का निर्माण लक्ष्य है। यदि आप व्यावसायिक तर्क लिखना शुरू करते हैं जो इस बात के लिए विशिष्ट है कि दो प्रणालियाँ एक समस्या कैसे होती हैं। इसमें आगे देखे बिना मैं एक राय नहीं दे सकता।

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

डिज़ाइन पैटर्न लचीले हैं, उन्हें अपनी आवश्यकताओं के अनुरूप समायोजित करें । उन्हें बहुत अधिक झुकना और वे हालांकि टूट जाते हैं। जानिए कि आपको क्या चाहिए और एक डिज़ाइन पैटर्न चुनें जो उसके सबसे करीब हो।


10

जितना कम हो सके उतना। अधिमानतः कोई नहीं।

नियंत्रक को अनुरोध को स्वीकार करने के लिए चिंतित होना चाहिए, सही डोमेन सेवा को अनुरोध को संसाधित करने के लिए कहें, और प्रतिक्रिया को सही दृश्य पर सौंप दें।

उस प्रक्रिया में, सभी "व्यावसायिक तर्क" डोमेन सेवाओं में मौजूद होना चाहिए।

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


10

शब्द "व्यापार तर्क" वह है जो अक्सर भ्रामक होता है क्योंकि लोगों का इस बारे में अलग-अलग मत है कि इसका क्या अर्थ है। मेरे विचार में, "व्यावसायिक तर्क" शब्द दो क्षेत्रों को शामिल करता है

  • डोमेन लॉजिक
  • अनुप्रयोग तर्क

डोमेन लॉजिक आपके द्वारा संबंधित कोर क्षेत्र से संबंधित तर्क है, इसलिए यदि एकाउंटेंट के लिए एक आवेदन लिखना है, तो कर नियम, पुस्तक रखने के नियम, नियम आदि डोमेन तर्क का हिस्सा हैं।

एप्लिकेशन लॉजिक इस तथ्य से संबंधित तर्क है कि आप कंप्यूटर प्रोग्राम चला रहे हैं। यह सामान जैसे कि CSV इंपोर्ट एक्सपोर्ट, विजार्ड्स आदि भी हो सकता है, इसमें भूल गए पासवर्ड ईमेल बनाने जैसे सामान भी हो सकते हैं।

कंट्रोलर लेयर में जिस तरह का "बिजनेस लॉजिक" होता है, वह एप्लीकेशन लॉजिक होता है। शायद सभी आवेदन तर्क वहां नहीं जाने चाहिए। लेकिन आपको कंट्रोलर लेयर में कभी भी डोमेन लॉजिक नहीं रखना चाहिए। यह स्पष्ट रूप से डोमेन परत में होना चाहिए।

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


4

डोमेन लॉजिक पर नियंत्रकों को बहुत हल्का होना चाहिए।

नियंत्रकों को एक समान सेवा (रिपॉजिटरी लेयर) के माध्यम से डेटा स्टोर से एक रिकॉर्ड प्राप्त करने और उसी (या संबंधित) सेवा द्वारा डेटा स्टोर में डेटा वापस भेजने जैसे कार्यों को सौंपना चाहिए। उन कार्यों के बीच यांत्रिकी और बारीक कामकाज के लिए, आमतौर पर वे नियंत्रक के अलावा कहीं और होते हैं।

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


3

एक व्यावहारिक दृष्टिकोण से मैंने पाया है कि आप या तो अपने मॉडल में अपने नियंत्रक या नियंत्रक व्यवहार में तर्क के साथ समाप्त होते हैं जब आप कुछ ऐसा करने की कोशिश कर रहे होते हैं जिसके लिए एक अच्छा पैटर्न-अनुरूप दृष्टिकोण नहीं होता है। निस्संदेह यदि आप एक ऐसा ऐप लिख रहे हैं, जिसके पीछे बड़ा आधारभूत ढांचा नहीं है।

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

एक तीसरा विकल्प यूटिलिटी आइटम्स को एक अलग यूटिलिटी क्लास के रूप में संदर्भित करना होगा, लेकिन यह कुछ के साथ-साथ पैटर्न के खिलाफ भी है।

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

MVC एक बिंदु पर स्वयं स्थापित प्रतिमानों से विचलन था।


3

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

कई अन्य प्रोग्रामिंग अवधारणाओं की तरह, एमवीसी वास्तविकता को सरल बनाता है, छोटे विवरणों का खुलासा करता है और पालन करने के लिए एक कच्चा वायरफ्रेम मॉडल प्रदान करता है। वास्तविकता के कई अन्य सरलीकरणों की तरह यह काम करता है जो मानव मन द्वारा देखा गया अराजकता में गति लाता है।

फिर भी, कई अन्य प्रोग्रामिंग अवधारणाओं की तरह, एमवीएस वास्तविकता का सिर्फ एक सरलीकरण है। यह सही नहीं है और यह पूरी तरह से नहीं है। यही कारण है कि एक वास्तविक विश्व परिदृश्य को एक ओवरसाइम्प्लीफाइड मॉडल में फिट करना संभव नहीं है। इसलिए इस एक के समान कई सवाल उठते हैं।

  • नियंत्रक में कितना तर्क जाना चाहिए?

  • क्या किसी दृश्य में कोई सशर्त तर्क होना चाहिए?

  • क्या किसी मॉडल में कोई अतिरिक्त डेटा होना चाहिए जो सीधे व्यावसायिक संस्थाओं में नहीं पाया जाता है?

ये सभी प्रश्न MVC के वैचारिक विचार को सटीक और पूरी तरह से फिट करने के लिए कोड को समायोजित करने के प्रयास में पैदा हुए हैं।

मेरा उत्तर आपके लिए नहीं है। MVC संरचना प्रदान करता है। इस फ़ाउंडेशन के चारों ओर अपना एप्लिकेशन बनाएं, लेकिन यह पूरी तरह से फिट होने की उम्मीद न करें। विचलन होगा, यह सामान्य है। बस उन्हें नियंत्रण में रखने के लिए देखें।

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