Apache flex Flex中的静态函数或事件?

Apache flex Flex中的静态函数或事件?,apache-flex,events,static-methods,Apache Flex,Events,Static Methods,我正在使用一个应用程序,该应用程序最初设计为大量使用静态变量和函数对对象进行单例访问。在这个项目中,我一直在利用欧芹来分解一些耦合,我想开始逐步消除静态函数的使用 我将首先解释基本架构,然后提出我的问题 在这个应用程序中存在一个发送/接收HTTP请求的静态实用程序。当组件希望通过HTTP请求数据时,它调用此类中的静态函数: Utility.fetchUrl(url, parameters, successHandler, errorHandler); 此函数调用跟踪组件中的另一个静态函数,该函

我正在使用一个应用程序,该应用程序最初设计为大量使用静态变量和函数对对象进行单例访问。在这个项目中,我一直在利用欧芹来分解一些耦合,我想开始逐步消除静态函数的使用

我将首先解释基本架构,然后提出我的问题

在这个应用程序中存在一个发送/接收HTTP请求的静态实用程序。当组件希望通过HTTP请求数据时,它调用此类中的静态函数:

Utility.fetchUrl(url, parameters, successHandler, errorHandler);
此函数调用跟踪组件中的另一个静态函数,该函数监视请求花费的时间、发送的数量等。该调用在实用程序类中看起来非常类似:

public static function fetchUrl( ... ):void {
    Tracker.startTracking(url, new Date());
    ...
    Tracker.stopTracking(url, new Date());
}
此应用程序中任何希望发送HTTP请求的组件都必须通过web实用程序类发送HTTP请求。这在这个类和其他组件之间创建了相当多的耦合,这只是存在对静态函数依赖的几个例子中的一个。当我们扩展和重构系统时,这会导致问题:我想使用事件将其解耦

最后,我希望每个组件实例化一个定制事件,该事件被分派到高级框架。从那里,框架本身将把事件转发到正确的位置。换句话说,那些需要执行HTTP请求的组件将发送如下事件:

dispatchEvent(new WebRequestEvent(url, parameters, successHandler, errorHandler));
从那里,Parsley(或其他框架)将确保事件被发送到正确的位置,该位置可以处理功能并执行任何必要的操作。这也将使我能够作为一个跳板,引入一个更加划分的MVC体系结构,其中web请求结果由模型处理,由框架注入到各自的视图中

我想对跟踪功能也这样做


使用基于事件的机制,再加上类似欧芹这样的框架,是否有缺点?坚持使用静态函数/变量并使用单例风格的访问是否更好?若然,原因为何?这会不会在未来造成更多的麻烦呢?

因此,请简要回答以下问题:

  • 在使用事件时,系统的权重稍微增加。听众、冒泡、捕捉等。。所有这些都必须由系统管理。当您处于显示层次结构之外时,问题会小得多,但仍然比直接函数更昂贵。(再一次,避免预优化,所以要正确,然后快速)

  • “软”循环依赖可能发生在复杂的异步系统中。这意味着您最终会遇到一个事件触发的情况。B通知A已更改,因此更新C.C会触发事件。D注意到C已更改并更新A。通常不会使CPU达到最大值,但仍然是一个非终止循环

  • 有时您需要对函数进行强制缓冲/锁定。假设组件A和B都触发相同的事件。您可能不希望C被触发两次(例如,从服务器获取新数据),所以您必须确保C被标记为“忙”或其他什么

  • 从个人经验来看,我没有发现事件系统存在任何其他问题。我在一个相对复杂的系统中使用PureMVC框架,没有任何问题


    祝你好运

    那么,简短地回答以下问题:

  • 在使用事件时,系统的权重稍微增加。听众、冒泡、捕捉等。。所有这些都必须由系统管理。当您处于显示层次结构之外时,问题会小得多,但仍然比直接函数更昂贵。(再一次,避免预优化,所以要正确,然后快速)

  • “软”循环依赖可能发生在复杂的异步系统中。这意味着您最终会遇到一个事件触发的情况。B通知A已更改,因此更新C.C会触发事件。D注意到C已更改并更新A。通常不会使CPU达到最大值,但仍然是一个非终止循环

  • 有时您需要对函数进行强制缓冲/锁定。假设组件A和B都触发相同的事件。您可能不希望C被触发两次(例如,从服务器获取新数据),所以您必须确保C被标记为“忙”或其他什么

  • 从个人经验来看,我没有发现事件系统存在任何其他问题。我在一个相对复杂的系统中使用PureMVC框架,没有任何问题


    祝你好运

    我肯定会使用事件,并为web请求使用命令模式体系结构。触发事件->创建命令对象->执行。命令对象实例将处理请求和结果以及故障事件。这很容易实现,我稍后会写一个完整的答案。我同意Ian的观点,使用某种MVC,其中有一个控制器负责捕获事件并执行相应的命令或命令链是一种很好的方法。不过,我不认为仅仅为了避免使用单例或静态方法就一定会对您有所帮助。此外,我还看到过一些情况,当涉及到Flex模块时,使用MVC框架会让事情变得一团糟,所以如果您计划大量使用模块,一定要做好准备。Cairngorm可以工作,但你最终会得到很多不必要的事件类,幸运的是有人在我的工作中构建了一个内部类,更好。你应该问的真正问题是:“通过更改为事件,我试图解决什么问题?”。您是否在体系结构中遇到了一些限制,或者只是想让代码更干净?statics/singleton没有本质上的错误。@Glenn,我已经回答了这个问题:“这个应用程序中任何想要发送HTTP请求的组件都必须通过web实用程序类来发送。这在这个类和其他组件之间产生了相当多的耦合,这只是其中的一个例子