问题标签 [circular-dependency]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
105 浏览

.net - 从不同的类更新 GUI?

也许这是一个非常基本的问题,如果是,请原谅我——我是 C# 的初学者。

我有一个用于向接收器发送命令的 WPF GUI。命令是 ASCII 文本。现在,我将通信部分分离到一个单独的项目中,因为除了 GUI 之外,我还有使用通信方法的控制台应用程序。通信 DLL 在普通套接字上使用异步方法。

现在的问题是我将有一个循环依赖。GUI 需要调用通信例程来发送消息,并且例程需要调用 GUI 来显示响应。我知道我可以创建一个通信继承的接口并绕过依赖关系,但这是最好的方法吗?或者这是我设计中的一个缺陷?我基本上想将 GUI 与底层通信层分离。

0 投票
4 回答
3514 浏览

c++ - boost::shared_ptr 与 weak_ptr 的循环中断

我目前处于这样的情况:

我知道这行不通,因为引用将继续指向彼此。我也被告知weak_ptr解决了这个问题。

但是,weak_ptr没有获取或->重载。我听说过“使用lock()”,但是任何人都可以给出如何正确执行此操作的代码示例吗?

0 投票
4 回答
649 浏览

visual-studio - 循环引用有必要吗?

我继承了一个 Visual Studio 解决方案,其中包含项目之间的大量循环引用。

有没有一种情况可以远程接受?

只是想证实我怀疑这个应用程序设计得很糟糕。提前致谢。

0 投票
4 回答
1012 浏览

c++ - C ++中的循环依赖(?)

我最初的怀疑是我的代码中存在循环依赖,并通过Resolve 标头包含循环依赖。但这并没有解决我的编译错误。这是具有 3 个类的代码 - A、G 和 N。

我在 Ah 和 A.cpp 中遇到了大约 10 个编译错误,我在下面列出了编译错误:

上述代码中的错误可能是什么?

提前谢谢你,
问候,
拉加瓦。

0 投票
5 回答
2134 浏览

c# - 设计问题 - 解决对象之间的循环依赖

我让自己陷入了两个类之间的循环依赖,我正在尝试提出一个干净的解决方案。

这是基本结构:

ContainerManager 作为 WCF 服务公开:客户端可以通过它创建项目和容器的外部点。ResourceManager 需要知道创建的新项目。它进行后台处理,有时它需要来自项目容器的信息。

现在,Container 需要有 ResourceManager(调用 ReportNewItem),它将从 ContainerManager 传递。ResourceManager 需要来自 Container 的信息,它只能通过 ContainerManager 获取。这会产生循环依赖。

我更喜欢使用接口(而不是具体对象)初始化对象,以便以后可以为单元测试创​​建模拟对象(例如创建模拟 ResourceManager),但我仍然遇到 CM 需要 RM 的问题它的 ctor,而 RM 的 ctor 中需要一个 CM。

显然,这是行不通的,所以我正在尝试提出创造性的解决方案。到目前为止,我有:

1)将要使用的Container传递给ReportNewItem,让ResourceManager直接使用。这很痛苦,因为 ResourceManager 会持续存储它知道的 ItemID。这意味着当在崩溃之后初始化 ResourceManager 时,我必须重新为其提供所需的所有容器。

2) 分两个阶段初始化 CM 或 RM:例如:RM = new RM(); CM = 新CM(RM);RM.SetCM(CM); 但我认为这很丑陋。

3) 使ResourceManager 成为ContainerManager 的成员。因此CM可以用“this”构造RM。这会起作用,但是当我想创建一个 RM 模拟时,在测试期间会很痛苦。

4) 用 IResourceManagerFactory 初始化 CM。让 CM 调用 Factory.Create(this),它将使用“this”初始化 RM,然后存储结果。为了测试,我可以创建一个模拟工厂,它将返回一个模拟 RM。我认为这将是一个很好的解决方案,但是为此创建一个工厂有点尴尬。

5) 将 ResourceManager 逻辑分解为 Container-specific 逻辑,并在每个 Container 中拥有不同的实例。不幸的是,逻辑确实是跨容器的。

我认为“正确”的方法是将一些代码提取到 CM 和 RM 都依赖的第三类中,但我想不出一个优雅的方法来做到这一点。我想出了要么封装“报告项目”逻辑,要么封装组件信息逻辑,这两种方法似乎都不对。

任何见解或建议将不胜感激。

0 投票
5 回答
72954 浏览

java - Java构造函数中的循环依赖

我有以下课程。

可以清楚地看到,类之间存在循环依赖关系。如果我尝试运行 A 类,我最终会得到一个StackOverflowError.

如果创建了一个依赖图,其中节点是类,则可以轻松识别这种依赖关系(至少对于具有少量节点的图)。那么为什么 JVM 至少在运行时没有识别出来呢?StackOverflowErrorJVM 至少可以在开始执行之前发出警告,而不是 throwing 。

[更新]某些语言不能有循环依赖,因为那样源代码将无法构建。例如,请参阅此问题和接受的答案。如果循环依赖是 C# 的一种设计味道,那么为什么它不是 Java 的呢?仅仅因为Java可以(编译具有循环依赖的代码)?

[update2]最近发现jCarder。根据该网站,它通过动态检测 Java 字节码并在对象图中查找循环来发现潜在的死锁。谁能解释该工具如何找到循环?

