An Empirical Evaluation of Code Smell Detection in Angular Applications
本研究首次提出了源自灰色文献的 Angular 特定代码坏味目录,并展示了一种自动化静态分析工具在检测这些问题方面的高效性,其准确率超过 0.88,F1 分数高达 1.00。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你正在使用一套名为 Angular 的特定蓝图和工具,建造一座庞大而复杂的房屋。这是一种构建现代 Web 应用的流行方式,因为它坚固、井井有条,并且内置了你所需要的一切。然而,就像现实生活中的建筑施工一样,如果你不够小心,可能会开始偷工减料或以杂乱无章的方式建造。这些杂乱的习惯被称为“代码异味”。
请将代码异味视为一种警示信号,而非一堵倒塌的墙——就像引擎里的怪声或一扇卡住的门。它并不意味着房屋会立即坍塌,但这表明设计存在缺陷;如果你继续忽视它,未来修复或扩建这座房屋将变成一场噩梦。
本文就像一支由专家房屋检查员(研究人员)组成的团队,他们深入 Angular 开发者社区,问道:“你们最常见到的坏习惯是什么?”他们不仅查阅了官方规则手册,还倾听了开发者在论坛、博客和聊天群组(论文中称为“灰色文献”)中的声音。
以下是他们发现并所做工作的简要说明:
1. 侦探工作:发现异味
研究人员像侦探一样, sift 了数百个在线讨论,寻找反复出现的抱怨。最终,他们识别出了 11 种 Angular 开发者常犯的特定“坏习惯”。
为了帮助你理解,以下是其中几种异味及其简单的类比:
- “厨房水槽”组件(大型组件): 想象一下,你房屋中的某一个房间试图同时充当厨房、卧室、浴室和车库。在 Angular 中,当一段代码试图承担过多不同的职责时,就会发生这种情况。它会变得巨大、混乱且难以清理。
- “魔法盒”(过度使用
any类型): Angular 使用一种名为 TypeScript 的语言,它就像一位严格的安全检查员,会检查你是否将正确类型的砖块放入了正确的孔洞。有时,开发者会变得懒惰,通过使用一个名为any的“魔法盒”来说:“随便放什么都行。”这会关闭安全检查员。房屋今天看起来可能没问题,但后来,一张沉重的沙发可能会掉落在并非为此建造的地面上,因为检查员没有在场监督。 - “拔河”(过度的父组件到子组件通信): 想象一位家长不断向孩子大喊指令,或者更糟的是,家长直接伸手进入孩子的房间重新摆放家具。在 Angular 中,组件之间应该礼貌地交流。当父组件抓住子组件并强制其直接改变状态时,就会形成一个紧密而杂乱的死结,难以解开。
- “直接锤子”(直接 DOM 操作): Angular 有一种自动“粉刷墙壁”(屏幕)的特殊方式。有时,开发者会失去耐心,直接抓起锤子敲打墙壁,绕过了自动粉刷系统。这或许能暂时奏效,但它破坏了系统保持房屋一致性的能力。
- “复制 - 粘贴”房屋(重复的组件): 想象你在同一座房屋里建造了两个完全相同的厨房,因为你忘记了自己已经建过一个。这浪费了空间,意味着如果你想更换水槽,就必须记得在两个地方进行修改。
2. 重叠:Angular 与 React
研究人员还注意到了一些有趣的事情。他们将这些 Angular 异味与另一种流行的构建框架 React 中发现的坏习惯进行了比较。
- 共同点: 大约一半的坏习惯(如“厨房水槽”或“复制 - 粘贴”问题)在 Angular 和 React 中是相同的。事实证明,当你用积木搭建时,无论使用什么品牌的积木,人类都会犯同样的错误。
- 独特的异味: 有些异味是 Angular 独有的,通常与其更新屏幕或处理数据的具体规则有关。
3. 解决方案:一种新的“嗅探”工具
一旦他们列出了这 11 种异味,研究人员并没有仅仅撰写报告,而是构建了一个 机器人检查员。
- 他们利用现有的能够检测 React 中坏习惯的工具,并将其升级以理解 Angular。
- 这个新工具会扫描你的代码文件,寻找这 11 种异味的特定模式,并为你标记出来。
4. 测试:机器人有效吗?
为了检验他们的机器人是否可靠,他们在一系列真实的开源 Angular 项目上进行了测试。他们首先手动检查代码,确认异味确实存在,然后让机器人运行。
- 结果: 机器人表现得令人惊讶地出色。它以极高的准确率(超过 88% 正确)捕捉到了坏习惯,并且在发现“魔法盒”(
any类型)和“复制 - 粘贴”问题方面几乎完美。 - 一个小故障: 机器人有时会对文件大小过于敏感。如果一个文件因为任务复杂而自然较大(比如一个大型且合法的仓库),机器人有时会将其标记为“大文件”异味,即使它组织得很好。这就像一名保安,会拦住每一个提着沉重箱子的人,即使他们只是在搬运家具。
为什么这很重要
主要结论是,这项研究创建了 首个官方目录,列出了基于真实开发者实际讨论的 Angular 特定坏习惯。他们证明了我们可以构建自动化工具来尽早发现这些问题,帮助开发者保持其数字房屋的整洁、安全,并便于未来扩展。
简而言之:他们倾听了开发者的声音,列出了常见的错误,构建了机器人来发现这些错误,并证明了该机器人非常有效。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。