The DoYouHaoBaby PHP Framework中文开发文档手册
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
[ 领域驱动设计概述 ]
Eric Evans所著的《领域驱动设计》(Domain-Driven Design:通常简称为“DDD”)详细地探讨了以“领域”为中心的软件开发模式,构建高质量的大型复杂软件。
领域的含义:
简单的说,每个软件程序都会与其用户的活动或兴趣相关,其中使用程序的主要环境称为软件的“领域”。
领域中形形色色的业务逻辑构成了软件丰富多采的行为。通常我们的文章管理系统(CMS),它里面的置顶,加精等操作就是领域逻辑。这样看来,似乎用例对应的动作都是领域逻辑了,但是答案是否定了,比如说,文章管理系统中保存文章往往就不是领域逻辑,因为它只是一个和持久化相关的动作而已,是纯粹的技术实现。看到这,这里给出一个判断是否是领域逻辑的原则:就是这个逻辑动作是否有明确的业务上的含义,或者说是否是业务相关的,而不仅仅是技术相关的。
只有将技术实现手段从领域问题中剥离才能保证领域本身的精炼,保证程序员可以把精力集中到领域问题本身上来,而不会满脑子都是技术实现手段。
领域的组成:
通常将领域中的组成角色分为以下五种:
- 实体(Entity):拥有唯一标识的对象。
- 值对象(Value Object):没有唯一标识的对象。
- 工厂(Factory):定义创建实体的方法。
- 仓储(Repository):管理实体的集合并封装其持久化过程。
- 服务(Service):实现不能指派或封装在一个单一对象上的操作。
领域的思考:
下面针对上面介绍的五种领域角色来逐一讨论。
实体:
有一类对象看上去好像拥有标识符,它的标识符在历经软件的各种状态后仍能保持一致。对这些对象来
讲这已经不再是它们关心的属性,这意味着能够跨越系统的生命周期甚至能超越软件系统的一系列的延
续性和标识符。我们把这样的对象称为实体。
值对象:
我们对某个对象是什么不感兴趣,只关心它拥有的属性。
用来描述领域的特殊方面、且没有标识符的一个对象,叫做值对象。
工厂:
因此,有必要引入一个新的概念,这个概念可以帮助封装复杂的对象创建过程,它就是工厂(Factory)。工厂用来封装对象创建所必
需的知识,它们对创建聚合特别有用。当聚合的根建立时,所有聚合包含的对象将随之建立,所有的不变量得到了强化。
仓储:
使用一个资源库,它的目的是封装所有获取对象引用所需的逻辑。领域对象不需处理基础设施,以得到领域中对其他对象的所
需的引用。只需从资源库中获取它们,于是模型重获它应有的清晰和焦点。
服务:
在我们开发通用语言时,领域中的主要概念被引入到语言中,语言中的名词很容易被映射成对象。
语言中对应那些名词的动词变成那些对象的行为。但是有些领域中的动作,它们是一些动词,看上去却不属于任何对象。它们代表了
领域中的一个重要的行为,所以不能忽略它们或者简单的把它们合并到某个实体或者值对象中。
当这样的行为从领域中被识别出来时,最佳实践是将它声明成一个服务。
