What Characterizes Pairwise Modular Smells?
本研究通过识别 19 个成对关系特征来表征成对模块异味,在来自 11 个 Java 项目的超过 600 万个实体对上训练机器学习模型,以显著提高准确率来预测不当分离和不当聚合的实体对,并解释结果以揭示驱动这些架构缺陷的具体影响因素,如依赖关系和语义相似性。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你是一位大型、繁忙图书馆的管理员。一个优秀的图书馆目标是将书籍组织进逻辑清晰的区域,例如“烹饪”、“历史”、“科学”等。这使得人们能够轻松找到所需之物,也让图书管理员能够保持整洁。
在软件世界中,这些“区域”被称为模块(modules)。一个“好”的模块会将紧密协作的文件组合在一起(高内聚),并将互不相关的文件隔离开来(低耦合)。
然而,随着时间的推移,图书馆会变得混乱。书会被乱放进错误的箱子。在软件中,这种混乱被称为**“异味”(Smell)**。它不是指一种难闻的气味,而是指某种结构性的错误,可能会在未来导致头疼。
问题所在:“成对模块异味”(PairSmell)
在之前的一项研究中,作者引入了一种寻找这类混乱的新方法,称为 PairSmell。与其一次性观察整个图书馆,不如观察成对的文件(书)。
他们提出了一个简单的问题:“这两个文件应该属于同一个区域,还是应该属于不同的区域?”
为了回答这个问题,他们使用了一组“专家图书管理员”(自动化软件工具)。如果所有的专家都一致认为文件 A 和文件 B 应该放在一起,但图书馆目前将它们分在了不同的区域,那就是个问题。这种情况被称为 InSep(不当分离)。
反之,如果专家认为它们应该在不同的区域,但图书馆却把它们挤在同一个箱子里,这也是个问题。这种情况被称为 InCol(不当聚合)。
差距在于: 前面的研究可以发现这些问题,但无法轻易解释为什么它们是问题。这就像医生说“你发烧了”,却没解释是因为流感、感染还是因为晒了太阳。开发者需要知道为什么一对文件存在“异味”,这样才能正确地修复它。
解决方案:调查这对文件的“性格”
这篇新论文提出了一个问题:什么样的特定特征会让一对文件极有可能被放在错误的地方?
作者将此过程视为一场侦探故事。他们收集了一份描述两个文件之间关系的19 种“性格特征”(特性)。这些特性包括:
- 依赖关系(Dependencies): 这个文件与多少其他文件进行通信?
- 共享词汇(Shared Words): 它们是否使用相同的技术术语?
- 大小(Size): 这些文件有多大?
- 复杂度(Complexity): 它们有多难理解?
随后,他们将这些特性输入到一个机器学习“大脑”(计算机模型)中,该模型是在来自 11 个开源软件项目(如 Kafka、Hadoop 和 Druid)的超过 600 万对文件中训练而成的。
研究结果:什么让一对文件产生“异味”?
计算机学会了高精度地识别这些“异味”。更重要的是,作者询问了计算机,哪些特性是最大的危险信号。
1. 对于本该在一起却被分开的文件(InSep)
模型发现,如果出现以下情况,分离的文件很可能具有“异味”(被错误地分离):
- 它们有太多的“向外”连接: 想象两个身处不同房间的人,却不断地向走廊里的同一群人发出指令。如果他们过度依赖相同的外部资源,他们可能应该在同一个房间里,以便更好地协调。
- 它们与系统其余部分的共享词汇过多: 如果这两个文件都在不断地讨论与建筑中其他所有人相关的概念,那么它们很可能属于同一个“团队”,不应该被隔离。
- 它们非常简单(字段较少): 如果两个文件既小又简单,但又互相依赖,那么把它们分开就像把左鞋和右鞋放在不同的盒子里一样。它们太简单了,不足以证明分离的合理性。
2. 对于在一起却本该分开的文件(InCol)
模型发现,如果出现以下情况,被挤在一起的文件很可能具有“异味”(被错误地分组):
- 它们语言不通(语义相似度低): 如果一个文件关于“烹饪”,另一个关于“历史”,但它们却在同一个箱子里,这就是个错误。模型会检查它们是否使用相似的技术术语;如果不是,它们就不应该在一起。
- 它们彼此之间没有多少共同词汇: 即使它们在同一个箱子里,如果它们从未提到过相同的事物,它们很可能是不相关的。
- 它们有太多的“向内”连接: 想象一个办公室,来自其他部门的 50 个人不断过来递交工作。如果两个处于同一模块中的文件正受到来自各处的请求轰炸,那么这个模块可能过于拥挤,需要拆分以处理负载。
为什么这很重要
作者提供了一份“用户手册”。现在,开发者不再只是看到一个标红的警告说“这不对”,而是可以看到为什么:
- “噢,这两个文件是分离的,但它们都依赖于其他 50 个文件。我应该把它们移动到一起。”
- “噢,这两个文件在一起,但一个是工具类文件,另一个是业务逻辑工具,而且它们没有共同的词汇。我应该把它们拆开。”
核心结论
这篇论文将一个复杂的软件问题——弄清楚为什么软件模块是混乱的——分解成了简单、易懂的特征。通过使用机器学习的“侦探”方法,他们识别出了哪些特定的“性格特征”(例如一个文件的连接数或它共享多少词汇)预示着设计错误。这有助于开发者不仅能发现混乱,还能理解根本原因,从而有效地进行清理。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。