我经常遇到这样的问题,即函数和类型定义随着时间的推移在单个模块中聚合(我们可以假设一个模块对应于一个源文件)。在某些时候,源文件太大以至于几乎无法维护。例如,一个人意识到该模块包含许多在逻辑上与少数不同主题相关的功能,并且一个人认为它们应该在自己的模块中。
这个想法是有一个工具来建议拆分这样一个模块的方法。然后可以自动从旧源文件实际创建新源文件。
我有以下情况:
- 函数和数据类型的列表,以及它们对模块中其他函数和类型的直接依赖关系。
- 由此,我们可以计算每个项目的所有依赖关系
我们可以进行拓扑排序,以创建依赖组。例如
(a, (b,c,d), e)
- 外部列表中更左侧的项目不依赖于更右侧的任何项目
- 像 (b,c,d) 这样的内部分组项递归地相互依赖
模块必须形成一个非循环的层次结构,即当模块 B 或它导入的模块之一已经导入 A 时,模块 A 导入模块 B 是不可能的。由此可以看出,(b, c, d)
上面的示例不能拆分为不同的模块。
现在,我不知何故陷入困境,正在寻找一种策略,根据迄今为止发现的信息提出明智的建议。
当然,一种可能性是根据依赖组的拓扑排序列表进行拆分。但是,让我们假设列表是这样开始的:
(a, b, c, ....)
其中 c 依赖于 b 和 a,b 依赖于 a 而 a 不依赖于任何事物。在这里,我们可以执行以下操作:
- 定义 a、b 和 c 的模块 ABC
- 定义 a 的模块 A,导入 A 并定义 b 和 c 的模块 BC
- 模块 C 导入 A 和 B 并定义 c,模块 B 导入 A 并定义 b
如果我们简单地将函数之间的依赖关系映射到模块之间的依赖关系,我们最终可能会得到一个过于复杂和细粒度的模块层次结构。
不知何故,我必须考虑进一步的因素。也许是一些所需的模块大小或导入数量。
任何建议,以及指向现有软件的指针都非常受欢迎。