"控制器"和"gui"之间的循环依赖

Kon*_*rus 6 language-agnostic design-patterns circular-dependency

我正在用Java编写一个复杂的GUI,其中有许多组件在几个屏幕上工作,并与共享的逻辑和模型进行交互.显然,"gui"和"controller/logic"之间存在一些循环依赖关系:GUI中的用户操作被转发到控制器,控制器执行某些任务,然后需要在所有GUI中反映这些更改.在后台可能会发生一些事情,使控制器推送更新到GUI.等等.

现在,这是我的问题.监听器或观察器模式非常适合将更新推送到GUI.可以让我的GUI直接依赖于具体的控制器类吗?为什么/为什么不呢?有(并且总是会)只有一个这样的控制器.有像十几控制器调用的图形用户界面需要轮询状态和执行行动 - 我不爱的平凡回调接口少数那总是要的想法只有一个实现,也不是一个巨大的回调接口为所有各种行动.

Igb*_*man 6

可以让我的GUI直接依赖于具体的控制器类吗?为什么/为什么不呢?

否:因为松耦合是良好设计的基础.取决于抽象.根据实现,不可能在不重新编译依赖项的情况下将一个实现替换为另一个实现.紧密耦合任何两个类都会阻碍未来的灵活性.

是的:这是一个判断电话.如果松散耦合肯定没有未来的好处,并且太昂贵而无法证明,那么请将其结合起来.

但是真的尽量不要.让GUI依赖于控制器是一个有效的设计决策.但总是依赖于抽象,从不实现.来吧......你知道的.我的意思是,好吧,如果没有想要切换控制器,那么你没有通过使用接口获得任何东西.除了安心,知道你写了更整齐,更少耦合的代码.并且可以说更容易测试.

至于如何选择GUI和控制器之间的通信,这是一个折腾.您可以使用事件,但是将它们连接起来是一种阻力,它们不会跨越应用程序边界.但通过使用事件,您可能会觉得您有最松散的耦合.除了最初连接事件之外,GUI和控制器永远不需要相互寻址(抽象).那可能会感觉很好.或者你可以使用对接口的方法调用,这可能感觉像一个稍微紧凑的耦合,但它真的几乎没有.无论如何,X 必须知道Y的事情才能让他们沟通.

GUI和控制器之间的循环依赖是可以的(在抽象!).MVC模式有许多变体.每次我使用它,我都会根据自己的需要/情绪来塑造它.也就是说,我确实试图避免循环依赖.我更喜欢将依赖关系限制在一个方向.或者根本没有!

例如,在我当前的项目中,控制器知道视图,但视图完全不知道控制器退出.控制器会触发视图的事件,并通过视图绑定的单个状态对象将数据传回给它们.状态类是视图唯一依赖的东西.控制器唯一知道的是视图的界面和状态对象的类型.这些东西在外部模块中定义,以便可以完全删除视图模块,控制器仍然可以编译,反之亦然.这是一个非常松散的耦合.几乎没有(双方都取决于第三个模块).

有些人以另一种方式做到这一点.

避免具体依赖性的原因

  • 难以将一个实现交换为另一个 - 依赖可能需要修改或至少重新编译
  • 难以维护 - 无法相互独立地修改组件
  • 难以单独测试 - 需要修改和重新编译依赖以交换依赖的模拟实现

  • @Konrad:反对在两个组件之间引入双向依赖关系的主要论点是,之后它们不再是两个组件 - 它们已经成为一个更大的组件.如果这两个人已经注定要在其余时间内发展锁定步骤,​​那么这个集团可能不是什么大问题.但复杂性往往比元件尺寸上升速度快得多,所以我建议我们应该始终对抗闪光元件,即使当时的收益似乎微不足道. (3认同)