【发布时间】: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 以外的其他内容来停止连续循环。
-
您描述的问题是在有向图中检测循环。任何算法教科书都会有解决方案。我手边没有教科书,也记不得了。