रिच डोमेन मॉडल - कैसे, वास्तव में, व्यवहार में फिट बैठता है?


84

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

वास्तविक दुनिया के उदाहरण के लिए, DDD का यह कार्यान्वयन गलत प्रतीत होता है:

नीचे दिए गए WorkItem डोमेन मॉडल संपत्ति के बैग के अलावा और कुछ नहीं हैं, जिनका उपयोग कोड-प्रथम डेटाबेस के लिए एंटिटी फ्रेमवर्क द्वारा किया जाता है। प्रति फाउलर, यह एनीमिक है

WorkItemService परत जाहिर तौर पर डोमेन सेवाओं की एक आम गलत धारणा है; इसमें WorkItem के लिए सभी व्यवहार / व्यावसायिक तर्क शामिल हैं। यमलीआनोव और अन्य लोगों के अनुसार, यह प्रक्रियात्मक है । (पृष्ठ ६)

तो अगर नीचे गलत है, तो मैं इसे सही कैसे बना सकता हूं?
व्यवहार, अर्थात् AddStatusUpdate या Checkout , WorkItem वर्ग में सही होना चाहिए?
WorkItem मॉडल में क्या निर्भरताएं होनी चाहिए?

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

public class WorkItemService : IWorkItemService {
    private IUnitOfWorkFactory _unitOfWorkFactory;

    //using Unity for dependency injection
    public WorkItemService(IUnitOfWorkFactory unitOfWorkFactory) {
        _unitOfWorkFactory = unitOfWorkFactory;
    }

    public void AddStatusUpdate(int workItemId, int statusId) {

        using (var unitOfWork = _unitOfWorkFactory.GetUnitOfWork<IWorkItemUnitOfWork>()) {
            var workItemRepo = unitOfWork.WorkItemRepository;
            var workItemStatusRepo = unitOfWork.WorkItemStatusRepository;

            var workItem = workItemRepo.Read(wi => wi.Id == workItemId).FirstOrDefault();
            if (workItem == null)
                throw new ArgumentException(string.Format(@"The provided WorkItem Id '{0}' is not recognized", workItemId), "workItemId");

            var status = workItemStatusRepo.Read(s => s.Id == statusId).FirstOrDefault();
            if (status == null)
                throw new ArgumentException(string.Format(@"The provided Status Id '{0}' is not recognized", statusId), "statusId");

            workItem.StatusHistory.Add(status);

            workItemRepo.Update(workItem);
            unitOfWork.Save();
        }
    }
}

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

अपडेट करें

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

अपडेट - 2 साल बाद

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

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

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


6
जब आप उन्हें बताते हैं तो सभी दार्शनिक सिद्धांत जमीन पर गिर जाते हैं "I don't want to duplicate all my entities into DTOs simply because I don't need it and it violates DRY, and I also don't want my client application to take a dependency on EntityFramework.dll"। एंटिटी फ्रेमवर्क शब्दजाल में "एंटाइटिस" "डोमेन मॉडल" के रूप में "एंटिटीज" के समान नहीं हैं
फेडेरिको बेरासैटुई

मैं अपने डोमेन संस्थाओं को एक DTO में डुप्लिकेट करने के साथ ठीक हूँ, अगर यह लेता है, तो Automapper जैसे स्वचालित उपकरण का उपयोग करना। मुझे यकीन नहीं है कि दिन के अंत में कैसा दिखना चाहिए।
RJB

16
मैं जिमी Bogard के एनडीसी 2012 सत्र को देखने के लिए पर "दुष्ट डोमेन मॉडल क्राफ्टिंग" आप की सिफारिश करेंगे Vimeo । वह बताते हैं कि समृद्ध डोमेन क्या होना चाहिए और वास्तविक जीवन में उन्हें कैसे लागू किया जाए ताकि आपकी संस्थाओं में व्यवहार हो। उदाहरण बहुत व्यावहारिक हैं और सभी C # में हैं।
अलेक्सई ज़िमेरेव

