Language agnostic 模块的自动重构思想

Language agnostic 模块的自动重构思想,language-agnostic,module,functional-programming,refactoring,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不依赖于任何东西。在这里,我们可以执行以下操作:

  • 定义a、b和c的模块ABC
  • 模块A定义A,模块BC导入A并定义b和c
  • 模块C导入A和B并定义C,模块B导入A并定义B
如果我们简单地将函数之间的依赖关系映射到模块之间的依赖关系,那么最终可能会得到过于复杂和细粒度的模块层次结构

不知何故,我必须考虑更多的因素。可能是一些所需的模块大小或导入数量


欢迎提供任何建议,以及指向执行类似操作的现有软件的指针。

听起来您在描述传出和传入耦合


这是一个语言无关的问题,但我知道java中的一些工具,比如JDepend(),将计算这些度量值来帮助指导未来的重构。

当你投票关闭时,考虑一下这是否可能被迁移到程序员,也许。