आवेदन परत बनाम डोमेन परत?


46

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

मेरे प्रश्न, चूंकि दोनों ने आवेदन के तर्क की चिंता की है और माना जाता है कि वे तकनीकी और प्रस्तुति पहलुओं से साफ हैं, इन दोनों को एक सीमा रेखा खींचने के क्या फायदे हैं?

जवाबों:


35

मैंने हाल ही में डीडीडी स्वयं पढ़ा। जब मुझे इस खंड के लिए मिला तो मुझे यह जानकर सुखद आश्चर्य हुआ कि मैंने उसी 4-लेयर आर्किटेक्चर की खोज की जो इवांस ने किया था। जैसा कि @lonelybug ने बताया, डोमेन लेयर को सिस्टम के बाकी हिस्सों से पूरी तरह अलग किया जाना चाहिए। हालाँकि, कुछ को यूआई-विशिष्ट मान (क्वेरी स्ट्रिंग्स, POST डेटा, सत्र, आदि) को डोमेन ऑब्जेक्ट में अनुवाद करना होता है। यह वह जगह है जहां एप्लिकेशन लेयर खेलने में आता है। यह कार्य UI, डेटा लेयर और डोमेन के बीच आगे और पीछे अनुवाद करना है, बाकी सिस्टम से प्रभावी रूप से डोमेन को छुपाता है।

मुझे अब बहुत सारे ASP.NET MVC एप्लिकेशन दिखाई देते हैं जहां लगभग सभी तर्क नियंत्रकों में हैं। क्लासिक 3-लेयर आर्किटेक्चर को लागू करने का यह एक असफल प्रयास है। नियंत्रकों को इकाई परीक्षण करना मुश्किल है क्योंकि उनके पास बहुत सारे यूआई-विशिष्ट चिंताएं हैं। वास्तव में, एक नियंत्रक लिखना ताकि यह सीधे "एचटीटीपी संदर्भ" मूल्यों के साथ संबंध न हो, अपने आप में एक गंभीर चुनौती है। आदर्श रूप से, नियंत्रक को केवल अनुवाद करना चाहिए, काम का समन्वय करना चाहिए और प्रतिक्रिया को वापस करना चाहिए।

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

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


9
मुझे नहीं लगता कि आप यहां जो कहते हैं वह सही है: "हालाँकि, कुछ को यूआई-विशिष्ट मानों (क्वेरी स्ट्रिंग, POST डेटा, सत्र, आदि) को डोमेन ऑब्जेक्ट में अनुवाद करना है। यह वह जगह है जहां आवेदन परत खेलने में आती है"। आप जो उल्लेख कर रहे हैं, वह DDD की "प्रस्तुति" परत में है। डोमेन लेयर के ऊपर सिर्फ एक छोटा आवरण होने के कारण एप्लीकेशन लेयर को प्लंबिंग, कंसीलर और क्रॉस-कटिंग चिंताओं से निपटने के लिए माना जाता है। आप जो वर्णन कर रहे हैं, वह प्रस्तुति परत में एक (उप) परत के अनुरूप होगा।
व्यंग्यकार ११

23

मार्टिन फाउलर के उद्यम डिजाइन के पैटर्न से लेते हुए, सबसे आम परतें हैं:

  • प्रस्तुति - ये दृश्य, प्रस्तुति टेम्प्लेट हैं जो आपके एप्लिकेशन के लिए इंटरैक्शन इंटरफ़ेस उत्पन्न करते हैं (यदि आपका एप्लिकेशन वेब सेवाओं या आरएमआई के माध्यम से अन्य सिस्टम द्वारा एक्सेस किया जाता है तो मैं उपयोगकर्ता इंटरफ़ेस नहीं हो सकता है)। इसमें नियंत्रक भी शामिल हैं जो तय करते हैं कि कार्यों को कैसे निष्पादित किया जाएगा और कैसे।

  • डोमेन - यह वह जगह है जहाँ आपके व्यावसायिक नियम और तर्क रहते हैं, आपके डोमेन मॉडल आदि परिभाषित हैं

  • डेटा स्रोत - यह डेटा मैपिंग परत (ORM) और डेटा स्रोत (डेटाबेस, फ़ाइल सिस्टम आदि) है

आप तीन परतों के बीच की सीमाएँ कैसे खींचते हैं:

  • अपने मॉडल या डोमेन ऑब्जेक्ट्स में प्रस्तुति विशिष्ट तर्क न रखें

  • अपने पृष्ठों और नियंत्रकों के बीच तर्क न रखें, अर्थात, डेटाबेस में वस्तुओं को बचाने के लिए तर्क, डेटाबेस कनेक्शन आदि बनाएं, जिससे आपकी प्रस्तुति परत भंगुर और परीक्षण करने में कठिन हो जाएगी

  • एक ORM का उपयोग करें जो आपको मॉडल से अपने डेटा स्रोत तक पहुँच और क्रियाओं को पूर्ण करने में सक्षम बनाता है

  • पतले नियंत्रक का पालन करें - वसा मॉडल प्रतिमान, नियंत्रक इसे बाहर नहीं ले जाने की प्रक्रिया को नियंत्रित करने के लिए हैं, अधिक http://www.littlehart.net/atthekeyboard/2007/04/27/fat-models-skinny-controllers/ पर और http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model मॉडल, दृश्य और नियंत्रक


