سؤال

كيف يمكنك حل هذه المشكلة؟(في البداية بدا الأمر بسيطا، ثم وجدته محيرا).

  • لديك فئة تسمى Executor.لنفترض أن لديك العديد من مثيلاتها وأنهم يفعلون أشياء مختلفة عند استدعاء طريقة القيام بها (الوسيطة).
  • تحتوي الوسيطة على معلمتين مختلفتين وهما A* pa وB* pb (يمكن أن تكون إحداهما فارغة)
  • الآن، أريد مدير فئة يتلقى حالات الوسيطة ويعيد توجيهها إلى المثيل المناسب للمنفذ (دعنا نسمي هذه الطريقة تصفية).يتم ذلك بعد فترة من الزمن، حيث يقوم كل منفذ باستدعاء طريقة Manager.subscribe(A* pa, B* pb) ليخبر أي واحد منهم مهتم.لاحظ أن:إذا كانت pa أو (ليس كلاهما) pb فارغة، فهذا يعني أي (أعني إذا كانت pa فارغة، فسيتم تحديد pb فقط).وبالطبع لا يجب أن يكون هناك أكثر من منفذ واحد.
  • يجب أن يكون التنفيذ سريعًا، ويجب أن يكون الوضع المثالي متجهًا، أو شيء قريب مثل خريطة التجزئة...ولكن يجب إجراء المقارنة على محتويات pa وpb، وليس على قيمتها كمؤشرات.
  • أخيرًا،يجب أن يكون من الممكن إلغاء الاشتراك بواسطة المنفذ (دون الانتظار لفترة طويلة).على أي حال، أريد أن تكون عمليات التصفية والاشتراك وإلغاء الاشتراك سريعة جدًا.

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

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

المحلول

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

 class Subscription
 {
   GUID g;
   A_filter a;
   B_filter b;
   Executor *e;
 }

سيكون للاشتراك أيضًا طريقة "للتحقق" مما إذا كان يجب تشغيله بناءً على قيم معينة لـ A وB ثم استدعاء المنفذ على تلك المعلمات إذا كانت متطابقة.

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

عند إجراء بحث بناءً على (A، B)، إذا كان A أو B فارغًا، يمكنك إجراء البحث في جدول التجزئة الآخر وتشغيل الاشتراك الذي تم إرجاعه.إذا لم يكن أي من A أو B خاليًا، تصبح الأمور أكثر صعوبة.

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

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