DDD - 有界上下文和多个模型?

Hob*_*bes 8 domain-driven-design bc

我正在阅读关于DDD中有界上下文的想法,我开始意识到我并没有清楚地理解模型在实践中的确切含义.(我甚至可能都不确切知道域的含义.)

让我们看看流行的电子商务示例:客户浏览产品,添加到购物车,下订单.订单履行人员发出订单.

是否存在一个具有多个有界上下文的大型电子商务域(产品目录上下文,购物车上下文,订单上下文,实现上下文)?每个有界上下文是否包含一组模型(因此产品目录上下文包含产品模型,产品图像,产品评论)?

我有多远?

Arn*_*psa 7

至少你是在正确的轨道上.经典错误只是看模式.

域意味着您正在处理的问题(支持电子商务,医疗保健,会计等).域模型是代码中表示的那些问题的解决方案,它们遵循我们的心理模型尽可能接近.

让我们看看流行的电子商务示例:客户浏览产品,添加到购物车,下订单.订单履行人员发出订单.

在你的例子中,我将从这样的事情开始:

class Product { }

class Customer
{
    Cart Cart;
    void PlaceAnOrder()
    {
        order = new Order(Cart.Products);
        Orders.Add(order);
        Cart.Empty(); //if needed
    }
    Orders Orders;
    Orders UnfulfilledOrders()
    {
        Orders.Where(order => !order.IsFilled);
    }
}

class Cart
{
    void AddProduct(product)
    {
        Products.Add(product);
    }
    void Empty()
    {
        Products.Clear();
    }
}

class Order
{
    bool IsFilled;
    void Order(products)
    {
        Products = products;
        IsFilled = false;
    }
    void Fill()
    {
        IsFilled = true;
        //TODO: obviously - more stuff needed here
    }
    Money TotalPrice()
    {
        return Products.Sum(x => x.Price);
    }
}

class System
{
    void Main()
    {
        SimulateCustomerPlacingAnOrder();
        SimulateFulfillmentPeople();
    }
    void SimulateCustomerPlacingAnOrder()
    {
        customer = new Customer();
        customer.Cart.AddProduct(allProducts.First());
        allCustomers.Add(customer);
    }
    void SimulateFulfillmentPeople()
    {
        foreach (var customer in allCustomers)
        {
            foreach (var order in customer.UnfulfilledOrders())
                order.Fill();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一开始 - 这似乎是一个巨大的矫枉过正.使用过程代码 - 使用少量集合和少量for循环可以实现相同的功能.但域驱动设计的想法是解决真正复杂的问题.

面向对象的编程非常适合 - 使用它你可以抽象出你向前推进时无关紧要的事情.此外 - 重要的是相应地命名,因此您(以及您的域专家(了解问题的人))即使在多年后也能够理解代码.而且不仅仅是代码,而且还可以用一种无处不在的语言进行交谈.

请注意,我不知道电子商务领域以及您可能尝试解决的问题,因此,我很可能根据您的心理模型编写了完整的废话.这就是教学领域建模如此混乱和困难的一个原因.此外 - 它需要很高的抽象思维能力,根据我的理解,这并不是获得CS学位的主要要求.


对于有限的上下文,你是对的.但你应该记住,他们需要在他们之间进行翻译.它们增加了复杂性并且像往常一样 - 复杂的解决方案仅适用于复杂问题(对于ddd本身也是如此).所以 - 只要您的域实体的含义不重叠,您就应该避免发送垃圾邮件.第二个原因(较少"自然")将是对分解的强烈需求.

Ps阅读埃文斯的书.两次......直到它有意义...... :)

  • 在阅读了Vaughn Vernon的IDDD之后,我的印象是你的例子未能正确地模拟应该是的事情."订单","产品"甚至"客户"在购物环境和运输环境中具有非常不同的手段.例如,订单的"填充"操作在购物环境中没有任何意义.虽然我觉得这个例子在战略上是不对的,但我不确定如何在战术上解决这个问题. (3认同)

Tom*_*mas 1

如果您可以使用 java 中的示例,这可能很有用:http://dddsample.sourceforge.net/

  • 此示例不显示多个有界上下文。它实际上是一个具有多个聚合的集合。我知道,因为我使用了这个示例(.net 的示例),并且毫无疑问,这是一个很好的学习示例,但根本不是多个有界上下文。这就是我在这里浏览文章的原因。 (6认同)