我需要知道为什么我们需要避免循环依赖? 在现实世界中,如果我们认为,循环依赖是非常重要的。就像一个朋友需要来自其他朋友的东西,而另一个朋友需要来自这位朋友的东西,所以它的那种循环吧?
那为什么循环依赖是一个糟糕的设计呢? 如果我们真的需要避免这种情况,那么对于这种情况,面向对象世界中最好的设计是什么?
答案 0 :(得分:11)
循环依赖的问题很像鸡和蛋的问题。
如果你依赖我设置一些东西,我依靠你设置一些东西,我们该如何开始?
这个的必然结果是我们如何结束 - 如果我有你的资源的参考,你有我的参考,我永远不会清理,因为这会打破你,你不能清理,因为这会打破我
两种情况下的答案都是介绍一个中间人,将一方的依赖传递给他,所以如果你把你的资源转给中间人,你会依赖我和中间人,我会依赖中间人。因此你可以清理,因为你现在没有资源,我可以清理,因为没有人依赖我,然后中间人可以清理。
答案 1 :(得分:2)
您需要意识到循环依赖意味着您只能同时使用相应的循环依赖类:如果您在A
和B
之间存在循环依赖关系,则不能使用{ {1}}或A
独立于任何计划。坚持你的问题:当然,你不需要另外两个朋友存在!你所需要的只是某种方式来引用一些并以一种可能受其实际能力约束的方式与它们互动。
但是,通常可以让类的对象彼此使用而不会导致循环依赖。为此,确定实际导致两个类/组件之间的依赖关系是很重要的(这些不完全等同,但提供完整的定义会有些冗长)。在这些条件下,B
取决于A
:
B
包含A
类型的成员时。B
派生自A
类型时。B
使用类型为A
的值作为函数签名的一部分时。B
在其实施中使用A
。当两个类之间存在循环依赖关系时,可能有办法打破这种依赖关系。通常,可以通过将两个类中的一个拆分为基类和基类不依赖于其他类的派生类来打破依赖关系。还有许多其他方法可以打破依赖周期。 John Lakos"大规模C ++" (1996)基本上都是关于破坏依赖循环并激发循环依赖性为什么不好(我想,他会不同意这种简化的表征)。
...而且,是的,循环依赖 坏:
上面的内容是从C ++的角度出发的。循环依赖的一些原因可能不会[直接]存在于C中,但是相同的概念也大致适用于C.