前言
当你的依赖图中有一个循环时,没有什么魔法可以让你编译你的项目。您需要进行一些重构以消除循环。
处理循环依赖的方式是拆分模块并重复此操作,直到循环结束(或使用下面给出的替代方案)。
算法
初始点:
A --> B --> C
^ |
| |
+-----------+
A
首先将使用的部分提取C
到一个单独的模块(我们称之为D
):
A --> B --> C
| |
| |
+---> D <---+
如果D
不依赖于任何其他模块,您就完成了。否则继续剪断电线。
假设 D stil 有一个 B 依赖项:
A --> B --> C
| ^ |
| | |
+---> D <---+
您需要从B
(我们称之为E
)类推地提取公共部分:
A --> B --> C
| | |
| v |
| E |
| ^ |
| | |
+---> D <---+
就像以前一样 - 如果E
仍然有问题的依赖关系,请重复。
假设 E 仍然依赖于 C:
A --> B --> C --+
| | ^ |
| v | |
| E ----+ |
| ^ |
| | |
+---> D <-------+
我们做什么?明显的分裂C
(通过提取F
):
A --> B --> C --+
| | | |
| v v |
| E --> F |
| ^ |
| | |
+---> D <-------+
继续循环,直到新引入的模块在模块图中不再有依赖项。
例如在第 3 点)如果我们假设它F
是无依赖的,我们就完成了。这意味着A
used by的问题部分C
已被提取到D ─► E ─► F
子图中。
选择
请注意,如果在合理的预算范围内完全可行,它可能并不那么容易。因此,在某些情况下,最好退回到不太可取的替代方案:复制依赖的A
代码C
。