【问题标题】:How to avoid cyclic calls from a flow?如何避免来自流的循环调用?
【发布时间】:2016-12-22 16:37:35
【问题描述】:

下面提到的有4个类-

  • A 类有 2 个方法 f1() 和 f2()。
  • B 类具有方法 f3()。
  • 具有方法 f4() 的 C 类。
  • D 类具有方法 f5()。

关于上面的类,以下是正确的 -

  1. f1() 调用 f3()。
  2. f3() 调用 f4()。
  3. f4() 调用 f5()。
  4. f5() 调用 f2()。

这是一个糟糕的设计吗?如果是,如何改进这种设计??

【问题讨论】:

  • 这取决于你的类代表什么以及方法在做什么。在一个好的设计中,每个类只知道它需要的类。在其他情况下,使用侦听器和事件。
  • 这些是 mvc 模式中的普通服务类。我的疑问是,当 A 类间接依赖 D 类时,为什么 A 类有 D 类需要的代码?
  • 为什么不返回一个值并根据返回调用函数:f1 调用 f3 并等待取决于其他调用 (f3->f4->f5) 的响应,然后 f1 调用 f5 ,他们都在同一个班级
  • 一些关于循环依赖的参考:stackoverflow.com/questions/37444940/…

标签: java design-patterns


【解决方案1】:

这取决于大小写,但在大多数情况下,您应该避免这样的设计。

我们需要更多关于类之间关系的信息。我认为,您可以通过使用观察者模式或使用返回语句来解决这种情况。

示例:

A contains B, C, D => in that case, B, C and D should not know each other

A contains B
B contains C
C contains D
D should not know A or B. In most cases D should not even know C.

MVC 模式: Model 包含原始数据,不需要调用 View 或 Controller 的函数。如果您需要观察模型的变化,请使用 obersver 模式 vor this(事件监听器)。

View 知道如何显示数据,并且在大多数情况下,当模型发生更改时,它会使用观察者模式来获得通知。

每个控制器都知道自己的视图,并且不能调用该视图的方法。控制器也知道模型并且可以更改数据。

M 不包含对 V 和 C 的直接引用 V 可以是 M 的观察者,并且有可能 V 知道 C 在大多数情况下,C 可以调用 M 和 V 的方法,V 调用 C,C 调用 M。

【讨论】:

  • 感谢 Jarlik 的回复。但是所有这些类都只是服务。我在jaco0646提到的链接中得到了答案。
  • 在你给出的例子中,我的情况是第二种情况,A包含B,B包含C,C包含D,D包含A参考。
【解决方案2】:

根据 jaco0646 在 cmets 部分分享的链接,我得到了以下解决方案。如果有人有不同的想法,请分享。

这种循环关系需要不断的觉知。大多数循环依赖都可以用这种方式重构:

1) 在上面的场景中,我们有 A 类和 D 类相互依赖,选择任何类,

2) 识别该类中 A 和 D 都依赖的方法,即在本例中为方法 f2()

3)将这些方法提取到一个新的类E中,

4) 使 A 和 D 都依赖于 E,

5) A 类和 E 类中的一个仍将依赖于另一个,但循环依赖将被消除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多