1

我的同事和我在过去的 2 个小时里一直在讨论,试图找出最好的方法来设计我们新的在线商店处理客户购物篮的方面,但我仍然不确定我们是否已经完成一个很好的结论。

这听起来像是一个相当基本的问题,但我们发现实际上系统的不同部分之间存在大量的相互依赖关系。

部分(到目前为止!)是:

  • 购物篮(跟踪客户选择购买的产品)。
  • 交易(定义产品的促销活动,例如“以 20 英镑购买 3 个 x”或“购买 2 个 x 并获得 1 个免费”)。
  • 低订单费用(在一定价值下,订单会增加额外费用)。
  • 运费(基于一系列选项)。
  • 代金券兑换。
  • 客户信用(客户可能在其帐户上有信用,将从订单总额中扣除)。

我对所有这些对象相互交谈并从彼此获取价值,然后根据这些价值采取行动感到非常紧张。我想象它会变成一个庞大、复杂、无法维护的纸牌屋。

我确信让我的系统的不同部分直接相互交谈是不好的做法,更不用说允许他们改变彼此的状态(不管他们如何做到这一点),因为系统的部分最终依赖于其他部分在运行时处于不同的状态,如果它们都可以相互交谈,我不能确定某些东西没有改变我所依赖的其他东西。

但是有很多例子我看不到任何其他方式。例如:

  • 当客户在购物篮中结账时,“买 X 送 Y”的交易需要将 Y 产品添加到购物篮中。所以交易有效地看起来和影响篮子。
  • 确定是否应用低订购费是基于篮子中产品的价值,但在多买折扣之后(例如,3 代表 2 的价格)。因此,它需要查看篮子,同时还要考虑交易。
  • 购物篮还需要在客户浏览网站时显示总价值,该总价值应考虑与产品相关的交易,但仅此而已。

我怎样才能做到这样的事情,而不是让自己陷入困境并编写可能以意想不到的方式影响大量其他代码的代码?

4

1 回答 1

0

您似乎有以下抽象实体:

  • 篮子
  • 交易
  • 费用(低订单,运费)
  • 信用(凭证,未偿信用)

您可能可以将这些概念包装到单个业务逻辑类中,该类使用多个网关来访问具体模型。乍一看,业务逻辑看起来是“将任何交易添加到篮子,应用任何费用,然后赎回任何信用选项。” 这些组件中的每一个似乎都是装饰器的集合,每个装饰器都有可能作用于篮子。

这里的业务逻辑类的工作是获取每个网关(交易、费用、信用)并迭代它们的各个组件。每个组件都将通过篮子并询问它是否应该影响它。如果篮子应该受到影响,则应该应用效果并且可以继续迭代。

通过这种方式,业务逻辑被保存在一个地方,它定义了操作的顺序。每个组件都通过业务逻辑松散耦合到篮子中。

更新一种可能的方法

于 2012-10-17T19:21:40.563 回答