产品设计

YNAB:钱放在哪里,和准备花在哪里,是两件事

YNAB 帮人给已有的钱安排用途。账户显示钱放在哪里,分类显示哪些钱准备付房租、买食物或留作以后,两种视图共同描述同一份资金。

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

01
代码思考

把一组用途调整一起应用

为一个本地用途规划器实现“一起应用调整”模块。用户会一次列出几笔分类调拨,确认后要么全部成功,要么原计划完全不变。金额使用整数分;计划是分类名及其可用金额,所有金额非负。每笔调整给出来源分类、目标分类和金额;保证分类已存在且来源与目标不同,金额是正整数。

  1. 模块接收计划与一组按顺序排列的调整,按这个顺序判断余额是否足够;前一笔转入的钱可以用于后一笔。全部能完成时,返回成功结果与新计划。任一笔不足时,返回失败结果、第一笔失败调整在列表中的位置和原计划,不保留此前已计算的调整。空列表应成功且金额不变。无论成功或失败,都不能改动传入计划;调用方修改返回计划时,也不能影响传入计划。接口与内部代码组织由你决定。
  2. 初始计划为 {food:40000,outing:20000,rent:90000}。依次将outing的10000转给food、food的45000转给rent,最终得到 {food:5000,outing:10000,rent:135000},总和仍150000。若第二笔改为从outing转15000给rent,则整组失败,返回最初的40000、20000、90000,而不是停在第一笔之后。另测将outing的20000全部转给food,应成功且outing为0。
  3. 交付可运行模块和上述调用结果,补测空列表与返回结果被改写的情况。简述怎样安排逐笔计算与最终结果,让后一步能使用前一步的资金,又不会在失败时留下半套修改。只处理本地数据,不接银行或数据库。
查看思路
  1. 先画出最初计划、每笔调整后的中间状态和最终返回值,区分哪些变化只是本次计算,哪些会交给调用方。
  2. 比较工作副本、累计变化或保存撤销信息等做法:第二笔失败时各自要怎样保证原计划不变?不要只检查单笔成功。
  3. 用前笔转入支持后笔、第二笔不足、恰好耗尽与空列表检查顺序和边界,再修改返回计划,确认外部数据之间没有意外联动。