मुझे अपनी प्रस्तुति परत से अपनी डोमेन संस्थाओं को अलग क्यों करना चाहिए?


85

डोमेन-संचालित डिज़ाइन का एक हिस्सा जिस पर बहुत अधिक विवरण नहीं लगता है, वह यह है कि आपको अपने इंटरफ़ेस से अपने डोमेन मॉडल को कैसे और क्यों अलग करना चाहिए। मैं अपने सहकर्मियों को समझाने की कोशिश कर रहा हूं कि यह एक अच्छा अभ्यास है, लेकिन मुझे लगता नहीं है कि मैं बहुत अधिक रास्ता बना रहा हूं ...

वे उन डोमेन एंटिटीज़ का उपयोग करते हैं जहाँ कभी वे प्रस्तुति और इंटरफ़ेस परतों में कृपया करते हैं। जब मैं उनसे तर्क करता हूं कि उन्हें इंटरफ़ेस लेयर से डोमेन लेयर को इंसुलेट करने के लिए डिस्प्ले मॉडल्स या DTO का उपयोग करना चाहिए, तो वे काउंटर करते हैं कि वे ऐसा कुछ करने में व्यावसायिक मूल्य नहीं देखते हैं, क्योंकि अब आपके पास बनाए रखने के लिए UI ऑब्जेक्ट है साथ ही मूल डोमेन ऑब्जेक्ट।

इसलिए मैं कुछ ठोस कारणों की तलाश कर रहा हूं जिनका उपयोग मैं इसे वापस करने के लिए कर सकता हूं। विशेष रूप से:

  1. हमें अपनी प्रस्तुति परत में डोमेन ऑब्जेक्ट का उपयोग क्यों नहीं करना चाहिए?
    (यदि उत्तर स्पष्ट है, 'डिकॉप्लिंग' है, तो कृपया बताएं कि इस संदर्भ में यह महत्वपूर्ण क्यों है)
  2. क्या हमें अपने डोमेन ऑब्जेक्ट्स को इंटरफ़ेस से अलग करने के लिए अतिरिक्त ऑब्जेक्ट या कंस्ट्रक्शन का उपयोग करना चाहिए?

यह प्रश्न विकि में होना चाहिए।
सैय्यद तय्यब अली

@ m4bwav - यह एक विकी होना चाहिए क्योंकि यह इस तरह से संचालित होता है जैसे कि एक एकल सही उत्तर के बजाय चर्चा को आमंत्रित करना।
रोब एलन

1
@ m4bwav: मुझे लगता है कि आपका प्रश्न एक वास्तविक प्रश्न की तुलना में एक राय के टुकड़े के रूप में आया था ... मैंने इसे सही करने की कोशिश की है (आप इसे आगे संपादित करना चाह सकते हैं), लेकिन ध्यान रखें कि उचित देखभाल के बिना यह प्रकट हो सकता है ट्रोलिंग हो।
शोग

5
ठीक है, बैकअप, मैं एक वैध प्रश्न पूछ रहा हूँ, यह किसी को कैसे नाराज करेगा? मैं किसे निशाना बना रहा हूं?
मार्क रोजर्स

@ m4bwav: आप अपने स्ट्रॉ-मैन को लक्षित कर रहे हैं। "बड़ी संख्या में लोग" आप अपने प्रश्न में इस पर चर्चा करते हैं।
शोग

जवाबों:


48

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

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


2
"आपके डोमेन ऑब्जेक्ट्स को दो स्थानों पर लागू करने" से आपका क्या मतलब है?
jlembke

10
यह मुझे मूर्खतापूर्ण लगता है। अब अतिरिक्त काम क्यों करना है जो भविष्य में काम बचा सकता है? 10 में से 9 बार आपको वह परिवर्तन करने की आवश्यकता नहीं होगी जो काम के "टन" को बचाएगा।
बीप बीप

13
@LuckyLindy: 100 में से 99 बार (वास्तव में अधिक), मेरी सीट बेल्ट पहनने के लिए मुझे घायल होने से बचाने के लिए आवश्यक नहीं है। हालांकि, एक उदाहरण में जब मुझे वास्तव में इसकी आवश्यकता होती है, तो यह (संभावना) मुझे मारे जाने या बुरी तरह घायल होने से बचाए रखेगा। रोकथाम का एक औंस इलाज के एक पाउंड के लायक है। मुझे संदेह है कि इस बारे में आपकी राय बदलने के बाद आपके पास अधिक अनुभव होगा।
पॉल सोनियर

19

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

खैर एक CompanyObject को लोड करने के बजाय जिसमें सदस्यता के संदर्भ हो सकते हैं या कौन जानता है कि मैं और डीटीओ को नाम और आईडी के साथ वापस भेज सकता हूं। यह एक अच्छा उपयोग है IMHO।

