很多时候,我的业务对象往往会遇到信息需要经常跨越对象边界的情况。在进行OO时,我们希望信息位于一个对象中,并且处理该信息的所有代码应尽可能在该对象中。但是,业务规则没有遵循该原则,这给我带来了麻烦。
作为示例,假设我们有一个包含多个OrderItems的Order,该OrderItems引用一个具有价格的InventoryItem。我调用了Order.GetTotal(),它对OrderItem.GetPrice()的结果求和,该结果乘以InventoryItem.GetPrice()乘以数量。到目前为止,一切都很好。
但随后我们发现有些商品以一交易两卖。我们可以通过让OrderItem.GetPrice()做类似InventoryItem.GetPrice(quantage)的事情并让InventoryItem处理来解决这个问题。
但是,然后我们发现二对一交易仅持续特定时间段。该时间段必须基于订单日期。现在我们将OrderItem.GetPrice()更改为InventoryItem.GetPrice(quatity,order.GetDate())
但是然后我们需要根据客户在系统中待了多长时间来支持不同的价格:InventoryItem.GetPrice(数量,order.GetDate(),order.GetCustomer())
但是,事实证明,一对一交易不仅适用于购买多个相同库存物品,而且适用于InventoryCategory中任何物品的多个交易。在这一点上,我们举起手来,只给InventoryItem订购项,并使其通过访问器在对象引用图上移动,以获取其需求的信息:InventoryItem.GetPrice(this)
TL; DR我希望对象之间的耦合度低,但是业务规则经常迫使我从各地访问信息以做出特定决策。
有好的技巧可以解决这个问题吗?其他人也会发现同样的问题吗?