领域驱动设计与模型驱动开发 PPT
- 格式:ppt
- 大小:11.24 MB
- 文档页数:142
软件架构中的领域驱动设计(DDD)领域驱动设计(DDD)是一种软件开发方法论,它将软件项目的设计和实现过程,建立在对业务领域的深入理解基础之上。
通过将业务领域的知识和经验融入到软件设计和开发的过程中,DDD可以帮助开发团队更好地理解业务需求,提高软件的质量和稳定性。
1. DDD的基本概念领域驱动设计的核心思想是将软件系统划分为不同的领域,每个领域都有自己的业务模型、规则和流程。
通过深入了解这些领域的特点和要求,开发团队可以设计出更加贴合实际需求的软件架构和系统设计。
在领域驱动设计中,通常会使用领域模型、领域事件和领域服务等概念,来帮助团队更好地理解和实现业务需求。
2. DDD的核心概念2.1领域模型领域模型是领域驱动设计的核心概念,它是对领域中各种实体、值对象、聚合和领域服务等概念的抽象和建模。
通过领域模型的建立,开发团队可以更好地理解业务逻辑和规则,从而设计出更加贴合实际需求的软件系统。
领域模型通常是通过领域专家和开发团队的合作来构建的,它是对业务需求的一种抽象和概括。
2.2领域事件领域事件是领域驱动设计中的另一个核心概念,它是描述领域中事件发生和影响的概念。
通过将领域中的各种事件进行抽象和建模,开发团队可以更好地理解各种业务规则和流程,从而设计出更加稳定和可靠的软件系统。
领域事件通常是领域模型的一部分,它描述了业务领域中的各种重要事件和影响。
2.3领域服务领域服务是领域驱动设计中的另一个重要概念,它是对业务领域中某些重要操作和逻辑的抽象和建模。
通过领域服务,开发团队可以更好地处理各种业务逻辑和操作,从而设计出更加灵活和可扩展的软件系统。
领域服务通常是领域模型的一部分,它描述了业务领域中的各种重要操作和逻辑。
3. DDD的应用实践在日常的软件开发过程中,领域驱动设计可以帮助开发团队更好地理解和实现业务需求,提高软件系统的质量和稳定性。
在应用领域驱动设计的实践中,通常会涉及到以下几个方面的工作:3.1领域分析和建模领域分析和建模是领域驱动设计的重要环节,它通过与业务专家的沟通和合作,来深入了解业务领域的特点和要求,从而建立起相应的领域模型、领域事件和领域服务等概念。
DDD(领域驱动设计)什么是DDD软件开发不是⼀蹴⽽就的事情,我们不可能在不了解产品(或⾏业领域)的前提下进⾏软件开发,在开发前,通常需要进⾏⼤量的业务知识梳理,⽽后到达软件设计的层⾯,最后才是开发。
⽽在业务知识梳理的过程中,我们必然会形成某个领域知识,根据领域知识来⼀步步驱动软件设计,就是领域驱动设计的基本概念。
听起来这和传统意义的软件开发没啥区别,只是换了点新鲜的名词⽽已,其实不然。
软件开发 VS DDD⼀般软件设计或者说软件开发分两种:瀑布式,敏捷式。
前者⼀般是项⽬经理经过⼤量的业务分析后,会基于现有需求整理出⼀个基本模型,再将结果传递给开发⼈员,这就是开发⼈员的需求⽂档,他们只需要照此开发便是。
这种模式下,是很难频繁的从⽤户那⾥得到反馈,因此在前期分析时就已经默认了这个业务模型是正确的,那么结果可想⽽之,数⽉甚⾄数年后交付的时候,必然和客户的预期差距较⼤。
后者在此基础上进⾏了改进,它也需要⼤量的分析,范围会设计到更精细的业务模块,它是⼩步迭代,周期性交付,那么获取客户的反馈也就⽐较频繁和及时。
可敏捷也不能够将业务中的⽅⽅⾯⾯都考虑到,并且敏捷是拥抱变化的,⼤量的需求或者业务模型变更必将带来不⼩的维护成本,同时,对⼈(Developer)的要求也必然会更⾼。
DDD则不同:它像是更⼩粒度的迭代设计,它的最⼩单元是领域模型(Domain Model),所谓领域模型就是能够精确反映领域中某⼀知识元素的载体,这种知识的获取需要通过与领域专家(Domain Expert)进⾏频繁的沟通才能将专业知识转化为领域模型。
领域模型⽆关技术,具有⾼度的业务抽象性,它能够精确的描述领域中的知识体系;同时它也是独⽴的,我们还需要学会如何让它具有表达性,让模型彼此之间建⽴关系,形成完整的领域架构。
通常我们可以⽤象形图或⼀种通⽤的语⾔(Ubiquitous Language)去描述它们之间的关系。
在此之上,我们就可以进⾏领域中的代码设计(Domain Code Design)。
领域驱动设计(3)模型驱动设计前⾯的章节强调过软件开发过程的重点:它必须以业务领域为中⼼。
我们说过让模型植根于领域、并精确反映出领域中的基础概念是建⽴模型的⼀个最重要的基础。
通⽤语⾔应该在建模过程中⼴泛尝试以推动软件专家和领域专家之间的沟通,以及发现要在模型中使⽤的主要的领域概念。
建模过程的⽬的是创建⼀个优良的模型,下⼀步是将模型实现成代码。
这是软件开发过程中同等重要的两个阶段。
创建了优良的模型,但却未能将其成功地转换成代码将把软件的质量带⼊未知境地。
曾经发⽣过软件分析⼈员和业务领域专家在⼀起⼯作了若⼲个⽉,⼀起发现了领域的基础元素,强调了元素之间的关系,创建了⼀个正确的模型,模型也正确捕获了领域知识。
然后模型被传递给了软件开发⼈员。
开发⼈员看模型时可能会发现模型中的有些概念或者关系不能被正确地转换成代码。
所以他们使⽤模型作为灵感的源泉,但是创建了⾃⼰的设计,虽然某些设计借鉴了模型的思想,另外他们还增加了很多⾃⼰的东西。
开发过程继续进⾏,更多的类被加⼊到代码中,进⼀步加⼤了原始模型和最终实现的差距。
在这种情况下,很难保证产⽣优良的最终结果。
优秀的开发⼈员可能会让⼀个产品最终交付使⽤,但它能经得起⽣产环境的考验吗?它能容易地被扩展吗?它能容易地被维护吗?任何领域都能被表现成多种模型,每⼀种模型都能⽤不同的⽅式表现成代码。
对每⼀个特殊问题⽽⾔,可能会对应不⽌⼀个解决⽅案。
我们应该选择哪⼀个呢?拥有⼀个看上去正确的模型不代表模型能被直接转换成代码。
也或者它的实现会违背某些我们所建议的软件设计原则呢。
选择⼀个能够被轻易和准确转换成代码的模型很重要。
最根本的问题是:我们应该如何动⼿处理从模型到代码的转换。
⼀个推荐的设计技巧是使⽤分析模型,它被认为是从代码设计中分离出来、通常是由多个⼈完成的。
分析模型是业务领域分析的结果,其产⽣的模型不考虑软件需要如何实现。
这样的⼀个模型可⽤来理解领域,它建⽴了特定级别的知识,模型看上去会很正确。
解构领域驱动设计(三):领域驱动设计在上⼀部分,分层架构的⽬的是为了将业务规则剥离出来在单独的领域层中进⾏实现。
再回顾⼀下领域驱动设计的分层中应⽤层代码的实现。
@Overridepublic void pay(int orderId, float amount) {DesignerOrder order = designerOrderRepository.selectByKey(orderId); // 领域对象的加载if (order == null) {AppException.throwAppException(AppExceptionMessage.DESIGNER_ORDER_NOT_EXIST_CODE, AppExceptionMessage.DESIGNER_ORDER_NOT_EXIST, orderId);}order.pay(amount); // 领域对象业务规则实现designerOrderRepository.update(order); // 领域对象状态持久化}所有的业务规则都抽象到领域对象,⽐如“order.pay(amount)”抽象了付款的业务规则。
领域对象由状态(对象的字段、属性)和操作(对象的⽅法)构成,领域对象的操作⽤于实现业务规则,业务规则执⾏完成后更改领域对象的状态。
领域对象的持久化交给了基础设施层,这⾥,Repository⽬的是持久化领域对象状态。
领域驱动设计,即领域模型驱动程序设计,它的核⼼是保证系统的实现与实际的业务规则⼀致,完整实现了领域模型。
它包含了两个部分:领域模型、领域模型的编程实现。
在软件设计和实现过程中要充分利⽤领域模型,设计过程中,领域模型作为与业务专家的沟通语⾔;实现过程中,领域模型作为与开发⼈员沟通的语⾔。
领域模型在软件⽣命周期过程作为通⽤语⾔。
1 领域模型领域建模(这⾥不重点介绍如何建模)⽅法论产出领域模型。
我们可以使⽤UML建模,使⽤最简单、最容易理解的名词-形容词-动词法对领域知识进⾏建模,使⽤该模型作为与业务、技术团队沟通的通⽤语⾔。
领域驱动设计领域中的分层模式(LAYERED ARCHITECTURE)依次分为⽤户界⾯层,应⽤层,领域层,基础设施层各层主要任务⽤户界⾯层:想⽤户显⽰信息和解释⽤户指令。
应⽤层:定义软件要完成的任务,并指挥表达领域概念的对象来解决问题。
应⽤层应尽量简单,不包含业务规则或知识,⽽只是为下⼀层中的领域对象协调任务,分配⼯作,屎他们相互合作。
他没有反映业务情况的状态,但是却可以具有另外⼀种状态,为⽤户或程序显⽰某个任务的进度。
领域层(模型层):负责表达业务概念,业务状态信息以及业务规则。
尽管保存业务状态的技术细节是由基础设施层实现,但是反映业务情况的状态是由本曾控制并使⽤的。
此层是软件的核⼼。
基础设施层:为上⾯各层提供通⽤的技术能⼒,为应⽤层传递消息,为领域层提供持久化机制,为⽤户界⾯绘制屏幕组件,等等。
基础设施层还能通过架构框架来⽀持四个层间的交互模式。
例⼦为⽹上银⾏功能分层⽐如转账功能,牢记处理基本业务规则的是领域层⽽不是应⽤层,如A转给B100元则应⽤层提供 transfer(A,B,100)服务,领域层则提供具体转账服务,和规则控制,应⽤层只是通知机制,通知领域层进⾏⼀些列活动,应⽤层不该涉及领域层知识。
各层之间应该是上层依赖与下层,但是当下层需要和上层通信时需要依赖于回调模式或观察者模式。
软件中所表⽰的模型1.关联关联可以有多种,⼀对⼀,⼀对多,多对多,关联越复杂则实现会更加复杂,所以我们需要对关联进⾏处理减少不必要的关联,下⾯3种⽅法让关联更难控制。
1)规定⼀个遍历⽅向2)添加⼀个限定符,以便有效减少多重关联3)消除不必要的关联坚持将关联限定为领域中所偏重的⽅向,不仅可以提⾼这些关联的表达⼒并简化其实现,⽽且还可以突出剩下的双向关联的重要性2,Entity实体有⼀下两个特性1)他在整个⽣命周期中有连续性2)他是⼀些对⽤户来说⾮常重要的不同状态不是由属性决定的。
Entity建模Entity 最重要的职责是确保连续性,⼀边其⾏为更清楚且可以预测,保持实体简练是实现这⼀责任的关键,抓住Entity对象定义的最基本特征,尤其是那些⽤于识别查找或者匹配对象的特征。
软件架构中的领域驱动设计(DDD)领域驱动设计(DDD)是一种软件架构方法,旨在在设计和开发软件系统时,通过深入理解业务领域和将领域模型融入设计中,实现更加高效的系统开发和更好的业务需求实现。
在本文中,我们将详细探讨领域驱动设计的概念、原则、实践和优势,以及在实际项目中如何应用和实施DDD。
一、领域驱动设计概念领域驱动设计是由埃里克·埃文斯(Eric Evans)在其著作《领域驱动设计:软件核心复杂性应对之道》中首次提出的。
领域驱动设计的核心概念是将业务领域的知识和逻辑融入到软件设计和开发中,以实现更加贴近业务需求的系统构建。
在DDD中,领域模型是关键的组成部分,它代表了对业务领域知识的深入理解和抽象,是软件系统的核心。
二、领域驱动设计原则1.模型驱动:领域模型是系统设计的核心,所有的设计与开发工作都要围绕领域模型展开。
2.领域专家参与:在领域驱动设计中,需要业务领域的专家参与,帮助建模和设计。
这样可以确保系统能够准确地反映业务需求。
3.共享语言:领域模型应该是开发团队和业务专家之间的共同语言,确保沟通和理解的准确性。
4.划分领域边界:将业务领域划分为不同的子领域,每个子领域有自己的领域模型和边界,可以更好地组织和管理系统的复杂性。
三、领域驱动设计实践1.领域建模:通过与业务专家合作,建立领域模型,包括实体、值对象、聚合、领域服务等,描述业务逻辑和知识。
2.领域驱动设计模式:使用DDD提供的一些设计模式,如实体、值对象、领域服务、聚合根等,来组织和表达领域模型。
3.领域事件驱动架构:在领域驱动设计中,事件是一个重要的概念,可以帮助系统解耦和实现松耦合的设计。
4.领域驱动设计工具:有一些工具可以帮助开发团队进行领域驱动设计,如UML建模工具、领域建模工具等。
四、领域驱动设计优势1.高内聚低耦合:DDD强调领域模型的设计与实现,可以更好地实现高内聚低耦合的系统设计。
2.更好的业务实现:领域模型是对业务领域的深入理解和总结,可以更好地满足业务需求。