目录
一、前言
二、DDD是什么
三、DDD和MVC的比较
四、DDD究竟能带来什么价值
1. 业务(团队)价值
1.1 统一语言
1.2 清晰的边界定义
1.3 领域能力沉淀和复用
1.4 面向业务建模
1.5 设计和代码的等价
2. 个人价值
2.1 提升全局视野
2.2 提升业务sense
2.3 构建体系化思维
五、DDD缺点
六、核心概念
1. 战略方法论
1.1 领域
1.2 子域
1.3 通用域
1.4 支撑域
1.5 限界上下文
1.6 小结
2. 战术方法论
2.1 实体
2.2 值对象
2.3 聚合根
2.4 聚合
2.5 领域服务
2.6 领域事件
2.7 资源库
2.8 小结
七、领域建模
1. 事件风暴建模
2. 四色建模
八、建模实例
1. 梳理业务流程
2. 建模-概念模型
3. 建模-领域模型
九、总结
一
前言
PS:我最后想了下,还是要用个完整的示例来演示下DDD的建模流程,否则光说理论体感太弱,所以文章最后部分,我结合四色建模,加上我自己的过往建模经验,演示了某体验产品0-1建设的具体流程(暂不涉及代码和工程部分),比较喜欢看具体示例的可以直接拖到最后一部分。
二
DDD是什么
领域驱动设计——软件设计复杂性解决之道。它是为了解决复杂软件设计的一种优秀方案,但不是唯一。 它把所有的业务规则、定义、范围、知识等抽象成了一个大的概念,叫做领域。比如用户支付的业务场景,叫做交易域;平台提供售后等服务叫做服务域(或客服域),还有其他诸如金融域,人效域,物流域等。 它应对复杂性的思想,总结下来既简单,又精炼,叫做“分而治之”。把最大化的领域(复杂问题)分为下层的一个个子域,同时每个子域又规定好边界和核心实体,通过一系列的拆分、归类、衍生,最终找到最优解。 业务是在变的,如何从多变的业务环境中,保持内核的稳定性和扩展性,适应多变的业务发展,这是应对复杂性的第二个关键点。 领域模型是一套贯穿了整个软件,从设计到交付的生命周期的方法论,因为他的共识性,可以让开发、产品、架构师围绕着统一的模型去设计和探讨,不至于走样。 领域模型的图形表达方式,在实操上除了实体模型图的表达比较特殊,其他的时序、状态机、流程图其实无特殊性。 领域模型是业务的抽象,这点很关键,同时领域模型的设计应该是基于现实,但不等于现实。 评论领域模型设计是否优秀的方法很简单:5年后,剔除掉所有的增值域,第一版建设的域模型是否还符合优秀的稳定性、扩展性和灵活性。 领域模型不是所有的软件工程都适合,我经常会问面试者一个问题,一个FBI(数据看板系统),一个电商交易系统,它们都适合用DDD吗,为什么?

三
DDD和MVC的比较

MVC架构没有边界划分的概念和规范,在复杂的业务场景下会造成盘根交错的逻辑依赖,同时随着业务场景的不复杂化,代码意图会逐渐模糊,维护成本增加,对于系统的稳定性也会带来挑战。 MVC仅反映软件架构的分层,不定义业务语义的抽象和表达,对于业务知识的沉淀和复用性来说,不太友好。 MVC分割了数据和行为的表达,Model层(pojo)定义数据,Service层表述行为,会造成业务逻辑的首尾分离。
四
DDD究竟能带来什么价值
业务(团队)价值
统一语言
清晰的边界定义
领域能力沉淀和复用
面向业务建模
设计和代码的等价
个人价值
提升全局视野
提升业务sense
构建体系化思维
五
DDD缺点
逻辑相对简单的业务和产品(比如一些小型公司的内部OA系统),用传统的MVC架构会更适合,构建也更快速。 非业务形态产品和应用并不适合,比如bigdata。这类应用和业务专注于数据层的交互和适配,并无强业务语义类诉求,而DDD最关键的一部分就是业务领域的抽象和包装,切记,它解决的是负责业务问题。
六
核心概念

DDD战略+战术全景图

首先第一步,根据业务诉求,提炼出整体的业务流程,同时拆解出里面的关键事件,角色,参与者等核心实例。整个拆解和梳理的方法论,目前业界有一些比较成熟的,比如事件风暴,四色建模法等,后面单独讲。 提炼完整个业务流程后,进入战略设计阶段,这个阶段主要是从全局和顶层的视角,把整个业务语义转换为结构化分层。通过领域和子域的划分,同时结合通用域、支撑域、限界上下文等设计,分解问题复杂度,其实就是前面说到的“分而治之”的思想。 接下来就会到具体的战术设计阶段,通过前面的战略设计阶段,已经把整个领域、边界、上下文等关键模块都梳理完成,现在就是从各个域中再次拆解更细粒度的模块,去指导最终的编码实现,这些更细粒度的模块包括实体、聚合、聚合根等。 最后就到了编码实现阶段,DDD有一个关键价值,叫做“设计即实现”,所以在战术阶段的设计,理论上是可以直接作用于代码的分层结构,如果架构和战术阶段有出入,说明之前的设计有问题,可以复盘重新推演。

战略方法论
领域
子域
通用域
支撑域
限界上下文
小结