धन्यवाद, मैं वीडियो के माध्यम से आधा हूं और यह अब तक सही है। मुझे पता था कि अगर यह गलत था, तो कहीं न कहीं "सही" जवाब होना चाहिए था ....
RJB

2
मैं जावा के लिए भी प्यार की मांग करता हूं: /
uylmz

जवाबों:


59

सबसे मददगार जवाब अलेक्सी ज़िमेरेव ने दिया और एक मॉडरेटर द्वारा कम से कम 7 अपवोट हासिल करने से पहले उसे अपने मूल प्रश्न से नीचे टिप्पणी में स्थानांतरित कर दिया…।

उसका जवाब:

मैं आपको जिमी बोगार्ड के एनडीसी 2012 सत्र "क्रिमिंग वुडन डोमेन मॉडल" को वीमो पर देखने की सलाह दूंगा। वह बताता है कि आपकी संस्थाओं में व्यवहार होने से वास्तविक डोमेन क्या होना चाहिए और वास्तविक जीवन में उन्हें कैसे लागू किया जाए। उदाहरण बहुत व्यावहारिक हैं और सभी C # में हैं।

http://vimeo.com/43598193

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

  • "अधिकांश अनुप्रयोगों के लिए ... हम नहीं जानते कि जब हम शुरू करते हैं तो वे जटिल होने जा रहे हैं। वे बस उसी तरह से बन जाते हैं।"
    • जटिलता स्वाभाविक रूप से बढ़ती है क्योंकि कोड और आवश्यकताओं को जोड़ा जाता है। सीआरयूडी के रूप में आवेदन बहुत सरल शुरू हो सकते हैं, लेकिन व्यवहार / नियम बेक किए जा सकते हैं।
    • "अच्छी बात यह है कि हमें जटिल शुरुआत नहीं करनी है। हम एनीमिक डोमेन मॉडल के साथ शुरुआत कर सकते हैं, यह सिर्फ प्रॉपर्टी बैग है, और सिर्फ मानक रीफैक्टरिंग तकनीकों के साथ हम एक सच्चे डोमेन मॉडल की ओर बढ़ सकते हैं।"
  • डोमेन मॉडल = व्यावसायिक वस्तुएँ। डोमेन व्यवहार = व्यावसायिक नियम।
  • व्यवहार अक्सर एक आवेदन में छिपा होता है - यह पेजलोड, बटन 1_क्लिक में हो सकता है, या अक्सर 'फूमैनगर' या 'फूएस सर्विस' जैसे सहायक वर्गों में।
  • व्यावसायिक नियम जो डोमेन ऑब्जेक्ट्स से अलग होते हैं, "हमें उन नियमों को याद रखने की आवश्यकता होती है"।
    • ऊपर मेरे व्यक्तिगत उदाहरण में, एक व्यवसाय नियम WorkItem.StatusHistory.Add () है। हम केवल स्थिति नहीं बदल रहे हैं, हम इसे ऑडिटिंग के लिए संग्रहीत कर रहे हैं।
  • डोमेन व्यवहार "एक परीक्षण के एक गुच्छा लिखने की तुलना में बहुत आसानी से एक आवेदन में कीड़े को खत्म करते हैं।" टेस्ट आपको उन परीक्षणों को लिखने के लिए जानना आवश्यक है। डोमेन व्यवहार आपको परीक्षण करने के लिए सही रास्ते प्रदान करते हैं
  • डोमेन सेवाएं "विभिन्न डोमेन मॉडल संस्थाओं के बीच गतिविधियों के समन्वय के लिए सहायक कक्षाएं हैं।"
    • डोमेन सेवाएं! = डोमेन व्यवहार। संस्थाओं का व्यवहार है, संस्थाओं के बीच डोमेन सेवाएं सिर्फ मध्यस्थ हैं।
  • डोमेन ऑब्जेक्ट्स के लिए आवश्यक बुनियादी ढांचे का कब्ज़ा नहीं होना चाहिए (यानी IOfferCalculatorService)। बुनियादी ढांचा सेवा का उपयोग करने वाले डोमेन मॉडल में पारित किया जाना चाहिए।
  • डोमेन मॉडल आपको यह बताने की पेशकश करनी चाहिए कि वे क्या कर सकते हैं, और उन्हें केवल उन चीजों को करने में सक्षम होना चाहिए।
  • डोमेन मॉडल के गुणों को निजी निवासियों के साथ संरक्षित किया जाना चाहिए, ताकि केवल मॉडल अपने स्वयं के व्यवहार के माध्यम से अपने गुणों को निर्धारित कर सके । अन्यथा यह "उचित" है।
  • एनीमिक डोमेन मॉडल ऑब्जेक्ट, जो कि केवल ओआरएम के लिए संपत्ति बैग हैं, केवल "एक पतली लिबास - डेटाबेस पर एक जोरदार टाइप किया गया संस्करण है।"
    • "हालांकि, एक डेटाबेस पंक्ति को किसी ऑब्जेक्ट में प्राप्त करना आसान है, यही हमें मिला है।"
    • 'अधिकांश दृढ़ वस्तु मॉडल बस यही हैं। एक एनेमिक डोमेन मॉडल बनाम एक ऐसे अनुप्रयोग के बीच क्या अंतर होता है, जिसमें वास्तव में व्यवहार नहीं होता है, यदि किसी वस्तु में व्यावसायिक नियम हैं, लेकिन वे नियम डोमेन मॉडल में नहीं पाए जाते हैं। '
  • "बहुत सारे अनुप्रयोगों के लिए, किसी भी प्रकार के वास्तविक व्यावसायिक अनुप्रयोग तर्क परत को बनाने की कोई वास्तविक आवश्यकता नहीं है, यह सिर्फ कुछ है जो डेटाबेस से बात कर सकता है और संभवतः उस डेटा का प्रतिनिधित्व करने का कुछ आसान तरीका है।"
    • तो दूसरे शब्दों में, यदि आप सभी कर रहे हैं कोई विशेष व्यापार वस्तुओं या व्यवहार नियमों के साथ CRUD, आप DDD की जरूरत नहीं है।

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


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

