1

我刚开始使用 Swiz,似乎 Swiz 强迫你创建弱封装的类。Swiz 要求所有事件处理程序都是公开的,以便调解事件。

假设组件“A”调度了一些事件,我想在组件“B”中收听这些事件。传统上,我只会在“B”中的“A”上添加事件侦听器,而“B”中的所有事件处理程序都可以保密。但是,如果我使用 Swiz,我需要将所有处理程序、调解事件公开。

我在这里遗漏了什么吗,有没有办法绕过这个问题。我真的不想污染我班级的公共界面。

谢谢。

4

4 回答 4

5

正如我在邮件列表中提到的,不幸的是,没有办法绕过它。由于无法访问类的私有成员,B 可以对来自 A 的事件使用私有事件处理程序的唯一方法是从 B 内部调用 addEventListener()。由于 Swiz 显然不在您的类中运行,它没有办法访问这些成员。

Swiz 旨在使您的应用程序代码尽可能免于对 Swiz 类的引用(包括继承)。因此,您可以将其视为“从外部”配置您的应用程序。与 JVM 不同,Flash Player 不允许访问私有成员,因此 Swiz 要与您的代码交互,它必须是公开的。

于 2010-02-04T20:46:05.967 回答
4

您还可以创建一个自定义命名空间,使它们不一定是公共的,但也不是私有的。我使用 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 metadataSwiz Processors中,并且可能添加到它们的元数据 MediateQueue中。只要在正确的类中导入命名空间,动态引用方法的东西就会起作用:

所以在setUpMetadataTagMediateProcessor 的方法中(或在类的顶部):

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

使代码干净,并使事情不被公开。但是有些人认为这工作太多了:)。

最好的,兰斯

于 2010-02-05T10:51:52.493 回答
0

对于在类之外并与类分离以调用处理程序的东西,该方法不能是私有的。因此,您有两个选择:将它们公开并让 Swiz 调解它们(并获得所有松散耦合),或者将它们保持私有并且不使用事件调解。如果您认为值得(而且大多数人都这样做),请使用它。如果你不这样做,不要。

于 2010-02-05T03:50:30.583 回答
0

“Swiz 要求所有事件处理程序都是公开的,以便调解事件。”

确实如此,但 Swiz 的优势在于它不会(或多或少)强迫您选择任何设计,它只是提供了强大的工具(依赖注入、事件中介等),您可以选择在您认为合适的地方应用这些工具。

使用 Swiz 根本不需要使用 [Mediate] 标记 - 您仍然可以像往常一样使用 addEventListener() 并从私有方法中侦听(我相信您很清楚)。据我所知,Swiz 事件中介主要用于系统/应用程序级别的事件。如果您在单个组件或近亲组件中调用事件侦听器,您通常会使用标准事件侦听器。要在单独的、原本不相关的组件之间进行通信,您可以使用 Swiz 的中介处理消息。

简而言之,在您可以访问私有事件侦听器的任何情况下(即在关闭组件中),您可能不会使用 [Mediate] 来捕获事件,因此该侦听器可以保持私有。当您使用 [Mediate] 标记时,事件处理程序通常位于应用程序中完全独立的位置(例如演示者 -> 控制器),在任何情况下它实际上都不能是私有的。

我可能有点偏离,但这就是我的看法。Swiz 在某些情况下可能会鼓励弱封装,但对我来说,它提供了更大的整体模块化。

于 2010-06-11T05:22:15.600 回答