像梦一样奔驰|谈DDD领域驱动设计和建模( 三 )


  • 实体(Entity):拥有唯一标识的对象 。
  • 值对象(Value Object):没有唯一标识的对象 。
  • 工厂(Factory):定义创建实体的方法 。
  • 资源库(Repository):管理实体的集合并封装其持久化过程 。
  • 服务(Service):实现不能指派或封装在一个单一对象上的操作 。
对于实体很容易理解 , 也就是业务对象 , 通过业务场景分析和识别的业务对象 。 而值对象更多的是属性集合 , 值对象是没有行为的 , 类似于结构体 。 这个是实体和值对象最主要的区别 。 书里面举了一个例子 , Customer是一个实体 , 有具体的行为;而Address地址信息包括了街道 , 省份 , 区域等各种信息且都属于地址内容 , 可以抽象为一个值对象 , 而地址本身是没有任何行为的 。
对于实体 , 在UML彩色建模里面分了四种不同的类型:
像梦一样奔驰|谈DDD领域驱动设计和建模1. Party, Place, Thing
Party: 事件的参与方 , 例如某人人、某组织等
Place: 事件的发生地 , 例如仓库、零售店铺
应当是指事件中具体的物品 , 比如客户的购买事件中 , thing可能不是指订单(order) , 而是订单中具体的物品 , 例如图书、衣服等 。
2. Role
角色 , 对party, place, thing的参与行为、方式的抽象 。
3. Moment-Interval
指业务的活动、对象等 , 因业务需要和法律原因等需要操作、记录、追踪的东西 , 例如销售、订单、预定、航班、会议、行程等 。
4. Description
对某一类型事物的额外描述数据 , 例如产品有各种基本属性 , 但各种类型的产品差异比较大 , 比如做电子商务系统时 , 图书、服装、眼镜等不同类型的商品 , 在前台购买流程、后端订单处理流程、财务记账处理、库存管理方式、售后服务原则等各方面都会存在比较大的差异 , 这些差异按照产品类型设计成产品的额外描述属性 , 这些被称为description 。
可以看到UML彩色建模本身就是对领域驱动设计思想的一个实践 , 特别是对于实体进行了细分 , 将事物和业务互动实体 , 操作者都进行了分离 。 这个分离本身有一个巨大的好处 , 就是通过Color为不同的颜色 , 通过颜色的识别让静态的领域模型增加了动态性的信息 。
资源库(Repository)的作用是管理实体的集合 , 并封装其持久化过程 , 这里面说明了资源库管理实体对象的全生命周期 。 注意对实体对象生命周期管理的很多行为和操作已经不在实体类中 , 而是在资源库中 , 资源库转变为一个操作类和类实例化后持久化的一个结合 。 而这里让我感到疑惑的点仍然在在领域建模的初期可以关注类之间的关系和聚合 , 但是不能过早过渡到资源库分析 , 即从静态领域建模过渡到动态行为分析 。
服务简单点讲就是接口 , 在做领域分析的时候会发现有些领域很难映射到对象 , 拥有属性和暴露行为 , 这个时候就应该识别为服务 。 服务一个重要作用仍然是屏蔽领域逻辑内部复杂性 , 体现高内聚 , 松耦合的思想 。
注意SOA方法论里面很重要的一点仍然是业务和流程驱动IT和架构 , 业务架构和模型在先 , 而技术架构和模型在后 , SOA从业务入手的重点正式流程和业务实体两个重要内容 , 而我们识别 , 分析流程的目的仍然在于通过流程分析识别业务实体和交互关系 , 所以将领域驱动设计的一些思路融入到SOA的系统分析和设计中可以更好的和SOA业务建模阶段结合 。 业务分析师关注业务和流程 , 技术架构师关注实体识别和涉及事务 , 接口等 。
领域模型-实体对象和值对象
像梦一样奔驰|谈DDD领域驱动设计和建模对于实体Entity和值对象Value Object是领域驱动设计里面两个重要的模型对象 。 所以有必要对两者的关系和区别进行理解 。 以下部分内容直接引用自《领域驱动设计》一书相关内容 。


推荐阅读