अब एक और उदाहरण लेते हैं। मेरे पास एक ऑब्जेक्ट है जो एक अनुमान का प्रतिनिधित्व करता है, यह अनुमान श्रम, उपकरण आदि से बना हो सकता है, इसमें बहुत सारी गणनाएं हो सकती हैं जो उपयोगकर्ता द्वारा परिभाषित की जाती हैं जो इन सभी वस्तुओं को लेते हैं और उन्हें योग करते हैं (प्रत्येक अनुमान विभिन्न प्रकारों के साथ भिन्न हो सकता है गणना के)। मुझे इस ऑब्जेक्ट को दो बार क्यों बनाना चाहिए? मैं गणनाओं पर केवल अपने UI की गणना क्यों नहीं कर सकता और उन्हें प्रदर्शित नहीं कर सकता?

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

यह विचार कि कोई अपने व्यवसाय की वस्तु में सत्यापन करेगा? वैसे मैं कहता हूं कि यह अच्छी बात है। आपके व्यवसाय की वस्तुओं को मान्य करने के लिए आपके UI की एकमात्र जिम्मेदारी नहीं होनी चाहिए। आपके व्यवसाय की परत को अपना सत्यापन करना होगा।

आप यूआई जनरेशन कोड को किसी बसीन्स ऑब्जेक्ट में क्यों डालेंगे? मेरे मामले में मेरे पास अलग-अलग वस्तुएं हैं जो UI से UI कोड सेपरेटली उत्पन्न करती हैं। मेरे पास ऐसी वस्तुएं हैं जो मेरे व्यवसाय की वस्तुओं को एक्सएमएल में प्रस्तुत करती हैं, इस विचार से कि इस प्रकार के संदूषण को रोकने के लिए आपको अपनी परतों को अलग करना होगा क्योंकि मेरे लिए यह बहुत ही अलग है क्योंकि आप HTML ऑब्जेक्ट कोड को किसी व्यावसायिक ऑब्जेक्ट में क्यों डालेंगे ...

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

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


क्या अलग-अलग किरायेदारों के लिए अलग-अलग लेबल नहीं होना प्रत्येक किरायेदार के लिए एक अलग सर्वव्यापी भाषा को दर्शाता है? मुझे लगता है कि एक मेटा-मॉडल की अवधारणा की आवश्यकता है जहां मेटा-मॉडल की व्याख्या के लिए एक अनुवाद परत के साथ किरायेदारों के बीच एक डोमेन साझा किया जाता है।
केल

16

आप इसे उसी कारण से करते हैं जब आप SQL को अपने ASP / JSP पृष्ठों से बाहर रखते हैं।

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

आप दूसरे ऐप में उस निफ्टी UI विजेट का पुन: उपयोग करना चाहते हैं? ठीक है, आपको इस नाम, इन दो स्कीमाओं और इन 18 तालिकाओं के साथ एक डेटाबेस बनाना होगा। व्यवसाय सत्यापन करने के लिए आपको हाइबरनेट और स्प्रिंग (या अपनी पसंद के ढांचे) को भी कॉन्फ़िगर करना होगा। ओह, आपको इन 85 अन्य गैर-संबंधित वर्गों को भी शामिल करना होगा क्योंकि वे व्यावसायिक परत में संदर्भित हैं, जो कि बस एक ही फ़ाइल में होता है।


13

मैं असहमत हूं।

मुझे लगता है कि जाने का सबसे अच्छा तरीका आपकी प्रस्तुति परत में डोमेन ऑब्जेक्ट्स के साथ शुरू करना है UNTIL IT MAKES SENSE TO DO OTHERWISE।

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


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

नहीं, यह गलत है, और ठीक यही कारण है कि कई साइटें sql इंजेक्शन की चपेट में आ जाती हैं।
रेमी

7

उत्तर आपके आवेदन के पैमाने पर निर्भर करता है।


सरल CRUD (बनाएं, पढ़ें, अपडेट, हटाएं) एप्लिकेशन

बुनियादी क्रूड अनुप्रयोगों के लिए आपके पास कोई कार्यक्षमता नहीं है। संस्थाओं के शीर्ष पर डीटीओ को जोड़ना समय की बर्बादी होगी। यह स्केलेबिलिटी को बढ़ाए बिना जटिलता को बढ़ाएगा।

यहां छवि विवरण दर्ज करें


गैर-सीआरयूडी आवेदन को मामूली रूप से जटिल

आवेदन के इस आकार में आपके पास कुछ इकाइयाँ होंगी जिनके पास सच्चे जीवनकाल और उनसे जुड़े कुछ व्यावसायिक तर्क हैं।

इस मामले में डीटीओ को जोड़ना कुछ कारणों से एक अच्छा विचार है:

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

