如何使用购物车产品对象构建购物车

How to structure a cart with cart products object

提问人:Bernardo Benini Fantin 提问时间:9/13/2023 更新时间:11/18/2023 访问量:33

问:

我是 DDD 的新手,在构建对象时遇到困难。我有一个 ,我可以在其中添加它。每个都有一些属性,如图像、标题、价格等。每当将 添加到 中时,数据库就会将此关系存储在一个名为 的单独表中。这个新表允许我向 添加一些新属性,例如观察,它的 ID 与表中的 ID 不同,它可以有额外的属性,例如“fries for a cheeseburguer”等。因此,如果我正在处理一个对象,该对象具有(来自表),我应该有一个 ,这将是一个数组,其中每个将是一个 ,带有一个 id、observation 和一个具有产品所有属性的属性,如图像、标题、价格,或者我可以直接在我的产品中拥有所有这些属性?基本上。cartproductsproductproductcartcart_productscart productproductproductscartproductscart_productscart.productsproductsproductcart_productproduct

cart = {
  products = [                        // this product comes from `cart_products` table
   id = 1
   observation = 'text text text'
   product = {                        // this product comes from `products` table
    image: 'url'
    name: 'Cheese'
    price: 2.0
   }
  ]
}

cart = {
  products = [                        // this product comes from `cart_products` table
   id = 1
   observation = 'text text text'
   image: 'url'                       // this property comes from `products` table
   name: 'Cheese'                     // this property comes from `products` table
   price: 2.0                         // this property comes from `products` table
  ]
}

使用无处不在的语言的想法,似乎第二种更适合,但我不知道它是否正确(或者,至少,更有意义)

对象 OOP 领域驱动设计

评论


答:

0赞 David House 9/23/2023 #1

我认为你需要重新定义你的.这不仅仅是一个连接其他两个表的表,而是具有真正的价值。这样做将帮助您更轻松地考虑数据结构。cart_products

您的对象可以具有以下定义和职责:

  • 购物车 - 包含用户选择的所有产品,还需要字段来标识它与哪个用户相关联等。这是 DDD 方法中的聚合根。
  • CartLineItem - 指用户想要购买的产品快照以及一些补充信息。仅当与购物车关联时才能存在。
  • 产品 - 从购物车的角度来看,这本质上是参考数据。管理产品是一项后台任务,而管理购物车是由用户驱动的。这是一个提示,它应该是一个完全独立的域,并且是它自己的聚合根。

考虑到这一点,您最终会得到两个完全独立的对象层次结构:

cart = {
    userId = 4,
    // more properties
    lines = [
        productId = 1,
        name = "Cheese",
        unitPrice = 2.0,
        quantity = 5,
        discountPercent = 20
        total price = 8.0,
        observation = "bla bla bla"
    ]
}

product = {
    id = 1,
    image = "URL",
    name = "Cheese"
    price = 2.0,
    description = "Tasty cheese"
}

我添加了一些额外的属性,希望能说明为什么尽管购物车行项代表产品,但它本身就值得成为一流的对象。

您可以将一些相关字段复制到行项中,以便于访问,就像我对名称和价格所做的那样,因为您将在将产品添加到购物车时获得产品的快照。这些字段很可能是购物车摘要页面上显示的字段,等等。您绝对不需要将产品描述等字段复制到购物车中,并且拥有一个完全独立的产品域可以让您将其隔离。