0 投票
4 回答
9899 浏览

c - Makefile 循环依赖

这是我的Makefile:

每当我尝试编译时,我都会收到警告,我在 makefile 中make: Circular program.lex <- program.lex.o dependency dropped.根本看不到它program.lex是如何依赖的。program.lex.o我看到依赖树大约有 4 层深,但它看起来不是圆形的。

如何改进我的makefile?

0 投票
2 回答
3277 浏览

c# - MEF 错误,是循环依赖,现在是别的东西

由于我的应用程序架构发生了变化,我最近出现了循环依赖。

该应用程序依赖于通过 MEF 加载插件的插件管理器。直到一切正常,因为它看起来像这样:

插件看起来像这样:

但是现在我遇到了一种情况,我希望所有插件都能够通过接口查询 PluginManager(或可能的任何其他对象),以了解系统中的其他插件以了解它们的功能。我通过添加另一个接口“解决”了这个问题,我们称之为 PluginQueryInterface。然后我让模型实现了这个接口。

然后插件签名将如下所示:

或这个

第二实现很明显是一个循环引用,因为插件要求在创建插件之前创建 PluginQueryInterface,但是 PluginQueryInterface 是模型,它必须导入 PluginManager,而这又需要创建所有的 PluginInterfaces...我在启动时确实收到了 MEF 循环依赖错误。

一个实现似乎不是对我的循环引用。如果 PluginQueryInterface 是一个属性,那么我认为它在使用之前不会被解析。构造函数根本不使用它。那么为什么 PluginManager 不能愉快地创建我所有的 MyPlugins 呢?在这两种情况下,我都会得到相同的 MEF 错误。

我试图通过让 PluginManager 实现 PluginQueryInterface 来解决这个问题,因为 a) 无论如何它都是有意义的,并且 b) 它是处理循环依赖的一种已知方法——使两个相互依赖的类改为依赖于第三个类。现在的问题是我得到了一个不同的 MEF 错误!这就是它所说的:

怎么回事?我在我的代码中设置了断点,并且在调用 GetExportedValue 之前已经设置PluginManager.filename 了我的导出值。

我完全被难住了。任何意见或建议现在将不胜感激。几个小时以来,我一直在用我的头撞在 MEF 包覆的墙上,试图调试这个问题。

(更新)

我之前没有考虑到这一点,但它可能是插件之间的差异,所以我删除了两个插件之一,现在我的应用程序加载时没有 MEF 错误。我把它加回去了,它又失败了。然后我删除了另一个插件,它起作用了。所以看起来这是其他一些 MEF 错误。就好像它不希望我加载多个具有特定界面的插件......但我正在使用 ImportMany,这不会表现出CardinalityException某种形式吗?

更新

我不了解 MEF 的这一部分,希望这里有人可以解释它的全部内容。进入代码一段时间后,我发现我的错误源于 MEF 在找到值后删除了导入定义!

我以前从未遇到过这个问题,坦率地说,我很难理解我现在正在做什么,我的进口和出口使这个问题浮出水面。我假设我正在做 MEF 设计者不打算让任何人做的事情。我可以盲目地注释掉this._importValues.Remove(definition);,但这不可能是正确的。我的猜测是,这将归结为我使用的 MEF 属性,但是由于导入此值的插件的创建策略为CreationPolicy.Shared,我为什么会有问题?

0 投票
3 回答
5711 浏览

python - 如何修复导入的循环依赖

我有三个文件:

测试导入模块:

模块一:

模块二:

如果我运行testimports,我会得到:

但是,如果我取消注释 中的import moduleTwotestimports,程序会在停止工作之前到达这一点:

我将如何解决这个循环依赖问题?

0 投票
2 回答
471 浏览

c++ - C++ 游戏 - 向父类发出信号,循环依赖问题

我有一点循环依赖问题。它工作正常,但它使代码看起来很难看。这是在蛇游戏的背景下。

我有一个类,Snake,它包含一个 SnakeSegments 向量,并管理它们的交互(例如作为一个单元移动和增长,而不是作为单独的实体)。

当 SnakeSegment 与 Food 对象碰撞时,它会将其 hasEaten 成员翻转为 true。Snake 会定期查询 SnakeSegments,主要是针对该成员。如果任何查询返回正值(即有一个击中食物),则 Snake 将作为一个单元增长(即扩大头部并缩小尾部)。这一切都很好,但我更喜欢基于信号的方法,当 SnakeSegment 碰到食物时,它会向 Snake 类发送警报(信号、中断等),告诉它成长. 这意味着我的 Snake 更新函数中不会有丑陋的代码来检查所有段;我会在我的 Snake 类中有一个 OnEat() 函数。

但是,这会导致循环依赖;Snake 包含一个 SnakeSegments 向量,并且 SnakeSegments 有一个 Snake& 或 Snake* 成员,它告诉他们在吃东西时要提醒谁。在代码中,我基本上只需要预先声明 Snake 类:

我的 Snake 课程正常工作

有没有更好的设计呢?请注意,这不仅仅是这里发生的问题。类似的问题发生在许多领域(例如,GameWorld 包含一个 Snake 成员,并且 Snake 会在 GameWorld 死亡时向它发出警报),因此特定于 Snake 和 SnakeSegment 的解决方案不是我正在寻找的。