产品设计

Spotify Jam:一起选歌,也知道谁能切歌

Spotify 是提供音乐等音频内容的服务,Jam 让朋友加入一次共同收听。每个人可以从自己的设备添加歌曲,主持人则管理共享队列和播放权限。

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

01
代码思考

让播放器共用一份操作权限规则

假设你负责一款聚会播放器。按钮是否显示,以及点击后是否执行,必须共用一份权限规则,避免按钮允许操作而处理逻辑拒绝。请实现 canPerform(session, role, action) 这个小模块。

  1. 输入含义: session 是本次共同收听会话,active 表示会话是否正在进行,guestsCanSkip 表示是否允许来宾跳歌,两者均为布尔值。role 是操作人角色:host(主持人)或 guest(来宾)。action 是动作:add(添加歌曲)、skip(跳到下一首)或 end(结束会话)。输入保证属于这些类型。
  2. 判断规则: active=false 时所有动作拒绝,返回 {allowed:false,reason:"inactive"},表示会话未进行。进行中的会话允许主持人执行三种动作;来宾始终可以添加歌曲,仅 guestsCanSkip=true 时能跳歌,始终不能结束会话。其余拒绝返回 {allowed:false,reason:"not-permitted"},表示没有权限;允许时返回 {allowed:true}。函数不改变会话,也不播放音频。
  3. 验收: active=true、guestsCanSkip=false 时,guest/add 允许,guest/skip 拒绝。把 guestsCanSkip 改为 true 后,guest/skip 允许,但 guest/end 仍拒绝。active=false 时,host/end 也返回 inactive。
  4. 交付: 提交权限模块、一个按钮显示与点击前判断共用该函数的简短调用示例,以及上述本地验证结果。无需实现完整播放器。
查看思路
  1. 将所有调用者需要遵守的条件放到同一个判断入口,避免按钮与动作处理各有一份规则。

  2. 先检查会话整体是否可操作,再考虑角色和动作;用 inactive 的主持人例子验证原因优先级。

  3. 改变 guestsCanSkip 后重走来宾路径,确认只改变指定能力,结束权限不会跟着放开。