代码之家  ›  专栏  ›  技术社区  ›  Faisal Mansoor

Swiz要求弱封装

  •  1
  • Faisal Mansoor  · 技术社区  · 15 年前

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

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

    我是不是错过了什么,有没有办法绕过这个问题?我真的,不想污染我的类的公共接口。

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  5
  •   bclinkinbeard    15 年前

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

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

        2
  •  4
  •   Lance Pollard    15 年前

    您还可以创建一个自定义名称空间,使它们不必公开,也不必私有。我使用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 Processors 可能是为了他们 metadata 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 );
    

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

    最好的, 兰斯

        3
  •  0
  •   GManNickG    15 年前

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

        4
  •  0
  •   orlade    15 年前

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

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

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

    简而言之,在任何情况下,如果您有权访问私有事件侦听器(即在封闭组件中),您可能不会使用[中介]捕获事件,这样侦听器就可以保持私有。当您使用[mediate]标记时,事件处理程序通常位于应用程序中完全独立的位置(例如presenter-&g t;controller),在任何情况下,它都不可能是私有的。

    我可能有点不舒服,但在我看来就是这样。斯威兹梅 鼓励 在某些情况下封装很弱,但对我来说,它提供了更大的模块化。