سؤال

أحاول أن أفهم نماذج مجال الفقر ولماذا من المفترض أنها مضادة للانهيار.

هنا مثال في العالم الحقيقي.

لدي فصل موظف ، يحتوي على الكثير من الخصائص - الاسم ، الجنس ، اسم المستخدم ، إلخ

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

بعد ذلك ، لدينا نظام يتضمن تدوير المكالمات الهاتفية الواردة واستفسارات الموقع (المعروف باسم "العروض") بالتساوي بين موظفي المبيعات. هذا النظام معقد للغاية لأنه يتضمن استفسارات مستديرة ، والتحقق من الإجازات ، وتفضيلات الموظفين وما إلى ذلك. لذلك يتم فصل هذا النظام حاليًا إلى خدمة: extreeeleadrotationservice.

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

يأخذ ذلك كائن الموظف ويقوم بتحديث ساعات عمله لهذا الأسبوع ، مع التأكد من رفع الأعلام إذا تجاوزت الساعات حد معين. المشكلة في ذلك هي أنه إذا كان لديك فقط كائنات موظف ، فلن تكون لديك أي معرفة بكيفية تعديل ساعاتها ضمن القيود الصحيحة. في هذه الحالة ، ستكون طريقة التعامل معها هي نقل طريقة تحديث Hours إلى فئة الموظف. هذا هو جوهر النماذج النموذجية النموذجية لفقر الدم.

نصائح أخرى

أعتقد أن التصميم الخاص بك على ما يرام هنا. كما تعلمون ، فإن نموذج النطاق لفقر الدم المضاد للانهيار هو رد فعل عنيف ضد اتجاه تجنب أي سلوك مشفر في كائنات المجال. ولكن على العكس هذا لا يعني الكل يجب تغليف السلوك المتعلق بكائن المجال بواسطة هذا الكائن.

كقاعدة عامة ، يمكن تضمين السلوك المرتبط بشكل جوهري بكائن المجال ويتم تعريفه بالكامل من حيث مثيل كائن المجال هذا في كائن المجال. خلاف ذلك ، لإبقاء المسؤوليات واضحة ، من الأفضل وضعها خارجيًا في متعاون/خدمة كما فعلت.

كل شيء في رأسك - ضع في اعتبارك أن تكون خدمة الدوران جزءًا من نموذج المجال وتذوب المشكلة.

يحتاج التناوب إلى الاحتفاظ بمعلومات حول العديد من الموظفين ، لذلك فهو لا ينتمي إلى أي وقت مضى ، ولا إلى أي كائن موظف واحد. لا تستحق أن تكون كائن المجال في حد ذاته.

ما عليك سوى إعادة تسمية "Rotationservice" إلى شيء مثل "Organization.usersupportDepartment" يجعل الأمر واضحًا.

إذا كان نموذج المجال الخاص بك يحتوي على أدوار وأشياء فقط ، وليس الأنشطة كسلوك ، فهو فقر الدم. ومع ذلك ، أنا أتحدث عن السلوك فيما يتعلق نموذج ليس هدف. أتحدث عن الفرق بينهما في إجابة أخرى ... https://stackoverflow.com/a/31780937/116442

من سؤالك ، تقوم بتكسير أول قواعد نمذجة تحليل المجال:-

  1. السلوك على غرار الأنشطة (المسجلة) في قلب نموذج المجال. أضفها أولاً.
  2. أنشطة النموذج النموذجية كطبقات ، وليس طرقًا.

أود أن أضيف نشاط "استفسار" إلى النموذج. مع ذلك ، يكون للنموذج سلوك ، ويمكن أن يجمع ويعمل كمجموعة من الكائنات بدون وحدة تحكم أو نص خارجي.

EnquiryHandlerModel

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top