【发布时间】:2011-02-01 20:56:47
【问题描述】:
我正在使用一个应用程序,该应用程序最初旨在大量使用静态变量和函数来强制对对象进行单例式访问。我一直在使用 Parsley 来分解这个项目中的一些耦合,我想开始使用静态函数。
我会先解释基本架构,然后我会问我的问题。
在此应用程序中存在一个发送/接收 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 请求的组件会像这样发送事件:
dispatchEvent(new WebRequestEvent(url, parameters, successHandler, errorHandler));
从那里,Parsley(或其他框架)将确保将事件发送到正确的位置,该位置可以处理功能并执行任何必要的操作。这也将让我成为引入更加划分的 MVC 架构的垫脚石,其中 Web 请求结果由模型处理,由框架注入到它们各自的视图中。
我想对跟踪功能做同样的事情。
使用基于事件的机制以及像 Parsley 这样的框架有什么缺点吗?坚持使用静态函数/变量并使用单例样式访问会更好吗?如果是这样,为什么?这最终会在未来造成更多的麻烦吗?
【问题讨论】:
-
我肯定会选择事件并使用命令模式架构来处理 Web 请求。触发一个事件 -> 创建一个命令对象 -> 执行。命令对象实例将处理请求和结果以及故障事件。这很容易实现,我稍后会写一个完整的答案。
-
我同意 Ian 的观点,即使用某种 MVC,其中有一个控制器负责捕获事件并执行相应的命令或命令链是一个不错的方法。我不认为仅仅为了避免单例或静态方法对你有帮助。此外,当涉及到 Flex 模块时,我还看到使用 MVC 框架时事情会变得一团糟的情况,因此如果您打算大量使用模块,请务必做好功课。 Cairngorm 可以工作,但你最终会得到很多不必要的 Event 类,幸运的是有人在我的工作内部构建了一个,更好。
-
您应该问的真正问题是:“我想通过更改为事件来解决什么问题?”。您是否在架构中遇到了一些限制,或者您只是想让代码更简洁?静态/单例本身并没有错。
-
@Glenn,我已经回答了这个问题:“此应用程序中希望发送 HTTP 请求的任何组件都必须通过 Web 实用程序类进行。这在此类之间产生了相当多的耦合“我从来没有暗示过单例或静态有什么问题,只是这种实现在应用程序之间创建了紧耦合,这会导致扩展和重构出现问题。
-
我想“扩展和重构的问题”是我认为缺失的。我倾向于过分热衷于重写/重构,所以我只是确保先比较优点/缺点。
标签: apache-flex events static-methods