DDD领域驱动设计如何构建复杂业务系统的?

摘要:DDD领域驱动模型设计 DDD是一种软件设计思想和方法论,以领域为核心构建软件设计体系,将业务模型抽象成领域模型进行拆解和封装。 Domain Driven Design(领域驱动设计, DDD),不是一种架构,而是一种架构方法论,是一种拆
DDD领域驱动模型设计 DDD是一种软件设计思想和方法论,以领域为核心构建软件设计体系,将业务模型抽象成领域模型进行拆解和封装。 Domain Driven Design(领域驱动设计, DDD),不是一种架构,而是一种架构方法论,是一种拆解业务、划分业务、确定业务边界的方法,是一种领域设计思想。 DDD(领域驱动设计)实际上是一套软件架构设计的方法论,我们可以在此之上更好的理解业务。并且我们可以根据这套方法论进行架构风格填充,包括微服务架构,面向服务架构,REST风格架构以及六边形架构等等。 其核心思想是: 以领域为核心驱动力构建软件设计体系,并围绕业务概念抽象出领域模型,通过领域和边界划分将复杂的业务模型抽象化、简单化,最终实现复杂软件应用系统的拆解和封装。 DDD领域驱动设计的优缺点 实现DDD的最大好处是第一时间将业务需求构建成领域模型,而不是将其切割为数据和行为,然后再用数据库去实现。DDD具有以下优点: 统一业务语言:通过使用统一的领域语言,准确传达业务规则,提升团队间的沟通效率。 清晰业务边界:统一各个子域的认识,通过领域模型界定需求实现边界。 提升变化应对:通过领域模型与数据模型的分离,将核心业务的不变与需求的变进行有效隔离,提升架构应变化的能力。 当然使用DDD需要一定的学习和使用成本,开发人员需要掌握一定的领域建模知识和技能。同时在高并发场景下,由于DDD使用的模型可能会增加一些额外的开销。 关键词解释 1.领域 领域其实就是我们的范围,而范围实际上就是我们的边界,我们做什么,做到什么程度,最低多少 ,最高多少。 领域其实就是我们的范围,而范围实际上就是我们的边界,我们做什么,做到什么程度,最低多少 ,最高多少。 比如 电商 就是一个领域,金融是一个领域,教育是一个领域,你要确定你做的软件产品,具体的领域边界,分析涉及到的数据,业务规则,流程,然后通过面向对象的方式建立一个模型,再选择合适的技术实现。 2.子域 领域太过于复杂,业务太过于分散,这个时候我们做一个拆分,把领域划分成子域,比如电商系统很复杂,将他拆分成比如一个个的模块,订单,商品,库存,甚至我们的模块还能进行细分,比如库存,可以分为本地库,异地库,三方托管库。划分子域 1 是分治,2是可以对子域进行分析,重要的子域加资源。 3.核心域(子域) 业务核心,核心的竞争力,因为企业愿景不同,领域愿景也不同,核心域也不同,说白了,就是你们项目最初立项的目的是什么,目标是什么。为什么要做这个项目。核心域的范围并不一定是一次就能确认的,可能需要迭代很多次,每一次都有可能扩大或缩小。 4.通用域(子域) 整个领域都能够用到的子域,比如我们的认证,权限等等相关的模块,这就是我们的通用域。 5.支撑域(子域) 支撑域实际上就是不包含核心竞争力的功能,也不包含通用的功能,但是又是必须的支撑。 6.通用语言 必须要有一个东西能够让我们的团队人员交流起来有一个标准。并且他还需要能够正确的,简单的,清晰的表达业务。让我们的技术专家,业务人员,产品,测试,架构都能够达成共识,并且协同合作。这个叫做通用语言,类似需求文档里的词语解释,就是让大家能在同一维度进行高效的交流沟通。 7.限界上下文 限界和上下文。限界就是领域的边界,也就是范围,而上下文则是语义环境。通过领域的限界上下文,我们就可以在统一的领域边界内用统一的语言进行交流。 8.领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示,领域模型是用来描述业务对象之间的引用关系。 业务角色,业务角色表示的是一个角色承担的一系列责任。比如收银员,他的责任是计算商品价格,收钱,找零,甚至退换货。 业务实体,业务实体表示的是其实你使用或者可交付的工件,资源,事件。比如电商项目中的商品。你需要给卖家打印的发票。 业务用例,实际上业务用例显示的是协作角色与业务实体之间如何执行工作流程,也就是我们的业务链路 实体(Entity) 正常的实体对象,有唯一键标识,就算所有字段内容一样也不是一个,例如学生,id,姓名,年龄,就算姓名年龄一样,也不是一个。 9.值对象(Value Object) 没有唯一性标识,例如 学生实体上有一个地址,这个地址是一个对象,里面字段为,省,市,街道,详细地址,这个地址信息对象就是值对象。通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体: 业务形态:值对象只是若干个属性的集合,只有数据初始化操作和有限的不涉及修改数据的行为,基本不包含业务逻辑。 代码形态:值对象在代码中有这样两种形态。如果值对象是单一属性,则直接定义为实体类的属性;如果值对象是属性集合,则把它设计为 Class 类,Class 将具有整体概念的多个属性归集到属性集合,这样的值对象没有 ID,会被实体整体引用。
阅读全文