Letterboxd:一部电影看了两次,留下两次感受
Letterboxd 是供影迷记录、评分和交流电影的平台。它把“看过这部电影”与“某天看了一次”分开,让重看的日期和感受都能留下来。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
代码思考
同步修改日记与影片当前评分
为一个观影日记实现评分修改函数。影片可以看多次,每次有独立记录;修改一条旧记录的评分时,其他观影记录应保留,该影片的当前评分则跟着这次修改更新。
- 已有数据: state 包含 entries 和 currentRatings。entries 初始为 [{id:"A1",filmId:"A",date:"03-02",stars:3},{id:"A2",filmId:"A",date:"10-20",stars:4},{id:"B1",filmId:"B",date:"10-21",stars:5}];currentRatings 初始为 {A:4,B:5}。id 是单次观影编号,filmId 是影片编号,date 只用于展示,stars 为星数。
- 功能: 实现 updateRating(state, entryId, stars),返回新的完整 state,不改变传入的 state。entryId 保证存在且唯一,stars 为 1 到 5 的整数。只改指定记录的星数,同时把它对应影片的 currentRatings 更新为同一星数;记录顺序、日期和其他字段不变。当前评分按这次编辑更新,不按观影日期挑选。
- 验收: 在初始数据上修改 A1 为 2,结果中 A1 为 2、A2 仍为 4、B1 仍为 5,currentRatings 为 {A:2,B:5};原输入仍保持初始值。把所得结果再传入并将 A2 改为 5,得到 A1:2、A2:5、B1:5 和 {A:5,B:5}。再次将 A2 设为 5,内容保持一致。
- 交付: 用熟悉的语言实现函数,运行这组操作,简述为什么修改入口需要 entryId 而不能只收 filmId。使用本地数据即可,不需要页面或数据库。
查看思路
- 先明确影片与观影记录是两类身份:同一个 filmId 可以对应多个不同的 entryId。
- 把单次记录修改与当前评分更新放在同一个入口,避免调用方只完成其中一半;考虑怎样复制被修改的数据而不影响旧输入。
- 沿两次修改核对 A1、A2 和影片 A 的当前评分,特别检查较早日期的记录被编辑时,仍按题面更新当前评分。