هل سبق لك أن وجدت نفسك أمام مهمة بناء شاشة قائمة بيانات تحتوي على خيارات بحث، فلاتر متعددة، وترقيم صفحات في تطبيق NestJS الخاص بك؟ غالبًا ما تتحول هذه المهام إلى تحدٍ برمجي، حيث يمكن أن يصبح الكود معقدًا ويصعب إدارته بمرور الوقت. لكن لا تقلق، لدينا حل ذكي يمكن أن يغير طريقة تعاملك مع هذه المشكلة جذريًا، ويُعرف باسم «نمط المعايير» (Criteria Pattern).

ماذا يعني هذا بالنسبة لك؟ ببساطة، بدلاً من كتابة كود معقد لكل فلتر أو خيار بحث جديد، يمكنك الآن بناء نقطة نهاية واحدة (endpoint) في تطبيقك قادرة على التعامل مع كل ذلك بطريقة أنيقة ومنظمة. هذا يعني وقت تطوير أقل، كود أنظف، وتطبيق أكثر استقرارًا.

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

باستخدام نمط المعايير، يمكنك إنشاء دالة تحكم (controller method) واحدة تستقبل جميع هذه المعلمات كـ«استعلامات» (query parameters) من عنوان URL. تقوم هذه الدالة بذكاء ببناء كائن فلتر (filter object) ديناميكيًا. على سبيل المثال، إذا كان المستخدم يبحث عن عنوان معين، يتم إضافة هذا الشرط إلى الفلتر. إذا كان يبحث عن كتب متوفرة، تتم إضافة شرط التوفر. وهكذا.

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

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