6

आपके प्रश्न का उत्तर नहीं दिया जा सकता है, क्योंकि आपका उदाहरण गलत है। विशेष रूप से, क्योंकि कोई व्यवहार नहीं है। कम से कम अपने डोमेन के क्षेत्र में नहीं। AddStatusUpdateविधि का उदाहरण एक डोमेन लॉजिक नहीं है, लेकिन लॉजिक उस डोमेन का उपयोग करता है। उस तरह का तर्क किसी तरह की सेवा के अंदर होने का मतलब है, जो बाहर के अनुरोधों को संभालता है।

उदाहरण के लिए, यदि आवश्यकता होती है कि किसी विशिष्ट कार्य आइटम में केवल विशिष्ट स्थितियाँ हो सकती हैं, या यह कि केवल N स्थितियाँ हो सकती हैं, तो वह डोमेन तर्क है और विधि के रूप में WorkItemया तो होना चाहिए StatusHistory

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

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

अंत में, मैं कुछ ओटी बात का उल्लेख करूंगा कि वास्तविक ओओपी डिजाइन वाला एक सच्चा डोमेन मॉडल वास्तव में एंटिटी फ्रेमवर्क का उपयोग करने के लिए निरंतर कठिन होगा। जबकि ORM को संबंधपरक लोगों के लिए वास्तविक OOP संरचना की मैपिंग के साथ डिज़ाइन किया गया था, अभी भी कई समस्याएं हैं, और रिलेशनल मॉडल अक्सर OOP मॉडल में लीक हो जाएगा। यहां तक ​​कि nHibernate के साथ, जिसे मैं EF से अधिक शक्तिशाली मानता हूं, यह एक समस्या हो सकती है।


