我一直看到DDD(领域驱动设计)在文章中被大量使用-我已经阅读了关于DDD的维基百科条目,但仍然不知道它到底是什么,以及我将如何在创建我的网站时实现它?
以StackOverflow为例。而不是开始设计一些web表单,你首先集中在做面向对象的建模的实体在你的问题领域,例如用户,问题,答案,投票,评论等。由于设计是由问题领域的细节驱动的,所以它被称为领域驱动设计。
你可以在埃里克·埃文斯的书中读到更多。
首先,如果你不知道你需要它,那么你可能不需要它。如果你没有意识到DDD解决的问题,那么你可能就没有这些问题。甚至DDD的倡导者也会经常指出DDD仅适用于大型(>6个月)项目。
假设你还在阅读这篇文章,我对DDD的看法是:
DDD是关于尝试使您的软件成为现实世界系统或过程的模型。在使用DDD时,您应该与领域专家密切合作,他们可以解释实际系统的工作方式。例如,如果您正在开发一个处理赛马投注的系统,您的领域专家可能是一位经验丰富的庄家。
在您和领域专家之间,您构建了一种通用语言(UL),它基本上是系统的概念描述。其思想是,您应该能够以领域专家能够阅读并验证其正确性的方式写下系统所做的事情。在我们的博彩例子中,无处不在的语言将包括诸如“种族”、“赌注”、“赔率”等词的定义。
UL描述的概念将构成面向对象设计的基础。DDD提供了一些关于对象应该如何交互的明确指导,并帮助您将对象划分为以下类别:
Value objects, which represent a value that might have sub-parts (for example, a date may have a day, month and year) Entities, which are objects with identity. For example, each Customer object has its own identity, so we know that two customers with the same name are not the same customer Aggregate roots are objects that own other objects. This is a complex concept and works on the basis that there are some objects that don't make sense unless they have an owner. For example, an 'Order Line' object doesn't make sense without an 'Order' to belong to, so we say that the Order is the aggregate root, and Order Line objects can only be manipulated via methods in the Order object
DDD还推荐了几种模式:
存储库,一种持久化模式(保存和加载数据,通常从数据库到数据库) 工厂,用于对象创建的模式 服务,一种用于创建对象的模式,该对象操作您的主域对象,而不是域本身的一部分
现在,在这一点上,我不得不说,如果您以前没有听说过这些东西,那么您不应该在任何有最后期限的项目上尝试使用DDD。在尝试DDD之前,您应该熟悉设计模式和企业设计模式。知道这些会使DDD更容易掌握。而且,如上所述,InfoQ上有一个免费的DDD介绍(在那里您还可以找到关于DDD的讨论)。