H3.12.3LIFO undo stack设计研究

连续多次操作的撤销栈需要遵循后进先出的顺序

别名: 撤销栈 · last in first out · 多次撤销

概念解释

人连做几步之后按撤销,应先解开最后一步,再解开再上一步。这是后进先出。若撤销跳过最近一步去动更早的、或把几步合成一次,人对「现在世界停在哪」的模型会崩。这条管连续动作的顺序,不管单次窗口还剩几秒,也不管一批里的多项是整体还是部分。

机制

连续操作在工作记忆里是一条时间线:最后发生的最清楚,也最常是要反悔的。后进先出让每一次撤销都对应时间线上最近的那一个节点,结果可预测。打乱顺序等于在时间线中部挖洞,后面的步骤失去前提,界面状态无法用「撤了几次」来描述。把多步合成一次「撤销全部」在人只想改最后一击时杀伤过大。栈还要在界面上可理解:撤销的名字应是刚做的那一步(「撤销删除标题」),而不是无名的「撤销」。

怎么研究

让人做三步可逆操作,再要求只改最后一步、或改回第一步。比较 LIFO、任意一步可点、三步一次清掉。

自变量:栈顺序、是否显示每一步名称、是否允许跳步撤销。 因变量:到达目标状态的步数、是否误伤中间步骤、事后能否复述「还剩哪些改动」。

专家用户会要跳步;那是历史列表,不是这条讨论的即时栈。测即时栈时不要提供完整历史面板,否则测到的是历史,不是连续撤销。

边界

协作中他人的步骤插在自己的步骤之间时,LIFO 按「我的栈」还是「全局时间」会冲突,需要标明撤销的是谁的最近一步。有些编辑器用树状撤销(撤了之后又做新动作,分出分支),即时按钮仍应先走当前分支的最近节点。不可逆步骤会把栈切断:之后的撤销不能假装还能穿过那一刀。

怎么落地

  • 连续可逆动作压进一条栈,撤销按钮的标签指向栈顶那一步的名称。
  • 连续按撤销按时间反向走,不要一次清掉整段,除非人明确选择「撤回到某检查点」。
  • 新的正向动作在撤销之后入栈,被撤掉的那一步不再当栈顶。
  • 验证:做 A、B、C 三步,按一次撤销。若 C 还在而 A 或 B 没了,顺序就不是后进先出。

延伸

  • 同组H3.12.1 撤销窗口的剩余时间需要可见的倒计时提示 · H3.12.2 批量操作的撤销需要说明是整体撤销还是可选择部分撤销 · H3.12.4 窗口到期后操作应明确转为不可逆,而非模糊过渡
  • 相邻H8.06 版本历史 · C6.16 文本输入中的撤销 · H3.04 撤销优于确认
  • 站内检索undo stack · LIFO · command history

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/H3.12.3