某体验产品的整体战略设计
战术方法论
实体
贫血模型:贫血模型是指领域对象只具有数据属性,缺乏相关的行为逻辑。在贫血模型中,业务逻辑主要存在于服务层或者其它外部对象中,领域对象仅被视为被动的数据容器。这种模型在领域驱动设计(DDD)中被认为是反模式,因为它无法更好地体现领域的核心概念和规则。 失血模型:和贫血模型相似,指的是领域对象缺少业务逻辑和领域行为,以至于数据和行为的重要部分都被丢失。这种模型经常出现在面向对象的开发中,尤其是基于关系数据库的实现中。 充血模型:充血模型是在领域对象中充分体现了业务逻辑和行为的模型。充血模型积极地包含了数据和相关的行为逻辑,它使得领域对象能够更好地封装与之相关的业务规则和行为,提供了更加一致和抽象的编程接口。充血模型是DDD中推崇的设计模式,使得领域对象能够成为业务规则的中心。 涨血模型:涨血模型是指在充血模型的基础上,进一步将领域对象的状态和行为扩展到前沿技术和新的设计模式中(有些理念力,涨血模型和充血模型的区别在于,涨血模型添加了持久层的行为)。
值对象
聚合根
聚合
领域服务
领域事件
资源库
小结

某体验产品协同域的战术设计
七
领域建模
领域模型:包含领域对象、属性、关系、行为、边界范围等各个方面,用于描述业务的本质,这也是最重要的产出物。 用例图:用于明确系统的功能。 数据模型:描述系统的数据结构和关系,包括实体关系模型、关系数据库模型等。 状态图:用于描述系统各个状态及其转移条件。 活动图:用于描述系统流程中的各个活动及其关系。 序列图:描述系统中各个对象之间的交互过程和消息传递序列。 架构模型:包含系统的物理和逻辑结构,包括组件、模块、接口等。
事件风暴建模

用户角色:通常使用人物标签或者角色名字来代表具体的用户,例如 “客户”、“管理员”等。 业务事件:使用动词来描述业务活动或事件,如“创建订单”、“审核申请”、“发货”等。 识别的领域概念:在事件风暴中,通过写在有色便利贴上来标记关键的业务概念,例如“订单”、“产品”、“支付”等。这些概念有助于团队识别和理解业务的重要方面。 粘贴便利贴:使用不同颜色的便利贴来表示不同的类型或者关注点。例如,可以使用黄色便利贴表示业务活动和概念,使用蓝色便利贴表示抽象的过程和规则,使用粉色便利贴表示意见、问题或待解决的事项。 关系箭头:可以使用箭头来表示业务事件之间的关系,例如表示事件的先后顺序、依赖关系等。
主持人的综合能力,尤其体系在最后的收敛上,是否能把如此多的脑暴信息,提炼成关键点。 事件风暴是一个比较“重”的方法,对于一些0-1建设的大型项目(1000人日以上)比较适合,一些中小型项目有些“过渡设计”。
四色建模

时标原型(Moment-Interval Archetype,也称业务关键时刻,简称MI):表示事物在某个时刻或某一段时间内发生的,如销售订单、收款记录等,使用浅红色表示。 PPT原型(Part-Place-Thing Archetype,人/事/物原型,简称PPT):表示参与扮演不同角色的人或事物,如商品、账户、店铺等,使用浅绿色表示。 角色原型(Role Archetype,简称ROLE):抽象了一种参与方式,由人或组织机构、地点或物品来承担,如客户、商家、财务组织等,使用浅黄色表示。 描述原型(Description Archetype,简称DESC):对上述颜色表示的内容进行解释,用于分类或者描述建模过程中产生的数据、事件或者活动,使用浅蓝色表示。
建立时标原型:寻找需要追溯的事件,根据追溯事件寻找足迹。 建立PPT原型:丰富模型,寻找时标原型周围的人/事/物,使它可以更好地描述业务概念。 建立角色原型:进一步从中抽象出可以参与到不同流程中去的角色。 建立描述原型:把一些信息用描述对象补足。
八
建模实例
梳理业务流程

具备收集用户所有原始“声音”的能力,否则我们无法从全局的角度去分析这个事情,这里的原声渠道需要尽可能多的涵盖用户想表达诉求的入口,才能全面,比如在线咨询、热线咨询、工单、评价等。 有了声音之后,我们需要具备分析声音,同时通过声音提炼出具体问题的能力,让分析人员能够快速精准的判别用户的问题是什么。 同时平台也应该具备快速及时的前置发现问题的能力,把这些重要的、紧急的问题通知到关键人员手上,让他们第一时间知晓。 最后,不管是主动分析出问题,还是收到了重要的问题通知,都应该立即着手处理这些问题。同时因为这些问题涉及的业务,bu,归属都不尽相同,所以处理的方案和流程也应该体现不同,这也衍生出在协作处理过程中,链接的上下游平台应该会非常多,处理动作和内容会很丰富。

体验VOC产品业务流程
时标原型:用户原声、原声问题明细、预警单等,表述某一时刻产生的关键事件,一般是运行态的实体。同时基于VOC的业务,我们分别划分了3个阶段:分析问题、定位问题、解决问题。同时结合上面的思考,最关键的几个时标原型分别是分析阶段的用户原声,定位阶段的预警单,解决阶段的协同单(按照战术方法论,这3个时标原因就是聚合根)。 PPT原型:数据渠道、分析视图、问题标签模板等,一般是配置态或维度相关实体。 角色原型:系统、运营管理员、分析师等,这块比较好理解,使用产品的角色(一般可以不把系统角色放进去,这里放上去是为了便于理解)。
建模-概念模型
概念模型因为是更高层次的抽象,所以只表述核心的概念和关系,不表述细节和完整实体,所以会更简单,清晰。 团队之间交流共享时,尤其是在和业务,产品同学交流时,他们往往不会太过关注细节,用概念模型来交流理解会更合适。 概念模型一般用在一级域的设计上,它必须要体现全局性,整体性。所以它是具备方向上的指导意义,我建议在新的一级域项目建设初期,一定要做概念模型的建模(像交易、商品、营销、体验、客服这些都属于一级域)。

某体验产品概念模型
建模-领域模型

九
总结