17

डोमेन परत मॉडल व्यापार आपके आवेदन की। यह नियमों की आपकी स्पष्ट व्याख्या होनी चाहिए, यह घटक की गतिशीलता है और इसमें किसी भी समय इसकी स्थिति है।

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

उदाहरण के लिए , मेरे वित्तीय सॉफ़्टवेयर एप्लिकेशन में एक मॉडल इकाई की स्थिति को बदलने के लिए एक उपयोगकर्ता ऑपरेशन है (डीडीडी में परिभाषित इकाई [89]):

  • "ऑपरेशन के प्रमुख एक वित्तीय प्रस्ताव को मंजूरी दे सकते हैं"।

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

टिप्पणियाँ:

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

6

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

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

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


2
कम से कम साहित्य में जैसे डोमेन-ड्रिवेन डिज़ाइन (इवांस), यह स्वीकार किया जाता है कि परतों में एक-तरफ़ा निर्भरता है ... तथ्य यह है कि कुछ बिंदु पर आपका कोड कुछ पर निर्भर करता है । यूआई एप्लीकेशन पर निर्भर करता है, लेकिन इसके विपरीत नहीं। आवेदन डोमेन पर निर्भर करता है, लेकिन इसके विपरीत नहीं। इन्फ्रास्ट्रक्चर पर डोमेन, इसके विपरीत नहीं।

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

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

आइसोलेशन लेयर डिज़ाइन का मतलब भविष्य में कोई बदलाव की अनुमति नहीं है। इसके विपरीत, यह परिवर्तनों को बहुत आसान बनाता है - परीक्षण करना आसान और कार्यों का अनुमान लगाना आसान है। हां, एक नई व्यावसायिक आवश्यकता का मतलब है कि आपको ऊपर से नीचे तक बदलाव की आवश्यकता हो सकती है, क्या यह तरीका नहीं है कि आपने मौजूदा फ़ंक्शन को कैसे लागू किया? यदि आप SOLID सिद्धांतों के आधार पर प्रत्येक परत को डिज़ाइन कर सकते हैं, तो आप पा सकते हैं कि आप नीचे की परत से मौजूदा कार्यों का पुन: उपयोग कर सकते हैं।
स्टेवसून 21

3

डोमेन ड्रिवेन मॉडलिंग का बिंदु आवश्यक डोमेन मॉडल को अलग करना है और यह अन्य परतों और अन्य एप्लिकेशन चिंताओं पर कोई निर्भरता के बिना मौजूद है।

यह आपको विचलित किए बिना डोमेन पर ध्यान केंद्रित करने की अनुमति देता है (जैसे कि यूआई और दृढ़ता सेवाओं के बीच समन्वय करना)।


फिर, डेटा स्रोत (एक ORM) डोमेन के अंदर है?
Maykonn

@Maykonn - यह हो सकता है। हालाँकि, एक ORM डेटा का एक स्रोत नहीं है। यह आपके कोड और डेटा के वास्तविक स्रोत (एक संबंधपरक डेटाबेस) के बीच एक उपकरण है। आप डेटा तक कैसे पहुँचते हैं, यह डोमेन की चिंता का विषय नहीं होना चाहिए - बिल्डर्स और फैक्ट्रियाँ इससे निपट सकती हैं (और यदि आपके पास एक ORM है)।
ऊद

मैं सहमत हूँ। और मैं डेटा स्रोत और ओआरएम के बारे में गलत था। धन्यवाद!
मेकॉन

3
  • एप्लीकेशन लेयर और डोमेन लेयर दोनों कार्यान्वयन के दायरे में आते हैं।
  • एप्लिकेशन परत एपीआई के रूप में कार्य करता है।
  • डोमेन लेयर एपीआई के कार्यान्वयन के रूप में कार्य करता है, इसमें व्यावसायिक तर्क होते हैं इसलिए इसे बिजनेस लॉजिक लेयर भी कहा जाता है

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


हालांकि इस तरह से कभी नहीं .... मैं प्रबुद्ध महसूस करता हूं
निकोस

2

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

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

अंतिम लक्ष्य अपने कोड को यथासंभव आसान बनाना है।

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

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


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

1
इस साइट के लिए यह सही प्रकार का प्रश्न है। आपको इसे पोस्ट करना चाहिए, ताकि हर को जवाब देने का मौका मिले।
चार्ल्स लैम्बर्ट

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