Apache flex Swiz要求弱封装

Apache flex Swiz要求弱封装,apache-flex,actionscript-3,frameworks,encapsulation,swiz,Apache Flex,Actionscript 3,Frameworks,Encapsulation,Swiz,我刚开始使用Swiz,而且,似乎Swiz强迫您创建具有弱封装的类。Swiz要求所有事件处理程序都是公共的,以便调解事件 假设组件“A”分派了一些事件,我想在组件“B”中侦听这些事件。传统上,我只在“B”中的“A”上添加事件侦听器,“B”中的所有事件处理程序都可以保持私有。但是,如果我使用的是Swiz,我需要将所有处理程序、中介事件公开 我是否遗漏了什么,是否有办法绕过这个问题。我真的不想污染我班级的公共界面 谢谢。正如我在邮件列表中提到的,不幸的是,没有办法。由于无法访问类的私有成员,因此B可以

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

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

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


谢谢。

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


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

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


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

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

对于类之外并与类解耦以调用处理程序的内容,该方法不能是私有的。因此,您有两种选择:将它们公开并让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
}
然后,您必须将
使用命名空间元数据
添加到。只要名称空间导入到正确的类中,动态引用方法的东西就会起作用:

因此,在MediateProcessor中的
setUpMetadataTag
方法中(或在类的顶部):

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

最好的,
Lance

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

因此,在MediateProcessor中的
setUpMetadataTag
方法中(或在类的顶部):

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

最好的, Lance

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

没错,但Swiz的优势在于它不会强迫您做出任何(或多或少)的设计选择,它只提供了强大的工具(依赖注入、事件调解等),您可以选择在您认为合适的地方应用这些工具

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

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

我可能有点不对劲,但在我看来是这样的。在某些情况下,Swiz可能会鼓励弱封装,但对我来说,它总体上提供了更大的模块化。

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

没错,但Swiz的优势在于它不会强迫您做出任何(或多或少)的设计选择,它只提供了强大的工具(依赖注入、事件调解等),您可以选择在您认为合适的地方应用这些工具

使用Swiz根本不需要使用[Mediate]标记-您仍然可以使用addEventListener()并像通常一样从私有方法进行侦听(我相信您已经很清楚)。据我所知,Swiz甚至