产品设计

komoot:地点放对了,还要排对经过顺序

komoot 帮助徒步和骑行者发现、规划并导航户外路线。网页规划器把地图上的地点与侧栏里的经过顺序放在一起,让出发前的计划可以逐步调整。

先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。

01
代码思考

重排路线并逐步撤销

为一个路线编辑页实现“重排与撤销”模块。用户连续调整途经点顺序后,应能按相反顺序撤回这些调整。

  1. 初始数据: 创建模块时传入 ["S","W","V","E"],分别表示车站、补水点、观景台、出口。模块自行保存状态,不修改传入数组。所有后续顺序都保证是这四个不同编号的完整排列;本题允许起终点一起重排,不校验输入。
  2. 操作: 提供 reorder(nextIds)、undo() 和 snapshot(),均返回当前顺序的数组副本。reorder 保存一次变化前的顺序,再采用新顺序;若新旧顺序完全相同,不增加撤销记录。undo 恢复并移除最近一条撤销记录;没有记录时保持现状。调用方修改任意返回数组不能改变模块内部状态。
  3. 验收: 从初始顺序依次执行 reorder([S,V,W,E])、重复同一次 reorder、reorder([S,W,E,V]),返回值依次为 [S,V,W,E]、[S,V,W,E]、[S,W,E,V]。随后连续三次 undo,应依次得到 [S,V,W,E]、[S,W,V,E]、[S,W,V,E]。把一次 snapshot 的首项改成 X,再 snapshot,仍应得到 [S,W,V,E]。
  4. 交付: 用熟悉的语言实现模块,运行上述操作,简述由谁保存当前顺序与历史。只处理本地编号,不绘制地图、不计算路线,不实现重做或跨刷新保存。
查看思路
  1. 确定模块拥有当前顺序和历史,外部只通过三个入口操作,考虑数组共用引用会怎样破坏旧记录。
  2. 思考每次真正改变顺序前需要保存什么,以及撤销时怎样取回最近一次;相同顺序不应多占一个撤销步骤。
  3. 沿两次有效重排和三次撤销检查结果,再修改返回的数组,验证外部不能改到内部状态。