首先,如果您不知道需要它,则可能不需要它。如果您没有意识到DDD解决的问题,那么您可能没有这些问题。即使DDD的拥护者经常指出,DDD仅适用于大型(> 6个月)项目。假设您仍在阅读此处,我对DDD的看法是:DDD旨在尝试使您的软件成为现实世界系统或过程的模型。在使用DDD时,您应该与一个domain expert紧密合作,他可以解释现实世界系统的工作方式。例如,如果您正在开发一个处理在赛马中下注的系统,则您的领域专家可能是一位有经验的博彩商。在您和领域专家之间,您构建了一个普遍语言(UL),它基本上是系统的概念描述。想法是您应该能够以领域专家可以阅读和验证其正确性的方式写下系统所做的事情。在我们的投注示例中,普遍语言将包括诸如“比赛”、“赌注”、“赔率”等单词的定义。UL描述的概念将构成您面向对象设计的基础。DDD提供了一些明确的指导,指导您的对象应如何交互,并帮助您将对象分为以下类别: 值对象,代表一个可能有子部分的值(例如,日期可能有日、月和年) 实体,是具有标识的对象。例如,每个客户对象都有自己的标识,因此我们知道相同名称的两个客户不是同一个客户 聚合根是拥有其他对象的对象。这是一个复杂的概念,它基于一些对象没有意义,除非它们有一个所有者。例如,“订单行”对象没有“订单”属于就没有意义,因此我们说订单是聚合根,而只能通过订单对象的方法来操作订单行对象 DDD还推荐几种模式: Repository,一种用于持久化(将数据保存和加载,通常是从数据库中)的模式 Factory,一种用于对象创建的模式 服务,一种用于创建操纵主域对象的对象的模式,而不是作为域本身的一部分 现在,我必须说,如果您以前没有听说过这些东西,那么您不应该尝试在任何有截止日期的项目上使用DDD。 在尝试DDD之前,您应该熟悉设计模式和企业设计模式。 熟悉这些使得理解DDD变得更加容易。 正如上面提到的,InfoQ提供了免费的DDD入门介绍(您还可以在那里找到关于DDD的讲座)。
以StackOverflow为例,不是首先设计一些Web表单,而是先集中精力对问题域内的实体进行面向对象的建模,例如用户、问题、答案、投票和评论等。由于设计受到问题领域细节的驱动,所以称为领域驱动设计。您可以在Eric Evans的书中阅读更多相关内容。