循环依赖是好还是坏

我需要知道为什么我们需要避免循环依赖? 在现实世界中,如果我们认为,循环依赖是非常重要的。 就像一个朋友需要来自其他朋友的东西而另一个需要来自这位朋友的东西,所以它的那种圆形对吗?

那么为什么循环依赖是一个糟糕的设计? 如果我们真的需要避免这种情况,那么对于这种情况,面向对象世界中最好的设计是什么?

循环依赖的问题更像是鸡和蛋的问题。

如果你依赖我设置一些东西,我依靠你设置一些东西,我们该如何开始?

这个的必然结果是我们如何结束 – 如果我有你的资源的参考,你有我的参考,我永远不会清理,因为这会打破你,你不能清理,因为这会打破我。

两种情况下的答案都是引入一个中间人,将一方的依赖传递给他,所以如果你把资源转给中间人,你就会依赖我和中间人,我会依赖中间人。 因此你可以清理,因为你现在没有资源,我可以清理,因为没有人依赖我,然后中间人可以清理。

您需要意识到循环依赖意味着您只能同时使用相应的循环依赖类:如果您在AB之间有循环依赖关系,则不能在任何程序中独立使用AB 坚持你的问题:当然,你不需要其他两个朋友存在! 你所需要的只是某种方式来引用一些并以一种可能受其实际能力约束的方式与它们互动。

但是,通常可以让类的对象彼此使用而不会导致循环依赖。 为此,确定实际导致两个类/组件之间的依赖关系是很重要的(这些不完全等同,但提供完整的定义会有些冗长)。 在这些条件下, A取决于B

  1. A包含B类成员时。
  2. A派生自B型。
  3. A使用类型B的值作为函数签名的一部分时。
  4. A在其实现中使用B
  5. 我可能会在这里忘记一些事情(我记得有更多理由为什么要加入课程)。

当两个类之间存在循环依赖关系时,可能有办法打破这种依赖关系。 通常,可以通过将两个类中的一个拆分为基类和基类不依赖于其他类的派生类来打破依赖关系。 还有许多其他方法可以打破依赖周期。 约翰拉科斯的“大规模C ++”(1996)基本上都是关于中断依赖循环并激发循环依赖性为什么不好(我想,他不同意这种简化的表征)。

……是的,循环依赖坏的:

  1. 它们会导致程序包含不必要的function,因为拖动了不需要的东西。
  2. 它们使测试软件变得更加困难。
  3. 他们使得推理软件变得更加困难。
  4. 它们使得更换系统的部件变得更加困难。
  5. ……可能还有其他一些原因。

以上是从C ++的角度来看的。 循环依赖的一些原因可能不会[直接]存在于C中,但是相同的概念也大致适用于C.