2010-05-18 12 views
67

मैं खून की कमी डोमेन मॉडल को समझने के लिए कोशिश कर रहा हूँ और क्यों वे माना जाता है कि एक विरोधी पैटर्न हैं।बचना कमजोर डोमेन मॉडल - एक असली उदाहरण

यहां एक असली दुनिया का उदाहरण है। नाम, लिंग, उपयोगकर्ता नाम, आदि

public class Employee 
{ 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public string Username { get; set; } 
    // Etc.. mostly getters and setters 
} 

अगला हम एक प्रणाली है कि आने वाली फोन कॉल और वेबसाइट पूछताछ ('सुराग के रूप में जाना घूर्णन शामिल है -

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

public void SubmitForm() 
{ 
    var lead = CreateLeadFromFormInput(); 

    var selectedEmployee = Kernel.Get<IEmployeeLeadRotationService>() 
           .SelectEmployee(lead); 

    Response.Write(employee.Name + " will handle your enquiry. Thanks."); 
} 

मैं वास्तव में इस दृष्टिकोण के साथ कई समस्याओं का सामना करना नहीं है, लेकिन माना जाता है कि यह कुछ है कि मैं चलाना चाहिए है:

public class EmployeeLeadRotationService : IEmployeeLeadRotationService 
{ 
    private IEmployeeRepository _employeeRepository; 
    // ...plus lots of other injected repositories and services 

    public void SelectEmployee(ILead lead) 
    { 
     // Etc. lots of complex logic 
    } 
} 

फिर हमारी वेबसाइट जांच प्रपत्र के पीछे पर हम इस तरह कोड है से चिल्लाना क्योंकि यह एनीमिक डोमेन मॉडल है।

लेकिन मेरे लिए इसकी स्पष्ट नहीं है जहां नेतृत्व रोटेशन सेवा में तर्क जाना चाहिए। क्या इसे लीड में जाना चाहिए? क्या यह कर्मचारी में जाना चाहिए?

रोटेशन सेवा के लिए सभी इंजेक्शन रिपॉजिटरीज आदि के बारे में क्या है - उन्हें कर्मचारी में इंजेक्शन कैसे दिया जाएगा, बशर्ते कि किसी कर्मचारी से निपटने के दौरान हमें इनमें से किसी भी भंडार की आवश्यकता नहीं है?

+0

+1 बड़ा सवाल! – mdma

+0

तो 'ILead' जैसा दिखता है, अगर यह स्पष्ट नहीं है। इसमें चयन करें कर्मचारी?) –

+0

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

उत्तर

49

इस मामले में यह एनीमिक डोमेन मॉडल नहीं बनता है। एक एनीमिक डोमेन मॉडल specifically about validating and transforming the objects है। तो इसका एक उदाहरण होगा यदि बाहरी कार्य ने वास्तव में कर्मचारियों की स्थिति को बदल दिया या उनके विवरण अपडेट किए।

इस मामले में क्या हो रहा है यह है कि आप सभी कर्मचारियों को ले रहे हैं और उनकी जानकारी के आधार पर उनमें से एक का चयन कर रहे हैं। यह एक अलग वस्तु है कि दूसरों की जांच करें और जो भी पाता है उसके संबंध में निर्णय लेना ठीक है। ऑब्जेक्ट को ठीक करना ठीक नहीं है जिसका उपयोग ऑब्जेक्ट को एक राज्य से दूसरे में बदलने के लिए किया जाता है।

अपने मामले में एक खून की कमी डोमेन मॉडल का एक उदाहरण एक बाहरी विधि

updateHours(Employee emp) // updates the working hours for the employee 

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

+0

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

+0

'अपडेटहोर्स 'कर्मचारी वर्ग में आता है। आपको घंटे अपडेट करने के लिए आवश्यक कोई भी डेटा पास करना चाहिए, उदाहरण के लिए जो कार्य पूरा हो गया था। सहयोगी वस्तुएं भी ठीक हैं, लेकिन अधिमानतः कोई सेवाएं नहीं। – MauganRa

29

मुझे लगता है कि आपका डिज़ाइन ठीक है। जैसा कि आप जानते हैं, एनीमिक डोमेन मॉडल एंटी-पैटर्न डोमेन ऑब्जेक्ट्स में कोड किए गए किसी भी व्यवहार से बचने की प्रवृत्ति के खिलाफ एक प्रतिक्रिया है। लेकिन इसके विपरीत इसका मतलब यह नहीं है कि सभी किसी डोमेन ऑब्जेक्ट से संबंधित व्यवहार उस ऑब्जेक्ट द्वारा encapsulated किया जाना चाहिए।

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

+5

बिल्कुल। यह एक आंतरिक मॉड्यूल (LeadQueueManager या जो भी) वास्तविक आंतरिक तर्क के साथ वास्तविक है - यह बिल्कुल एक एनीमिक डोमेन मॉडल नहीं है। कॉल कतार शेड्यूलिंग के बारे में कर्मचारी को क्या पता है? कुछ नहीं;) – TomTom

13

यह सब आपके सिर में है - डोमेन मॉडल का हिस्सा बनने के लिए रोटेशन सेवा पर विचार करें और समस्या भंग हो जाती है।

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

बस "संगठन। उपयोगकर्ता समर्थन विभाग" जैसे कुछ "रोटेशन सेवा" का नाम बदलकर यह स्पष्ट हो जाता है।

0

यदि आपके डोमेन मॉडल में केवल भूमिकाएं और चीजें हैं, न कि व्यवहार के रूप में गतिविधियां, तो यह एनीमिक है। हालांकि, मैं मॉडल के संबंध में ऑब्जेक्ट के संबंध में व्यवहार के बारे में बात कर रहा हूं। मैं एक और जवाब में उनके बीच के अंतर की बात करते हैं ... https://stackoverflow.com/a/31780937/116442

अपने प्रश्न से, आप अपने पहले दो डोमेन विश्लेषण मॉडलिंग नियमों को तोड़ने: -

  1. व्यवहार के रूप में (रिकॉर्ड) क्रियाएँ मॉडलिंग की दिल में हैं एक डोमेन मॉडल का। उन्हें पहले जोड़ें।
  2. क्लास के रूप में मॉडल डोमेन गतिविधियां, तरीकों से नहीं।

मैं मॉडल को "पूछताछ" जोड़ दूंगा। इसके साथ मॉडल में व्यवहार होता है, और बाहरी नियंत्रक या स्क्रिप्ट के बिना वस्तुओं के समूह के रूप में गठबंधन और काम कर सकता है।

EnquiryHandlerModel

संबंधित मुद्दे