Swiz требует слабой инкапсуляции - PullRequest
1 голос
/ 04 февраля 2010

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

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

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 04 февраля 2010

Как я уже упоминал в списке рассылки, к сожалению, пути нет. Поскольку нет доступа к закрытым членам классов, единственный способ B использовать закрытые обработчики событий для событий. из A - это если addEventListener () вызывается изнутри B. Поскольку Swiz, очевидно, не работает в ваших классах, он не имеет доступа к этим членам.

Swiz стремится сохранить код вашего приложения как можно более свободным от ссылок (включая наследование) на классы Swiz. Поэтому вы можете думать об этом как о настройке вашего приложения «извне». В отличие от JVM, Flash Player просто не имеет доступа к закрытым членам, поэтому для взаимодействия Swiz с вашим кодом он должен быть общедоступным.

4 голосов
/ 05 февраля 2010

Вы также можете создать собственное пространство имен, которое делает их не обязательно общедоступными, но и не частными. Я использую то, что первоначально сделал 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 Processor и, возможно, в их метаданные 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 );

Делает код чистым и защищает его от публичного использования. Но некоторые люди думают, что это слишком много работы:).

Лучшее, Lance

0 голосов
/ 11 июня 2010

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

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

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

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

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

0 голосов
/ 05 февраля 2010

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

...