यहां छवि विवरण दर्ज करें


जटिल उद्यम आवेदन

एकल इकाई को प्रस्तुति के कई तरीकों की आवश्यकता हो सकती है। उनमें से प्रत्येक को विभिन्न क्षेत्रों के सेट की आवश्यकता होगी। इस मामले में आप पिछले उदाहरणों के समान मुद्दों का सामना करते हैं और प्रत्येक ग्राहक के लिए दिखाई देने वाले क्षेत्रों की मात्रा को नियंत्रित करने की आवश्यकता होती है। प्रत्येक ग्राहक के लिए अलग डीटीओ होने से आपको वह चुनने में मदद मिलेगी जो दिखाई देनी चाहिए।

यहां छवि विवरण दर्ज करें


4

हम सर्वर में और ui पर एक ही मॉडल का उपयोग कर रहे हैं। और यह एक पीड़ा है। हमें इसे किसी दिन रिफ्लेक्टर करना होगा।

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

एक और समस्या यह है कि यूआई पर संस्थाएं वास्तव में फिट नहीं हैं। हम डेटाबाइंडिंग का उपयोग कर रहे हैं और कई संस्थाओं में केवल ui प्रयोजनों के लिए बहुत सारे अनावश्यक गुण हैं। इसके अतिरिक्त इकाई मॉडल में कई 'BrowsableAttribute' और अन्य हैं। यह वास्तव में बुरा है।

अंत में, मुझे लगता है कि यह केवल एक मामला है जो आसान है। ऐसी परियोजनाओं द्वारा हो सकता है जहां यह ठीक काम करती है और जहां एक और डीटीओ मॉडल लिखने की आवश्यकता नहीं है।


2
यदि आपके डेटाबाइंडिंग का उपयोग करने के लिए एक linq क्वेरी चलाते हैं और एक अनाम प्रकार से बाँधते हैं। यह आपको समतल करने और उत्तराधिकार को बदलने की सुविधा देता है। आप इसे बहुत अच्छी तरह से फ़िल्टरिंग और सॉर्टिंग भी लागू कर सकते हैं।
जोशबर्के

@ जोश: सलाह के लिए धन्यवाद। यह आंशिक रूप से काम कर सकता है। मैं स्वयं GUI प्रोग्रामर नहीं हूं और GUI अवधारणाओं में ज्यादा शामिल नहीं हूं। समस्या उन मामलों में होगी जहां डेटा में हेरफेर किया जाता है और सर्वर पर वापस भेजा जाता है।
स्टीफन स्टाइनगर

3

यह अधिकांश भाग के लिए निर्भरता के बारे में है। संगठन की मुख्य कार्यात्मक संरचना की अपनी कार्यात्मक आवश्यकताएं हैं, और यूआई को लोगों को कोर को संशोधित करने और देखने में सक्षम बनाना चाहिए; लेकिन UI को समायोजित करने के लिए कोर की आवश्यकता नहीं होनी चाहिए। (यदि ऐसा होने की आवश्यकता है, तो यह आमतौर पर एक संकेत है कि कोर डिजाइन की गई संपत्ति नहीं है।)

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

मूल रूप से एक व्यक्ति के पास एक काम है। डीडीडी को नौकरी के प्रवाह और सामग्री से मेल खाना चाहिए। DDD उन सभी नौकरियों को स्पष्ट करने के बारे में है जिनकी आवश्यकता विज्ञापन और पूरी तरह से स्वतंत्र रूप से संभव है। तब यूआई उम्मीद करता है कि काम को यथासंभव पारदर्शी तरीके से किया जा सकता है।

इंटरफेस सही ढंग से मॉडलिंग और अपरिवर्तनीय कार्यात्मक कोर के लिए प्रदान किए गए इनपुट और विचारों के बारे में हैं।


3

Dammit, मैं कसम खाता हूँ यह कहा हठ।

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


2

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


1

शायद आप यूआई परत को व्यापक रूप में पर्याप्त रूप से नहीं समझ रहे हैं। प्रतिक्रिया के कई रूपों (वेब ​​पेज, आवाज प्रतिक्रिया, मुद्रित पत्र आदि) और कई भाषाओं (अंग्रेजी, फ्रेंच आदि) के संदर्भ में सोचें।

अब मान लें कि टेलीफोन कॉल-इन सिस्टम के लिए भाषण इंजन वेबसाइट (विंडोज शायद) चलाने वाले कंप्यूटर से पूरी तरह से अलग प्रकार के कंप्यूटर (उदाहरण के लिए मैक) पर चलता है।

बेशक, जाल में गिरना आसान है "मेरी कंपनी में हम केवल अंग्रेजी की परवाह करते हैं, अपनी वेबसाइट को LAMP (लिनक्स, अपाचे, MySQL और PHP) पर चलाते हैं और हर कोई फ़ायरफ़ॉक्स के एक ही संस्करण का उपयोग करता है"। लेकिन 5 या 10 साल में क्या होगा?



