循环依赖是好还是坏

Nip*_*pun 8 c c++ circular-dependency

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

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

gbj*_*anb 14

循环依赖的问题就像鸡和蛋的问题.

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

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

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

  • 很好的通用答案,避免了可能处理部分复杂性的语言特定操作的陷阱,以及我所知道的所有情况下的有用模式。+1 (2认同)

Die*_*ühl 5

您需要意识到循环依赖意味着您只能将相应的循环依赖类一起使用:如果您在A和之间存在循环依赖B,则您不能在任何程序中使用AB独立。坚持你的问题:当然,你不需要另外两个朋友存在!您所需要的只是某种方式来引用某些人并以某种方式与他们互动,这种方式可能会受到他们实际能力的限制。

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

  1. A包含类型为 的成员时B
  2. A从 type 派生时B
  3. A使用类型值B作为函数签名的一部分时。
  4. A使用B在其实施。
  5. 我可能在这里忘记了一些东西(我记得有更多的原因为什么类会被耦合)。

当两个类之间存在循环依赖时,可能有办法打破这种依赖。通常,可以通过将两个类之一拆分为基类和派生类(基类不依赖于另一个类)来打破依赖关系。还有许多其他方法可以打破依赖循环。John Lakos 的“Large Scale C++”(1996 年)基本上都是关于打破依赖循环和激励为什么循环依赖是不好的(我猜,他会不同意这种简化的表征)。

...而且,是的,循环依赖不好的:

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

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