2

我经常遇到这样的问题,即函数和类型定义随着时间的推移在单个模块中聚合(我们可以假设一个模块对应于一个源文件)。在某些时候,源文件太大以至于几乎无法维护。例如,一个人意识到该模块包含许多在逻辑上与少数不同主题相关的功能,并且一个人认为它们应该在自己的模块中。

这个想法是有一个工具来建议拆分这样一个模块的方法。然后可以自动从旧源文件实际创建新源文件。

我有以下情况:

  • 函数和数据类型的列表,以及它们对模块中其他函数和类型的直接依赖关系。
  • 由此,我们可以计算每个项目的所有依赖关系
  • 我们可以进行拓扑排序,以创建依赖组。例如

    (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

如果我们简单地将函数之间的依赖关系映射到模块之间的依赖关系,我们最终可能会得到一个过于复杂和细粒度的模块层次结构。

不知何故,我必须考虑进一步的因素。也许是一些所需的模块大小或导入数量。

任何建议,以及指向现有软件的指针都非常受欢迎。

4

1 回答 1

1

听起来您在描述传出和传入耦合http://en.wikipedia.org/wiki/Software_package_metrics

这是一个与语言无关的问题,但我知道 Java 中有一些工具,例如 JDepend ( http://clarkware.com/software/JDepend.html ),它们将为您计算这些指标以帮助指导未来的重构。

于 2013-08-22T01:45:28.823 回答