1

' वैल्यू इंजेक्टर ' जैसे टूल की मदद से और व्यूज के साथ काम करते हुए प्रेजेंटेशन लेयर में ' मैपर ' के कॉन्सेप्ट पर कोड के प्रत्येक टुकड़े को समझना ज्यादा आसान है। यदि आपके पास थोड़ा सा कोड है, तो आपको तुरंत फायदे नहीं दिखेंगे, लेकिन जब आपकी परियोजना अधिक से अधिक बढ़ जाएगी, तो आपको सेवाओं के तर्क में प्रवेश नहीं करने के विचारों के साथ काम करते हुए बहुत खुशी होगी व्यू मॉडल को समझने के लिए रिपॉजिटरी। व्यू मॉडल एंटी-करप्शन लेयर की विशाल दुनिया में एक और गार्ड है और लंबी अवधि के प्रोजेक्ट में सोने में इसका वजन है।

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


1

यहाँ एक वास्तविक उदाहरण है कि क्यों मुझे डोमेन से अलग विचार रखने के लिए यह अच्छा अभ्यास लगता है।

कुछ महीनों पहले मैंने 3 गेज की एक श्रृंखला के माध्यम से मिट्टी के नमूने में नाइट्रोजन, फास्फोरस और पोटेशियम के मूल्यों को दिखाने के लिए एक साधारण यूआई बनाया। प्रत्येक गेज में एक लाल, हरा और लाल खंड होता था, यानी आप या तो प्रत्येक घटक के बहुत कम या बहुत अधिक हो सकते थे, लेकिन बीच में एक सुरक्षित हरा स्तर था।

ज्यादा सोचे-समझे बिना, मैंने अपने व्यावसायिक तर्क को इन 3 रासायनिक घटकों और एक अलग डेटा शीट के लिए डेटा की आपूर्ति करने के लिए मॉडल किया, जिसमें 3 मामलों में से प्रत्येक में स्वीकृत स्तरों के बारे में डेटा शामिल था (जिसमें माप इकाई का उपयोग किया जा रहा था, अर्थात मोल्स या प्रतिशत)। मैंने तब अपने यूआई को बहुत अलग मॉडल का उपयोग करने के लिए मॉडल किया था, यह मॉडल गेज लेबल, मूल्यों, सीमा मूल्यों और रंगों के बारे में चिंतित था।

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

अगर मैंने इन गेजों को अपने डोमेन संस्थाओं में सीधे युग्मित कर लिया होता, तो मेरे पास उपरोक्त लचीलापन नहीं होता और भविष्य में होने वाले किसी भी संशोधन में सिरदर्द होता। जब UI में कैलेंडर्स मॉडलिंग करते हैं तो मैं बहुत समान मुद्दों पर आता हूं। यदि 10+ उपस्थित होने पर कैलेंडर को लाल करने के लिए एक नियुक्ति की आवश्यकता होती है, तो इसे संभालने के लिए व्यावसायिक तर्क व्यवसाय की परत में रहना चाहिए और UI में सभी कैलेंडर को जानना होगा, यह निर्देश दिया गया है लाल हो जाना चाहिए, यह जानने की आवश्यकता नहीं होनी चाहिए कि क्यों।


-1

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

जब डोमेन कार्यात्मक फ्रेमवर्क (जैसे ओआरएम, जीयूआई, वर्कफ़्लो, आदि) के ऑर्थोगोनल सेट के साथ संयोजन में उपयोग किया जाता है, तो डोमेन संचालित डिज़ाइन सबसे अच्छा काम करते हैं। हमेशा याद रखें कि यह केवल बाहरी परत की आसन्नताओं में है जो डोमेन शब्दार्थ को उजागर करने की आवश्यकता है। आमतौर पर यह फ्रंट एंड (GUI) और लगातार बैक-एंड (RDBM, ORM) है। किसी भी प्रभावी ढंग से डिज़ाइन की गई हस्तक्षेप करने वाली परतें डोमेन इनवेरिएंट हो सकती हैं और होनी चाहिए।


जब तक आप वास्तव में उन्हें अलग-अलग ऐप में साझा नहीं करेंगे, पैरा 1: अनावश्यक अमूर्तता (जैसे पुन: प्रयोज्य घटकों) का निर्माण न करें। पैरा 2: मुझे आश्चर्य है कि सामान्य जीयूआई इतने सारे अलग-अलग डोमेन में कैसे काम करते हैं। टिप्पणी: यह उद्योग इतना टूटा हुआ है, यह अब और भी हास्यास्पद नहीं है ...
अल्फ़ाज़ेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.