Too Good To Go:让不确定的余量食物,有明确的取货约定
Too Good To Go 连接有未售出食物的店铺和愿意到店领取的消费者。用户选择附近的 Surprise Bag,并按店铺给出的时段取货,让当天的余量找到去处。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
代码思考
把取货时间规则封装成一个可检查的模块
假设你负责订单页面,需要反复显示“尚未到时间”“可以领取”或“窗口已结束”。请把时间判断封装成一个模块,让页面不用各写一份规则,也能在本地验证边界。
- 创建模块: 输入 startMs(开始时刻)、endMs(结束时刻),两者是 UTC 毫秒时间戳;另传入 now 函数,每次调用它会返回当前时间戳。起止时刻必须是有限数字且 startMs < endMs,否则创建失败并返回 invalid-window(窗口无效)。now 保证返回有限数字。
- 查询状态: 模块提供 getStatus(),每次查询都读取 now()。早于开始时刻返回 upcoming(尚未开始);从开始时刻起、到结束时刻之前返回 open(可以领取);达到结束时刻返回 closed(窗口结束)。只返回状态,不格式化日期或处理付款、核销。
- 验收: startMs=1000、endMs=2000,用可调整的测试时钟依次提供 999、1000、1999、2000,同一个模块应依次返回 upcoming、open、open、closed。1000 到 1000 的窗口应在创建时被拒绝。
- 交付: 提交模块、接口说明和上述本地示例,简述怎样把时钟与窗口规则分开。
查看思路
-
把窗口参数与“现在几点”分开:参数属于一个窗口,时钟在查询时才提供当前值。
-
先确定区间两端的包含关系,再用 1000 与 2000 检查边界;不要依赖真实等待来复现。
-
检查无效窗口能否在创建阶段被挡住,并说明界面如何根据返回状态选择文案。