自动重构模块的想法

时间:2013-08-08 07:39:50

标签: language-agnostic module functional-programming refactoring

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

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

我有下列内容:

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

    (a,(b,c,d),e)

    • 外部列表中剩余的项目不依赖于任何其他项目
    • 内部分组项目(如(b,c,d))相互递归依赖

模块必须形成非循环层次结构,即当B或其导入的模块之一已导入A时,模块A不可能导入模块B.从此可以看出,上面示例中的(b, c, d)必须不要在不同的模块之间分开。

现在我陷入困境并寻找一种策略,根据迄今为止发现的信息提出合理的建议。

当然,一种可能性是根据拓扑排序的依赖关系组列表进行拆分。但是,让我们假设列表开始如此:

(a, b, c, ....)

其中c取决于b和a,b取决于a和a取无处理。在这里,我们可以做到以下几点:

  • 模块ABC,用于定义a,b和c
  • 模块A,用于定义导入A并定义b和c
  • 的模块BC
  • 模块C导入A和B并定义c,模块B导入A并定义b

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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