Вопрос

Я только начал использовать Swiz, и, похоже, Swiz заставляет вас создавать классы со слабой инкапсуляцией.Swiz требует, чтобы все обработчики событий были общедоступными, чтобы выступать посредником между событиями.

Предположим, что компонент 'A' отправляет несколько событий, которые я хочу прослушать в компоненте 'B'.Традиционно, я просто добавлю прослушиватели событий на 'A' в 'B', и все обработчики событий в 'B' можно будет сохранить в тайне.Однако, если я использую Swiz, мне нужно сделать все обработчики, опосредующие события, общедоступными.

Я что-то здесь упускаю, есть ли способ обойти эту проблему?Я действительно не хочу загрязнять общедоступный интерфейс моего класса.

Спасибо.

Это было полезно?

Решение

Как я упоминал в списке рассылки, к сожалению, обойти это невозможно.Поскольку нет способа получить доступ к закрытым членам классов, единственный способ, которым B может использовать частные обработчики событий для событий из A - это если addEventListener() вызывается изнутри 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 в Процессоры Swiz, и , вероятно , к их метаданные MediateQueue.Пока пространство имен импортируется в правильные классы, будет работать что-то, динамически ссылающееся на метод:

так что в 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 опосредует их (и извлекает выгоду из всех слабых связей), или держите их в секрете и не используйте event-посредничество.Если вы считаете, что это того стоит (а большинство так и делают), используйте это.Если ты этого не сделаешь, то не делай.

"Swiz требует, чтобы все обработчики событий были общедоступными, чтобы выступать посредником между событиями".

Это правда, но сила Swiz в том, что она не навязывает вам никаких (более или менее) вариантов дизайна, она просто предоставляет мощные инструменты (внедрение зависимостей, посредничество в событиях и др.), которые вы можете применить там, где сочтете нужным.

Использование Swiz вообще не требует использования тега [Mediate] - вы все равно можете использовать addEventListener() и прослушивать из частных методов, как обычно (я уверен, вы хорошо знаете).Насколько я могу судить, Swiz event mediation предназначен в первую очередь для использования с событиями системного / прикладного уровня.Если вы вызываете прослушиватели событий внутри одного компонента или внутри компонентов близкого семейства, вы обычно используете стандартные прослушиватели событий.Для обмена данными между отдельными, никак не связанными компонентами вы можете обработать сообщение с помощью посредника Swiz.

Короче говоря, в любом случае, когда у вас есть доступ к частным прослушивателям событий (т.е.в закрытых компонентах), вы, вероятно, не использовали бы [Mediate] для захвата события, и чтобы слушатель мог оставаться закрытым.Когда вы используете тег [Mediate], обработчик событий обычно находится в совершенно отдельном месте в приложении (напримерpresenter -> controller), где он практически не мог быть приватным в любом случае.

Возможно, я немного не в себе, но мне кажется, что это так.Свиз может поощряйте слабая инкапсуляция в некоторых ситуациях, но для меня она предлагает большую модульность в целом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top