我刚刚经历了一些非常相似的事情。实际上,购物车唯一应该知道的是产品 ID 和数量。其他一切都应仅用于展示目的。换句话说,产品对象始终对价格负责。将价格存储在购物车中的唯一原因是帮助在视图中显示它。否则,我们假设始终必须通过任何插入或更新检查价格,以防止欺诈。
这是另一种情况 - 你有一个特殊的运输,比如购买价值 100 美元的合格商品,你可以获得免费送货。特定产品可能有单独的运输特惠。计算的唯一方法是使用所有购物车项目。
所以我的解决方案 - 我不确定这是最佳的 - 是将购物车物品传递给运输对象 - 进行运输计算 - 可选择添加特定产品的消息以显示在购物车中 - 然后返回购物车物品。
否则,您必须将运输方法放在购物车类中,这没有任何意义,但也许还有另一种方法可以做到这一点。
这是另一种情况 - 库存控制。有人订购了 30 个蓝色小部件,但您只有 10 个蓝色小部件。好的,您可以在将商品插入购物车时检查库存。但是如果他们更新购物车然后增加到 30 呢?这意味着我们必须在每次更新购物车时检查库存 - 对于购物车中的每件商品。如果我们这样做,那么最好在价格上涨或下跌的情况下获得价格。
所以我拿走购物车物品 - 并将它们传递给产品对象 - 检查库存 - 如有必要,将物品的数量减少到当前库存 - 可选地添加解释库存有限的消息 - 然后传递回购物车对象。
最后 - 建议您拥有一个拥有购物会话的对象。然后就是总数。这样,购物车永远不会负责总计 - 它只是一个容器。一种方法是您只需开始一个订单,然后将不同的总数存储在那里。