代码之家  ›  专栏  ›  技术社区  ›  YodasMyDad

有人能用简单的英语解释域驱动设计(DDD)吗?[关闭]

  •  204
  • YodasMyDad  · 技术社区  · 15 年前

    我一直看到DDD(域驱动设计)在文章中被大量使用——我已经阅读了维基百科关于DDD的条目,但仍然无法弄清楚它到底是什么,以及如何在创建我的站点时实现它?

    2 回复  |  直到 8 年前
        1
  •  446
  •   Sebas    8 年前

    首先,如果你不知道你需要它,那么你可能不需要它。如果你不认识到DDD解决的问题,那么也许你没有这些问题。即使是DDD倡导者也经常指出DDD只适用于大型(6个月)项目。

    假设你现在还在读,我对DDD的看法是:

    DDD是为了让你的软件成为一个真实系统或过程的模型。在使用DDD时,您必须与 domain expert 谁能解释现实世界的系统是如何工作的?例如,如果您正在开发一个处理赛马下注的系统,那么您的领域专家可能是一个经验丰富的博彩公司。

    在你和领域专家之间,你建立了一个 无处不在的语言 (ul),基本上是对系统的概念描述。其思想是,您应该能够以领域专家能够阅读并验证其正确性的方式记录系统所做的工作。在我们的下注示例中,无处不在的语言将包括诸如“race”、“bet”、“odds”等词的定义。

    UL所描述的概念将构成面向对象设计的基础。DDD提供了一些关于对象应如何交互的明确指导,并帮助您将对象划分为以下类别:

    • 值对象,表示可能包含子部分的值(例如,日期可能包含日、月和年)
    • 实体,是具有 身份 .例如,每个客户对象都有自己的标识,因此我们知道两个同名的客户不是同一个客户。
    • 聚合根是拥有其他对象的对象。这是一个复杂的概念,它的工作原理是,有些对象如果没有所有者就没有意义。例如,“order line”对象如果没有“order”属于就没有意义,所以我们说order是聚合根,order line对象只能通过order对象中的方法进行操作。

    DDD还推荐了几种模式:

    • Repository ,用于持久性的模式(通常保存和加载数据到数据库或从数据库加载数据)
    • Factory ,对象创建模式
    • 服务,用于创建操作主域对象而不作为域本身一部分的对象的模式

    现在,在这一点上,我不得不说,如果你以前没有听说过这些事情,你不应该试图使用DDD在任何项目,你有一个最后期限。在尝试DDD之前,您应该熟悉 design patterns enterprise design patterns . 了解这些使DDD更容易掌握。如上所述,有一个 free introduction to DDD 可从InfoQ获得(在这里您还可以找到有关DDD的讨论)。

        2
  •  30
  •   Matt Howells    15 年前

    以stackoverflow为例。不是开始设计一些Web表单,而是首先集中精力对问题域内的实体进行面向对象的建模,例如用户、问题、答案、投票、评论等,因为设计是由问题域的细节驱动的,所以称为 领域驱动设计 .

    你可以在里面读更多 Eric Evans' book .