अच्छे अंक। AddStatusUpdate विधि तब कहां होगी, डेटा या इन्फ्रास्ट्रक्चर में किसी अन्य परियोजना में? किसी भी व्यवहार का एक उदाहरण जो सैद्धांतिक रूप से WorkItem में हो सकता है? किसी भी psuedo- कोड या नकली की बहुत सराहना की जाएगी। मेरा उदाहरण वास्तव में अधिक पठनीय होने के लिए सरल किया गया था। अन्य इकाइयाँ हैं, और उदाहरण के लिए AddStatusUpdate में कुछ अतिरिक्त व्यवहार है - यह वास्तव में एक स्थिति श्रेणी का नाम लेता है, और यदि वह श्रेणी मौजूद नहीं है, तो श्रेणी बनाई जाती है।
RJB

@RJB जैसा मैंने कहा, AddStatusUpdate वह कोड है जो डोमेन का उपयोग कर रहा है। तो या तो किसी प्रकार का वेबसेवा या एप्लिकेशन जो डोमेन कक्षाओं का उपयोग करता है। और जैसा कि मैंने कहा, आप किसी भी तरह के मॉकअप या स्यूडोकोड की उम्मीद नहीं कर सकते हैं, क्योंकि आपको ओओपी डोमेन मॉडल का वास्तविक लाभ दिखाने के लिए बड़ी पर्याप्त जटिलता की पूरी परियोजना बनाने की आवश्यकता होगी।
वृहस्पति

5

आपकी धारणा है कि WorkItem के साथ जुड़े आपके व्यावसायिक तर्क को "वसा सेवा" में संलग्न करना एक अंतर्निहित विरोधी पैटर्न है, जो मैं तर्क देता हूं जरूरी नहीं है।

एनीमिक डोमेन मॉडल पर आपके विचारों के बावजूद, बिजनेस नेट की एक लाइन के मानक पैटर्न और व्यवहार विशिष्ट हैं, जो विभिन्न घटकों से मिलकर एक ट्रांजेक्शनल स्तरित दृष्टिकोण को प्रोत्साहित करते हैं। वे विशेष रूप से अन्य .NET घटकों के साथ-साथ विभिन्न प्रौद्योगिकी ढेर पर या भौतिक स्तरों पर घटकों के लिए एक सामान्य डोमेन मॉडल के संचार की सुविधा के लिए डोमेन मॉडल से व्यावसायिक तर्क को अलग करने के लिए प्रोत्साहित करते हैं।

इसका एक उदाहरण .NET आधारित SOAP वेब सेवा होगी जो सिल्वरलाइट क्लाइंट अनुप्रयोग के साथ संचार करती है जो कि DLL होती है जिसमें सरल प्रकार के प्रकार होते हैं। इस डोमेन एंटिटी प्रोजेक्ट को .NET असेंबली या सिल्वरलाइट असेंबली में बनाया जा सकता है, जहाँ इस डीएलएल वाले इच्छुक सिल्वरलाइट घटकों को ऑब्जेक्ट व्यवहार के संपर्क में नहीं लाया जाएगा जो केवल सेवा के लिए उपलब्ध घटकों पर निर्भर हो सकते हैं।

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


1
1) आप बिजनेस मॉडल को डोमेन मॉडल से कैसे अलग कर सकते हैं? यह वह डोमेन है जिसमें यह व्यावसायिक तर्क रहता है; उस डोमेन की इकाइयाँ उस व्यावसायिक तर्क से जुड़े व्यवहार को निष्पादित कर रही हैं। वास्तविक दुनिया में कोई सेवा नहीं है, और न ही वे डोमेन विशेषज्ञों के प्रमुखों में मौजूद हैं। 2) कोई भी घटक जो आपके साथ एकीकृत करना चाहता है, उसे अपना स्वयं का डोमेन मॉडल बनाने की आवश्यकता है, क्योंकि इसकी आवश्यकताएं अलग-अलग होंगी और इसका आपके डोमेन मॉडल पर एक अलग दृष्टिकोण होगा । यह एक लंबे समय तक चलने वाला फालेसी है जिसे आप एक डोमेन मॉडल बना सकते हैं जिसे आसपास साझा किया जा सकता है।
स्टीफन बिलिएट

