سؤال

لقد بدأت للتو باستخدام Swiz، ويبدو أن SWIZ يجبرك على إنشاء فصول مع تغليف ضعيف. يتطلب Swiz جميع معالجات الحدث أن يكونوا عامين من أجل التوسط في الأحداث.

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

أنا أفتقد شيئا هنا، هل هناك طريقة لتجاوز هذه المشكلة. أنا حقا، لا أريد تلوث واجهة عامة من صفي.

شكرا.

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

المحلول

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

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

نصائح أخرى

يمكنك أيضا إنشاء مساحة اسم مخصصة تجعلها ليست بالضرورة عامة، ولكن ليس من القطاع الخاص أيضا. أنا أستخدم ما فعله Openflux في الأصل:

[Mediate(event="UserEvent.LOGIN")]
metadata function loginHandler(user:User):void
{
    ... with namespace
}

[Mediate(event="UserEvent.LOGOUT")]
public function logoutHandler(user:User):void
{
    ... without namespace
}

يجب عليك بعد ذلك إضافة use namespace metadata داخل ال معالجات سويز, ، وربما لأهمهم البيانات الوصفية ميديتايو. وبعد طالما يتم استيراد مساحة الاسم في الفصول الصحيحة، فإن شيئا يشير ديناميكيا إلى طريقة العمل ستعمل:

لذلك في setUpMetadataTag الطريقة في MediateProcessor (أو في الجزء العلوي من الفصل):

use namespace metadata;
// bean.source[mediateTag.host.name]
// service["loginHandler"] and service["logoutHandler"] both work
addMediatorByEventType( mediateTag, bean.source[ mediateTag.host.name ], eventType );

يجعل الكود نظيفا، ويحافظ على الأشياء من الجمهور. لكن بعض الناس يعتقدون أنه الكثير من العمل :).

أفضل، لانس

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

"يتطلب Swiz جميع معالجات الأحداث أن تكون عامة من أجل التوسط في الأحداث".

هذا صحيح، لكن قوة Swiz هي أنه لا يجبر أي خيارات تصميم (أكثر أو أقل) عليك، فإنه يوفر فقط أدوات قوية (حقن التبعية، وساطة الأحداث، وآخرون) أنه يمكنك اختيار التطبيق الذي تفكر فيه مناسبة.

لا يتطلب استخدام SWIZ استخدام العلامة [Mediate] على الإطلاق - لا يزال بإمكانك استخدام AddeventListener () والاستماع من الأساليب الخاصة كما كنت عادة (وأنا متأكد من أنك على دراية جيدا). بقدر ما أستطيع أن أقول، فإن الوساطة في حدث SWIZ المقصود في المقام الأول للاستخدام مع أحداث مستوى النظام / التطبيق. إذا كنت تدعو مستمعي الأحداث داخل مكون واحد، أو ضمن مكونات عائلة وثيقة، فستستخدم عادة مستمعي الأحداث القياسية. للتواصل بين المكونات الفردية، خلاف ذلك غير مرتبطة، يمكنك التعامل مع الرسالة مع وسيط السويس.

باختصار، في أي حال، يمكنك الوصول إلى مستمعي الأحداث الخاصة (أي داخل مكونات وثيقة)، فمن المحتمل ألا تستخدم [Mediate] لالتقاط الحدث، وبالتالي يمكن أن يبقى المستمع خاصا. عند استخدام العلامة [Mediate]، يعد معالج الأحداث بشكل عام في موقع منفصل تماما في التطبيق (على سبيل المثال مقدم العرض -> تحكم) حيث لا يمكن أن يكون عمليا خاصا في أي حال.

قد أكون متوقفا قليلا، لكن هذا هو كيف يبدو لي. سويز مايو يشجع التغليف ضعيف في بعض المواقف، ولكن بالنسبة لي يوفر تعديل أكبر بشكل عام.

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