【问题标题】:Cross-component Communication within a View (MVC)视图内的跨组件通信 (MVC)
【发布时间】:2010-09-16 10:50:09
【问题描述】:

有哪些最佳实践可以协调视图中复杂组件之间的交互?

我说的不是组合框或网格控件之类的简单小部件,而是由多个小部件组成的组件,它们可能值得单独进行单元测试。

你会:

  1. 为每个组件定义抽象接口,让控制器通过依赖注入将它们连接起来,让它们通过方法调用直接相互通信? 组件因此知道其他组件的接口。
  2. 定义每个组件可以触发的事件并让控制器通过事件侦听器直接将它们连接起来? 因此,组件具有附加到其他组件的事件接收器的事件处理程序。
  3. 为每个组件定义抽象接口,定义它们可以触发的事件并让控制器监听所有事件并在接口上执行方法调用? 因此,这些组件与其他组件完全无关。
  4. 观察者模式的经典应用?
  5. 还有别的吗?

更新:我已经从 #1-3 中删除了“让控制器 ...”,因为在这些情况下,不一定是控制器必须执行路由/编排。它可能是视图本身。

我在最近的一个项目中采用了方法 #3,我对组件的解耦和单独的可测试性感到满意。但是,我有一种感觉,我可以简化组件的布线。在我的例子中,主 View 对象必须在每个组件上添加多个事件侦听器,然后在有时进行一些本地处理(例如与模型交谈)之后调用适当组件上的方法。添加事件处理程序的代码看起来有点乱,我特别在寻找一种干净的方法。

【问题讨论】:

    标签: model-view-controller design-patterns


    【解决方案1】:

    选项#3 听起来像中介者模式,当更新逻辑和对象之间的通信很复杂时,它通常是最好的方法。它还具有保持控制逻辑和初始化集中的额外优势,这往往使跟踪和调试这些类型的案例更容易。

    【讨论】:

      【解决方案2】:

      听起来您有知识回答自己的问题,但可能只是缺乏深入研究的信心。您只是在探索还是被困在某个地方?

      我要补充一点,您可以做的另一件事是在所有对象之间放置一个组件管理器以促进通信。过去,当我做过类似的事情时,管理对象最终只是从每个组件中获取数据,将数据合并在一起,然后将其作为一个大请求传递给模型。我的每个组件都有一个他们会调用并将数据传递到的委托,当然该委托的实现在我的组件管理器上。

      我还让该管理器对象充当网络的代理,我一直在等待复杂性变得更高,然后才遵守 SRP 并将该责任作为自己的类别。

      基本上你说的一切听起来都不错。我建议只是潜入并探索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-18
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        相关资源
        最近更新 更多