【发布时间】:2012-04-06 06:24:15
【问题描述】:
背景
我们有一个相当复杂的 Silverlight 客户端,我们正在用 HTML/Javascript/CSS 重写它,构建在相同的 Web 服务之上。实际上,我们正在移植两个 Silverlight 不同的客户端,它们共享一些共同的功能。
我阅读了http://addyosmani.com/largescalejavascript/ 上的文章,并计划使用建议的架构,尤其是中介者模式。
Addy 描述的模式的 10000 英尺概览:
- 代码分为小模块
- 模块只知道中介对象;模块不能直接与其他模块通信
- 中介具有用于发布和订阅消息的简单界面
- 模块可以订阅消息(通过中介 API),提供回调函数
- 模块可以向中介者发布消息,带有参数对象,中介者调用任何订阅消息的模块的回调方法,传递参数对象
这里的主要目标之一是实现模块之间的松散耦合。所以我们可以重用两个客户端中的模块。并单独测试模块。中介者应该是我们唯一需要的全局对象,它必须是好的。
虽然我喜欢这个想法,但我觉得在某些情况下它过于复杂,而且我的一些团队成员不会被说服。让我举例说明:
假设我们有一个辅助函数来执行计算——假设它格式化一个字符串——并假设这个函数应该可用于任何模块。该函数可能属于“工具”或“帮助”模块,然后可重用和测试。
要从任意模块调用此函数,我必须发布一条消息,例如 formatString 以我的输入字符串作为参数。并且帮助函数订阅了 formatString 消息。但在我发布 formatString 消息之前,我首先必须使用回调函数订阅像 formatStringResult 这样的消息可以接收结果。然后,一旦我得到结果,我就取消订阅 formatStringResult 消息。
问题
- 中介是否应该直接在其自己的界面中提供此类帮助程序功能?
- 或者我应该扩展发布接口以允许可选的结果参数,帮助方法可以直接写入结果?
- 具有额外中介层的折衷方案真的值得吗? 实现松耦合的好处?
非常感谢具有在“复杂”JavaScript 应用程序中实现松耦合经验的开发人员的建议。
【问题讨论】: