Refactoring for Novices in Java: An Eye Tracking Study on the Extract vs. Inline Methods

该研究通过眼动追踪实验发现,对于 Java 初学者而言,方法提取重构的效果高度依赖任务难度:在复杂任务中能显著提升理解效率并降低视觉负荷,但在简单任务中反而因增加导航负担而拖慢表现,因此教育者应谨慎对待过早的模块化教学。

José Aldo Silva da Costa, Rohit Gheyi, José Júnior Silva da Costa, Márcio Ribeiro, Rodrigo Bonifácio, Hyggo Almeida, Ana Carla Bibiano, Alessandro Garcia

发布于 2026-03-06
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文就像是在做一场关于**“程序员大脑如何阅读代码”**的趣味实验。研究人员想知道:当程序员(特别是新手)看代码时,是把所有逻辑都写在一起(内联方法),还是把复杂的逻辑拆分成一个个带名字的小功能块(提取方法),哪种方式更容易看懂?

为了搞清楚这个问题,他们给 32 位 Java 编程新手戴上了**“眼球追踪仪”**(就像给眼睛装了 GPS),观察他们在看代码时眼睛是怎么转动的,看了多久,有没有反复回看。

下面我用几个生活中的比喻来解释这项研究的核心发现:

1. 核心实验:是“大杂烩”好,还是“分装盒”好?

想象一下你要做一道菜:

  • 内联方法(Inline): 就像把所有食材和步骤都写在一张大纸条上,从切菜到炒菜,全部连在一起,一步接一步。
  • 提取方法(Extract): 就像把“切菜”、“炒肉”、“煮汤”分别写在三个小卡片上,大纸条上只写“先切菜,再炒肉,最后煮汤”。

研究者的假设: 大家都觉得“分装盒”(提取方法)更清晰,因为卡片上有名字(比如“切菜”),你一眼就知道这一步是干嘛的,不用看细节。

但是,实验结果却有点“反直觉”:

情况 A:当任务很复杂时(比如算阶乘、找最大分数)

  • 比喻: 这就像让你组装一个复杂的乐高城堡。
  • 发现: 新手们更喜欢**“分装盒”**。
  • 原因: 看着写着“组装塔楼”的卡片,他们心里有底,不需要盯着每一块积木怎么拼。他们的眼睛不需要来回乱跳,看得更快,更不容易出错。
  • 结论: 对于复杂任务,把代码拆分成带名字的小块,确实能帮新手“减负”。

情况 B:当任务很简单时(比如算正方形面积、判断奇偶数)

  • 比喻: 这就像让你做一道“切黄瓜”的简单菜,或者只是“把水烧开”。
  • 发现: 新手们反而觉得**“大杂烩”**(内联)更好!如果用“分装盒”,他们反而更慢,眼睛更累。
  • 原因: 想象一下,如果“切黄瓜”这一步被单独写在另一张卡片上,你每切一下,就要抬头看大纸条,再低头看小卡片,再抬头……这种**“抬头低头”的切换**(在代码里就是眼睛在“调用处”和“定义处”之间来回跳转),对于简单的任务来说,完全是画蛇添足
  • 数据: 在算正方形面积的任务中,用“分装盒”的新手,眼睛来回跳转的次数增加了 200%,花费的时间增加了 167%
  • 结论: 对于太简单的任务,强行拆分反而增加了“导航成本”,让新手晕头转向。

2. 关键发现:名字再好,新手也不信

研究者发现一个有趣的现象:
即使提取出来的方法名字起得非常好(比如叫 计算正方形面积),新手们并不完全相信这个名字

  • 比喻: 就像你看到菜单上写着“招牌红烧肉”,你还是会忍不住想:“真的吗?我得去厨房看看是不是真的放了肉,是不是真的红烧了。”
  • 现象: 新手看到方法名后,还是会忍不住反复回看(眼睛来回跳动)去确认里面的代码是不是真的和名字说的一样。这种“不信任”导致了大量的视觉疲劳。
  • 对比: 专家程序员看到名字就懂了(相信“招牌”),直接跳过细节;但新手必须“验货”,所以名字对他们来说,有时候反而成了干扰项。

3. 给老师和学生的建议

这项研究给编程教育带来了一个重要的启示:

  • 不要过早“过度设计”: 在教新手入门时,不要一上来就教他们把所有代码都拆分成各种小函数。对于简单的逻辑(比如算个面积、判断个奇偶),直接写在一起反而更直观,更符合他们“线性”的思维方式。
  • 因材施教: 只有当逻辑变得复杂(像组装乐高城堡)时,再教他们使用“提取方法”来拆分任务,这时候名字(信标)才能真正发挥作用,帮他们理清思路。

总结

这篇论文告诉我们:代码的“整洁”并不总是等于“好懂”。

  • 对于复杂的难题,把代码拆开(提取方法)是帮新手理清思路的“拐杖”。
  • 对于简单的小题,把代码拆开反而成了新手眼睛的“绊脚石”,让他们不得不频繁地“抬头低头”,浪费了大量精力。

一句话总结: 教新手编程时,别为了“看起来高级”而强行拆分代码,有时候,“简单粗暴”地写在一起,反而让他们看得更明白。