كم يجب أن يكون المنطق في المجال الخاص بك نموذج الكائنات

StackOverflow https://stackoverflow.com/questions/473617

سؤال

انتهيت للتو من قراءة هذا المنصب قبل غريغ الشباب ، حيث كان يتحدث عن Microsoft توصي أنماط مع البكم نقل البيانات الكائنات.وهو يعني أن في جافا المجتمع الأمور تتجه في الاتجاه الآخر.

سؤالي هو: كم يجب أن يكون المنطق في كيان الأجسام ؟ فلسفتنا حيث أعمل (C# متجر) هو أنه إذا كنت لا يمكن إجراء تسلسل أنه لا تضعه في الكيان.

هل كانت مفيدة؟

المحلول

مات ،

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

الآن الإجرائية البرمجية في نموذج المجال.إذا كنت ترغب في استخدام أكثر إجرائية النمط الذي على ما يرام ولكن استخدام شيء مثل وحدة الجدول أو السجل النشط نمط.ليس عدم وجود OO ذلك أنا أفكر في أن تكون مدمرة جدا في التوجيه ولكن استخدام نموذج المجال مع الإجرائية المنطق.

يؤدي هذا واحد لقضاء كمية كبيرة من الموارد في بناء طبقة مجال (مقاومة عدم تطابق الفكر الوقت في عملية بناء المجاميع ، والعزلة ، في كل مكان لغة الخ) دون تلقي أي من فوائد هذا المجال طبقة (عموما الصيانة) أن ينص على خلاف ذلك.وبعبارة أخرى بينما كنت قد تلبي المتطلبات الوظيفية على ما يرام في نهاية المطاف انفاق كمية كبيرة من الميزانية الخاصة بك مع ما يقرب من أي العودة.

الآن العودة إلى ما "السلوك" أود أن أركز على السؤال من وجوه المنحى بدلا من "المجال يحركها التصميم" وجهة نظر.كائن عموما سوف تغلف بعض الدولة عموما فضح بعض السلوكيات.

سريعة تأكيد:تغلف الدولة ، فضح السلوك

فما السلوكيات يجب كائن ؟ ببساطة يجب أن تكون السلوكيات التي تعمل عند الدولة هو التغليف.في مثالية السلوكية OO العالم الدولة لن يكون مكشوف من جسم فقط السلوكيات.وضع تكتيكيا في المدونة إذا نبدأ في رؤية رمز مثل:

Customer c = GetCustomerFromRepository();
c.Status = CustomerStatuses.Deleted;
c.LastUpdated = DateTime.Now;
c.UpdatedBy = GetCurrentUser();
CustomerRepository.Save(c);

لدينا SRP انتهاك ...هذا الرمز هو رمز ينبغي أن يكون سلوك الكائن العملاء لأن "المسؤولية" من العملاء الكائن.

تغلف الدولة عن العملاء و فضح السلوكيات.

على هذا النحو يمكننا أن نرى أن نكون أفضل حالا وجود العملاء.حذف الأسلوب ().(نعم هذا هو مثال سيء أعلم ...)

الآن ونحن سوف أيضا الحصول على ذلك باستخدام TDD.فمن الأسهل بكثير بالنسبة لنا للتعامل في الاختبارات مع التماس أن سلوك يوفر من طبقات حيث كل دولة تتعرض لها.والسبب في ذلك هو أنني لا أحتاج إلى تكرار المنطق في بلدي التجارب.رمز العميل لا الرعاية كيفية حذف يعمل ...فإنه يهتم فقط أن العميل يفضح السلوك.في تجاربنا بدلا من مؤكدين أن ج.الدولة == CustomerStates.حذف و ج.UpdatedBy==GetCurrentUser() الخ الخ نحن ببساطة يؤكدون أن طريقة حذف كان يسمى على العملاء التماس باستخدام وهمية.

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

هل هذا يساعد على توضيح الأمور قليلا ؟

جريج

نصائح أخرى

إذا كنت تدعو لهم "نموذج المجال الكائنات" ثم انني سوف نفترض أن كنت تشير إلى فاولر المجال نموذج النمط. http://martinfowler.com/eaaCatalog/domainModel.html

وبالنظر إلى هذا الافتراض ، ثم الجواب على سؤالك هو "كل منطق الأعمال" لأن ذلك هو الأساس تعريف النمط.

للأسف مصطلح "نموذج المجال" يبدو أنه قد تم تخفيفه في الآونة الأخيرة فقط يعني كائن نموذج البيانات الخاصة بك مع أي سلوك.

إذا كنت لم تكن قد فعلت ذلك ، وأود أن أشجعكم على قراءة PoEAA وتقرر أين كنت تعتقد أن المجال المنطق ينتمي في الوضع الخاص بك.إذا كنت اتخاذ قرار بشأن نموذج المجال ، ثم أود أن أشجعكم على قراءة إيفان DDD الكتاب والتعرف على الفروق بين الكيانات قيمة الأشياء والخدمات.

على أمل أن يساعد!

مؤخرا, لقد تم اللعب مع فكرة إنشاء المجال النماذج التي لديها هيكل فقط تلك السلوكيات التي يتم تعميم هذا النموذج (أيالسلوكيات التي يمكن استخدامها عبر العديد يحدها السياقات) مع امتداد طرق سلوك معين يحدها السياق.استمر هذا المجال نماذج قريبة من DTO (لمن) و يقيد استخدام هذا المجال نموذج فقط يسمح السلوكيات داخل يحدها السياق.بحيث يمكن أن يكون خيار منتصف الطريق الاستجابة.:)

النقطة الرئيسية هي كيفية تحديد المنطق.لإعطاء بعض الأمثلة:

  1. لا تصنيف وظيفة getFullName() في شخص الكيان الذي يسلسل بعض سلاسل المنطق.
  2. حساب النظام البند قيمة من المرجح التأهل يجري المنطق.
  3. القيام ببعض الحجز المعاملات أود أن أقول بالتأكيد هو المنطق.

النقطة 1 و 2 ربما سوف يذهب إلى الكيان.النقطة 3 لا.لذا تعريف المنطق:

  • أي عملية أن يفعل أي استمرار الصلة (قراءة/كتابة)
  • أي العملية التي تنطوي على أي دولة أخرى (غير مباشرة ذات الصلة ، على سبيل المثالماجستير-التفاصيل) كيان

المنظمة البحرية الدولية ، أي من هذه العمليات لا تنتمي إلى كيانات.

الآن, لماذا/متى لن أضع أيضا النقطة 1 و 2 نوع العمليات في الكيان ؟ إنه بالأحرى الحالة نادرة, ولكن لا تفعل ذلك في أقرب وقت كما البيانات المخزنة في الكيان يحتاج إلى تفسير في بعض الطريق قبل أن يتم استخدامها من قبل التطبيق (على سبيل المثالإذا اعتمادا على المستخدم الحالي, محتوى الحقل X له معنى مختلف) ، هذا يعني أن الكيان البيانات نفسها ينتج بعض المنطق.

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

الطريقة أحاول أن ننظر في الأمر هو محاولة لجعل بلدي نماذج تكون دال ممكن.حاول دائما التفكير في كيفية النموذج وسوف تستخدم إذا كان فيها إلى أن استدار إلى نظام مختلف حيث رمز العميل (أو التعليمات البرمجية باستخدام الكيان) قد تكون مختلفة.إذا كانت وظيفة ليست جزءا من كيان فإنه لا تزال تتصرف بنفس الطريقة تتبع نفس قواعد العمل?إذا كان الجواب لا ثم وظيفة يجب أن تذهب في الكيان.

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