有人可以用普通英语解释领域驱动devise(DDD)吗?
我一直在看DDD(领域驱动devise)在文章中被大量使用 – 我已经阅读了有关DDD的维基百科条目,但仍然无法弄清楚它到底是什么以及如何在创build我的网站时实施它。
首先,如果你不知道你需要它,那么你可能不需要它。 如果你不认识到DDD解决的问题,也许你没有这些问题。 即使DDD倡导者也会经常指出,DDD只适用于大型(> 6个月)的项目。
假设你现在还在阅读,那么我认为DDD是这样的:
DDD就是试图使你的软件成为现实系统或者过程的模型。 在使用DDD时,您需要与可以解释现实世界系统工作原理的领域专家密切合作。 例如,如果您正在开发处理赛马投注的系统,则您的域专家可能是一位经验丰富的博彩公司。
在你和领域专家之间,你build立了一个无所不在的语言 (UL),这基本上是系统的概念性描述。 这个想法是,你应该能够以领域专家可以读取它并validation它是正确的方式写下系统的function。 在我们的投注例子中,无所不在的语言将包括诸如“种族”,“赌注”,“赔率”等单词的定义。
UL所描述的概念将构成面向对象devise的基础。 DDD为您的对象应该如何交互提供了一些明确的指导,并帮助您将对象分为以下几类:
- 值对象,表示可能有子部分的值(例如,date可能有日,月和年)
- 实体,是具有身份的对象。 例如,每个Customer对象都有自己的标识,所以我们知道两个同名的客户不是同一个客户
- 聚合根是拥有其他对象的对象。 这是一个复杂的概念,它的工作原理是有一些物体除非拥有一个所有者才有意义。 例如,如果没有“订单”属于“订单行”对象,则“订单行”对象是没有意义的,所以我们说订单是集合根,订单行对象只能通过Order对象中的方法操作
DDD还推荐了几种模式:
- 存储库 ,持久化模式(保存和加载数据,通常是从数据库中读取数据)
- 工厂 ,对象创build的模式
- 服务,一种创build对象的模式,这些对象操作主要的域对象,而不是域本身的一部分
现在,我必须说,如果你以前没有听说过这些事情,那么你不应该在任何你有期限的项目上使用DDD。 在尝试使用DDD之前,您应该熟悉devise模式和企业devise模式 。 了解这些使DDD更容易掌握。 而且,如上所述,InfoQ提供的DDD免费介绍 (您也可以在这里find有关DDD的讨论)。
以StackOverflow为例。 您不必着手devise一些Web表单,而是首先着眼于在问题域内对实体进行面向对象的build模,例如用户,问题,答案,投票,评论等。由于devise是由问题的细节驱动的它被称为域驱动devise 。
您可以在Eric Evans的书中阅读更多内容 。