我对设计购物车应用程序的类感到有点困惑。
ShoppingCart
有一组ShopCartItem
个,每个Product
包含一个ShoppingCart
的实例和数量。 Invoice
实例始终存储在会话中。
如下所示,Customer
引用了ShopCartItem
,一组Order
s,日期,发票号和总金额。我该如何设计Customer
类?我认为它还应该包含ShopCartItem
,public class Invoice {
private Long invoiceId;
private Customer customer;
private Set<ShopCartItem> shopCartItems;
private Date invoiceDate;
private int invoiceNum;
private float totalAmount;
private boolean isProcessed;
...
}
class Product{
private String name;
private double price;
...
}
class ShopCartItem{
private Product product;
private int quantity;
...
}
和日期。
我担心创建冗余类,但我想要让用户取消订单的功能,因此需要将它们存储在数据库中。
{{1}}
答案 0 :(得分:1)
我对OO设计没有太多经验,但这是我的两分钱:
我会将shopCartItems移至Order
并在其中添加Customer
引用和Invoice
引用。 Invoice
可以有一个Set<Order>
或一个引用,并保留当前拥有的其他成员(shopCartItems除外)。
答案 1 :(得分:1)
首先,确切的答案取决于发票和订单类之间的关系。但是,让我假设1个订单始终只生成1个发票。另一方面,发票可以与许多订单相关联。
假设您可以拥有订单和发票类中的所有客户数据,shopcartItem等,但为了避免类似数据的多个实例,您需要这样做:
订单应包含对相关发票的引用。然后你可以在Order类中有一个方法:order.isInvoiceGenerated()
Order.addItem(ShopCartItem item)应该将项目添加到Order类和Order的相关Invoice对象中。
对于像Customer / ShopcartItem对象这样的东西,不应该有Invoice类的直接mutators。所以不应该允许invoice.addItem(ShopCart项目)。
2点和3点以上将确保Order和Invoice对象都在内存中引用Customer / ShopCartItem的相同实例。所以它会使它们保持一致。
以上设计确保如果您更改了客户订单,则需要重新生成发票。客户取消订单,发票也必须取消。
请让我知道你对此的看法。