anemic domain model - एनीमिक डोमेन मॉडल से बचें-एक वास्तविक उदाहरण




anemic-domain-model (3)

मैं एनीमिक डोमेन मॉडल को समझने की कोशिश कर रहा हूं और वे माना जाता है कि वे एक विरोधी पैटर्न क्यों हैं।

यहां एक असली दुनिया का उदाहरण है।

मेरे पास एक कर्मचारी वर्ग है, जिसमें गुणों का एक टन है - नाम, लिंग, उपयोगकर्ता नाम, आदि

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 class EmployeeLeadRotationService : IEmployeeLeadRotationService
{
     private IEmployeeRepository _employeeRepository;
     // ...plus lots of other injected repositories and services

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

फिर हमारी वेबसाइट पूछताछ फ़ॉर्म के पीछे के पास हमारे पास कोड है:

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

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

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

मुझे वास्तव में इस दृष्टिकोण के साथ कई समस्याएं नहीं आती हैं, लेकिन माना जाता है कि यह ऐसा कुछ है जिसे मुझे चिल्लाना चाहिए क्योंकि यह एक एनीमिक डोमेन मॉडल है

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

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


इस मामले में यह एक एनीमिक डोमेन मॉडल का गठन नहीं करता है। एक एनीमिक डोमेन मॉडल विशेष रूप से वस्तुओं को सत्यापित करने और बदलने के बारे में है । तो इसका एक उदाहरण होगा यदि बाहरी कार्य ने वास्तव में कर्मचारियों की स्थिति को बदल दिया या उनके विवरण अपडेट किए।

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

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

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

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


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

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


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

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

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