هل هناك طريقة أفضل من تسلسل IF للتعامل مع الأحداث؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

لقد ركضت مؤخرًا عبر العديد من الكائنات التي تم تنفيذها للتعامل مع الأحداث باستخدام رسم خرائط مشفر ثابت باستخدام هذا النمط:

public void handleEvent(Event event)
{
    if(event.getCode() == SOME_STATIC_EVENT)
        doSomething(event);
    if(event.getCode() == ANOTHER_STATIC_EVENT)
        doSomethingElse(event);
}

حيث يتم تنفيذ وظائف dosomething كطرق لنفس الفصل.

على أمل السعي لتحقيق الاقتران أكثر مرونة ، كيف تقترح استخلاص هذا النمط؟ أيضا ، ما هو أفضل طريقة لرسم الخرائط 0..n وظائف لحدث إطلاق النار؟

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

المحلول

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

EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
    h.handle(event);
}

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

نصائح أخرى

كان هناك مؤخرًا منشور SOF كان مشابهًا وقريبًا بما فيه الكفاية هنا يمكن أن تجيب على سؤالك جيدًا.

بدلاً من الجري ، ستجعل واجهة خاصة بك:

public abstract interface EventHandler
{
    public void run(Event event);
}

يمكنك البدء بجعل الكود أنظف قليلاً. استخدم متغيرًا محليًا لإخراج المتكرر event.getCode(). قم بالتبديل إلى التعدادات حتى تتمكن من الاستخدام switch.

إذا كان هناك نمط متكرر ، فيمكنك فك تشفير واجهة رد الاتصال المتعددة ، مثل AWT.

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

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