هو نمط المواصفات قديمة عندما يمكنك استخدام LinQ الديناميكي؟

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

سؤال

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


يحرر:

لقد وجدت بعض المشاركات التي تناقش الجمع بين LinQ ونمط المواصفات:

مشروع Linq المواصفات

تنفيذ نمط المواصفات عبر LinQ by Nicloas Blumhardt (Autofac Dude)

هل ذهب أي شخص هذا الطريق وهل تصبح معقدة للحفاظ على؟

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

المحلول

يستخدم LinQ الديناميكي تعبيرات السلسلة للسماح لبناء الاستعلام الديناميكي. لذلك نحن نفعل في الواقع تفقد السلامة من النوع هناك. في حين أن استخدام أنماط التفاف مثل نمط الديكور من التجسد ذات الصلة عن كثب، فإن نمط المواصفات، يسمح لنا بالحفاظ على السلامة من النوع في التعليمات البرمجية. أستكشف استخدام نمط Decorator كمجمع الاستعلام لإعادة استخدام الاستفسارات وبناء ديناميكيا. يمكنك العثور على مقالة على مشروع التعليمات البرمجية في:Linq query wrappers.

أو يمكنك التحقق من بلدي مقالات.

نصائح أخرى

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

ولكن بشكل نهائي، ستكون أكبر ميزة للمواصفات على LINQ أقرب إلى العمل، إنها DSL مصغرة. Linq بالنسبة لي هو DSL لاستعلام جمع، وليس للنشاط التجاري.

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

ما إذا كان Linq قد عيك تماما النمط، لا أستطيع أن أقول. ربما هناك حالات ركنية لا يمكن التعبير عنها في LINQ؟

Linq:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();

تخصيص:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
  • منطق الأعمال هو التغليف في المواصفات (مع اسم يكشف ما هو).
  • جاف: أنت لا تكرر أن LinQ عبر التعليمات البرمجية، يمكنك فقط استخدام المواصفات

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

مثال:

public class Customer
{
    //...

    public bool IsAbleToReceiveCredit(decimal creditValue)
    {
        var secureAge = this.Age > 18 && this.Age < 60;
        var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;

        return secureAge && personalAssetsGreaterThanCreditValue;
    }
}

هل هو من Customer ال المسؤولية أن تقرر ما إذا كان قادرا على تلقي بعض الائتمان؟ سوف يطلب البنك العميل إذا كان يستطيع الحصول على قرض؟

على الاغلب لا.

لذلك مع المواصفات يمكنك إزالة هذا المنطق من Customer (لا ينتمي إليها أبدا). يمكنك إنشاء شيء مثل IsAbleToReceiveCreditSpecification ووضع كل المنطق هناك. يمكننا أن نذهب أكثر والجمع بين المواصفات، على سبيل المثال: يمكنك إنشاء SecureAgeSpecification و AssetsGreaterThanSpecification واستخدامها لتكوين IsAbleToReceiveCreditSpecification.

لذلك لا أعتقد أن LINQ يحل محل المواصفات. في الواقع يحسن النمط. هناك بعض تطبيقات المواصفات التي تستخدم LINQ داخليا مع IQueriable<T>, ، مع هذا، يمكنك استخدام المواصفات داخل استفسارات orm الخاص بك على مستوى المستودع / dataacess.

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