1
@StefanBilliet वे सार्वभौमिक डोमेन मॉडल की गिरावट के बारे में अच्छे बिंदु हैं, लेकिन यह सरल घटकों और घटक बातचीत में संभव है जैसा कि मैंने पहले भी किया है। मेरी राय है कि डोमेन मॉडल के बीच अनुवाद तर्क बहुत थकाऊ और बॉयलरप्लेट कोड बना सकता है और अगर इसे सुरक्षित रूप से टाला जा सकता है तो यह एक अच्छा डिज़ाइन विकल्प हो सकता है।
maple_shaft

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

@StefanBilliet एक आदर्श दुनिया में मैं आपके साथ सहमत हूं जहां एक व्यापार विशेषज्ञ के पास डेवलपर्स के साथ बैठने का समय है। सॉफ्टवेयर उद्योग की वास्तविकता यह है कि व्यवसाय विशेषज्ञ के पास इस स्तर पर शामिल होने में कोई समय या रुचि नहीं है या इससे भी बदतर अभी तक डेवलपर्स से केवल अस्पष्ट मार्गदर्शन के साथ इसका पता लगाने की उम्मीद की जाती है।
maple_shaft

सच है, लेकिन यह वास्तविकता को स्वीकार करने का एक कारण नहीं है। ऐसी खोज जारी रखने के लिए डेवलपर्स के समय और (संभवतः प्रतिष्ठा) को बर्बाद करना है और ग्राहक का पैसा। मैंने जो कहा, वह एक ऐसा रिश्ता है जिसे समय के साथ बनाए जाने की जरूरत है; इसमें काफी मेहनत लगती है, लेकिन यह बेहतर परिणाम देता है। वहाँ एक कारण है कि "सर्वव्यापी भाषा" को अक्सर DDD का सबसे महत्वपूर्ण पहलू माना जाता है।
स्टीफन बिलिएट

5

मुझे एहसास है कि यह प्रश्न काफी पुराना है इसलिए यह उत्तर उत्तरोत्तर के लिए है। मैं सिद्धांत पर आधारित एक के बजाय एक ठोस उदाहरण के साथ जवाब देना चाहता हूं।

WorkItemवर्ग पर "काम की वस्तु स्थिति बदलने" को प्रोत्साहित करें:

public SomeStatusUpdateType Status { get; private set; }

public void ChangeStatus(SomeStatusUpdateType status)
{
    // Maybe we designed this badly at first ;-)
    Status = status;       
}

अब आपकी WorkItemकक्षा एक कानूनी स्थिति में खुद को बनाए रखने के लिए जिम्मेदार है। कार्यान्वयन बहुत कमजोर है, हालांकि। उत्पाद स्वामी सभी के लिए किए गए सभी स्टेटस अपडेट का इतिहास चाहता है WorkItem

हम इसे कुछ इस तरह बदलते हैं:

private ICollection<SomeStatusUpdateType> StatusUpdates { get; private set; }
public SomeStatusUpdateType Status => StatusUpdates.OrderByDescending(s => s.CreatedOn).FirstOrDefault();

public void ChangeStatus(SomeStatusUpdateType status)
{
    // Better...
    StatusUpdates.Add(status);       
}

कार्यान्वयन में भारी बदलाव आया है, लेकिन ChangeStatusविधि का कॉलर अंतर्निहित कार्यान्वयन विवरणों से अनजान है और स्वयं को बदलने का कोई कारण नहीं है।

यह एक समृद्ध डोमेन मॉडल इकाई, IMHO का एक उदाहरण है।

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