【问题标题】:Software License Project: how to avoid circular dependency软件许可项目:如何避免循环依赖
【发布时间】:2013-08-30 15:15:39
【问题描述】:

标题听起来有点不清楚,我不确定术语。但是我的问题是:我现在正在实现我们软件的许可验证功能,它由几个模块组成。例如,函数调用类似于License.IsModuleEnabled(m As Module)(代码在VB.NET中)

现在的问题是,一个模块需要另一个模块作为先决条件是很常见的,例如,要运行 ModuleA,ModuleB 也必须启用。所以在Module类我有一个公众号叫RequiredModules,它是Module的列表。所以IsModuleEnabled() 函数看起来像这样:

Public Function(m As Module)
   ...     
   For Each module In m.RequiredModules
       If Not IsModuleEnabled(module) Then Return False
   End For
   ...
End Function

问题很明显(但解决方案不是我):如果 ModuleA 需要 ModuleB,而 ModuleB 需要 ModuleA,则该函数将进入死循环。

这些模块彼此平行,所以我不知道如何管理这样的验证功能。我们目前的解决方案是,RequiredModules 中只能列出一些“基本”模块,但从长远来看,让所有可能出现在列表中的模块会更好。

【问题讨论】:

  • 您是否需要在未启用 ModuleB 的情况下启用 ModuleA,反之亦然?
  • 你不能创建一个循环遍历模块及其依赖模块,构建唯一模块名称的映射。如果该模块已存在于地图中,请跳过它。当你到达这个循环的结尾时,循环你新创建的地图,然后对它们进行布尔检查。
  • 而不是返回 true 或 false 可能会返回依赖模块的名称,这样您可以检查模块名称是否是调用模块的名称。您必须返回 true 或 false 以外的其他内容来停止连续循环。
  • 您描述的问题是在有向图中检测循环。任何算法教科书都会有解决方案。我手边没有教科书,也记不得了。

标签: loops circular-dependency


【解决方案1】:

有一个集合列出所有模块的许可证已经验证,并在调用潜在的冗余验证之前签入这个集合。如果集合中没有值,请进行验证并在此处添加已验证模块的名称。

有另一个类似的设置来列出模块,因为验证故意失败了,所以我们也不会在这种情况下陷入无限循环。

如果验证并行发生,这也应该有效,因为知识在集合中不断积累,直到足以打破循环。

【讨论】:

  • 谢谢,有道理!
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 2012-02-15
  • 2013-04-02
  • 2022-01-22
  • 2011-06-16
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多