领域驱动设计思路讲义ppt课件.ppt
《领域驱动设计思路讲义ppt课件.ppt》由会员分享,可在线阅读,更多相关《领域驱动设计思路讲义ppt课件.ppt(124页珍藏版)》请在三一办公上搜索。
1、领域驱动建模(Evans DDD),为什么使用MDD/DDD,MDD是模型驱动设计,与MDA模型驱动架构类似,体现为MDD = DDD + DSL。MDD is faster MDD很快(真正快速开发)在MDD应用模型中能够指定一个比传统的编程语言更高的抽象层次。该模型能够自动转化为可立即运行工作的应用程序(通过UML工具),生成可解释/执行模型代码。模型中的每个元素代表了多行代码,这样使得模型在一个更高的抽象层次比相应的代码要精简得多,更能大道至简。 MDD is more cost-effective MDD更具有成本优势因为MDD快速开发所以比较快地推向市场,MDD意味更少的人员 专家,
2、更高的质量,成本只是你学习MDD的成本以及工具采购,使用MDD拓展和维护应用程序的做法也更符合成本效益。通过更高级别模型阅读,比较容易理解应用程序。,MDD/DDD优点,MDD leads to increased quality MDD引导质量提高因为软件架构是在一个更高模型级别定义,然后通过引擎或框架转换成代码,这样我们能够让我们最优秀的人员从事引擎和框架的开发,进而提高平台的质量。 我们在项目中学习到的最佳实践模式可以被导引到引擎或框架代码产生器中,这样将被重用到所有使用MDD的项目中。MDD is less error-proneMDD很少出错测试会浪费很多时间,因为MDD可以确保代码
3、的质量,这样让你可以专注于测试应用程序的特点功能即验收测试上,不必关注通用的一些测试项目,如基础设施相关的技术问题或安全漏洞,MDD/DDD优点,MDD leads to meaningful validationMDD引导有意义的校验业务验证都已经在更高级别的模型中完成,编程工具只能帮助你验证代码语言的错误,不能验证业务上的错误。使用DSL能够在设计时候就执行一下,这样,错误信息也是 domain-specific级别的,可见Static Verification: An External DSL Advantage一文。MDD results in software being less
4、sensitive for changes in personnelMDD可以不在乎人事变动不需要特别的技术高手或架构师就能够建立软件,节约人力成本。此外,如果有人加入一个项目,比较容易理解高层次的软件应用模型,这比试图通过阅读理解源代码要轻松多)。,MDD/DDD优点,MDD empowers domain expertsMDD授权领域专家业务领域专家能够注重建模,而技术专家可以专注于建立一个MDD需要的框架或DSL等工具。一个软件系统不再只是程序编制就可以了,领域专家可以通过符号(如文字,图形,表格)等直接表达他们对业务领域的深入理解 。8. MDD let advanced progra
5、mmers focus on the hard stuff MDD能够让高级程序员专攻难关在MDD中,高级程序员的重复性工作要少得多,他们可以专注于他们工作的创造性方面。他们可以集中精力建设MDD的工具。他们还可以指导初级开发或领域的专家,也可以申请领取困难攻关,领域专家可以专注例如模型的图形用户界面,流程和业务规则。而应用程序的集成部分(使用webservices,API调用,数据库集成等)对于领域专家来说,存在太大困难,可以由高级程序员来完成。,MDD/DDD优点,MDD bridges the gap between business and IT MDD在业务和IT之间架设了桥梁领域专
6、家(或系统分析师)可以直接参与业务发展进程(见第7点)。技术专家(软件应用)可以在一个更高的层次定义尽可能和领域概念的定义声明有关模型。通过在模型和模型实现之间定义一个重要的转换机制,就可以在业务和IT技术之间建立一个桥梁,比如使用一个基于model-driven SOA的框架。 MDD results in software being less sensitive for changes in business requirements MDD可以减少业务需求带来改变的影响面对软件开发的问题之一是业务需求经常变化速度超过了软件系统支持改变,这对于企业是一个重点战略问题:能够保持足够长的时间
7、调整其核心业务与IT流程。MDD使软件开发更快,它也导致更容易改变应用。如果在业务需求和软件之间的存在一个联系,那么应用程序甚至有可能自动适应部分模型的变化。,MDD/DDD优点,MDD results in software being less sensitive for changes in technology MDD导致技术对变化不是太敏感技术变化很快, Java EE, SOA / SOBA, webservices,REST, SCA, OSGi等等,甚至迁移到云计算环境,当您希望您的应用程序迁移到其他技术时,MDD可以确保你不必改变你的应用模型,。唯一需要改变的代码生成器(或D
8、SL解释器)。改变后的代码生成器(或添加额外的代码生成选项)可以帮助所有的应用程序模型直接转换成基于新技术架构的代码。MDD really enforces architecture MDD增强架构当使用MDD开发软件应用程序,保证符合选定架构。你可以真正实现架构标准化, 构建架构原则Constructional architecture principles能够知道设计构建,并且能够反映在代码生成器或解释器中。,MDD/DDD优点,MDD captures domain knowledge MDD可以截获领域知识关于MDD的优点是,你不是只创建软件,但你也捕捉正式高层次的领域知识模型。在大多
9、数情况下这方面的知识是不明确,见文章基于DDD的DSL MDD provides up-to-date documentation MDD提供最新的文档当使用MDD,您不会遭遇不完整或过时的文件,因为该模型使用正确的抽象,可以让领域专家和客户都能看懂。MDD enables to focus on business problems instead of technology MDD能够关注业务而不是技术停止讨论使用WS-* 或者REST,MDD能够让你专注于业务问题如何解决,而不是着眼于如何解决这些问题的技术支撑。,Evans DDD,2004年Eric Evans 发表Domain-Dri
10、ven Design Tackling Complexity in the Heart of Software (领域驱动设计 )简称Evans DDD领域建模是一种艺术的技术,它是用来解决复杂软件快速应付变化的解决之道,Evans DDD,领域模型重要性,没有领域模型,只是靠代码编写完成一个又一个功能,复杂的领域需求会使得他们无法交流讨论,使工作陷入泥沼。有少许领域模型,但是没有维护好模型与代码直接的联系,两者产生差异,无法实现。,DDD优点,分析设计发展的三个阶段,第一阶段:围绕数据库的驱动设计,新项目总是从设计数据库及其字段开始。第二层次:面向对象的分析设计方法诞生后,有了专门的分析和设
11、计阶段之分,分析阶段和设计阶段是断裂的。第三阶段:融合了分析阶段和设计阶段的领域驱动设计(Evans: DDD)。,第一阶段:传统的数据库方式,过去软件系统分析设计总是从数据库开始,这种围绕数据库分析设计的缺点非常明显:1.分析方面:不能迅速有效全面分析需求。2. 设计方面:导致过程化设计编程,丧失了面向对象设计的优点。2. 运行方面:导致软件运行时负载集中在数据库端,系统性能难于扩展,闲置了中间件J2EE服务器处理性能。对象和关系数据库存在阻抗,本身是矛盾竞争的。,第二阶段:分析和设计分裂,第二阶段比第一阶段进步很多,开始采取面向对象的方法来分析设计需求。分析人员的职责:是负责从需求领域中收
12、集基本概念。面向需求。设计人员的职责:必须指明一组能北项目中适应编程工具构造的组件,这些组件必须能够在目标环境中有效执行,并能够正确解决应用程序出现的问题 两个阶段目标不一致,导致分裂,项目失败。,分析模型,分析模型会有知识不断消化的过程,但在编码时这些知识会被遗弃。开发人员被迫为设计进行新的抽象,那么分析人员嵌入模型中知识不能保留和重新发现。分析模型很多重要发现更改往往出现在设计实现过程,预先的模型可能深入研究无关主题,忽视重要主题。,问题,一个印在大纸张上的完整类图,整面墙都被它覆盖,花几个月分析开发的领域模型,模型大多数对象都与其中三四个对象有错综复杂的关系,且关系网几乎没有自然边界。分
13、析人员是忠于领域需求本质。问题:开发人员开始实现应用程序时,彼此纠缠的关系根本无法转换成可存储 可检索的实现。是不是基于概念的模型类图不能成为程序设计的基础?,DDD领域模型特点,统一领域模型:同时满足分析原型和软件设计 ,如果一个模型实现时不实用,重新寻找新模型。如果模型没有忠实表达领域关键概念时,也必须重新寻找新的模型。 统一语言:一个无处不在(ubiquitous )的语言,项目中所有人统一交流的语言。减少沟通疑惑,减少传达走样。使得软件更加适合需求。建模和设计成为单个迭代循环。将领域模型和设计紧密联系。因此,建模专家必须懂设计。,什么是DDD?,什么是领域模型 Domain Model
14、?,只有业务(真实世界的概念),没有技术。领域模型只表达需求真实世界模型,和软件架构技术无关。通过分层,将领域模型层突出,其他为辅助层。,机器人,机器人的领域模型,分层领域,将领域概念和其他软件技术相关概念分离,避免混淆,在系统庞大中失去对领域的把握。表现层:负责显示,解析用户命令应用层:指挥领域对象实现功能,必须保持简练,不是核心。领域层:核心 业务概念基础层:与软件技术相关。,航运程序,航运程序任务分解,表现层:接受用户输入(屏幕绘制 ) 向用户显示信息 (显示结果)领域层: 执行业务逻辑 (查询所有城市 城市和货物关联)基础层: 访问数据库(查询数据库 提交数据库更改网络通信) 不要将U
15、I 数据库和其他支持代码直接写到业务对象中,虽然简单容易,但是拓展困难,难于自动化测试。,分层 优点,每个层都是内聚的,并且只依赖它的下层,为了实现各层的最大解耦,IOC/DI容器是当前Java业务层的最好选择 。将所有与需求领域有关的代码集中在领域层,并与用户UI层 应用层和基础层分离。领域对象就可以重点关注表达领域模型,不关心自己的显示 存储和管理应用任务等事情。适合分布式部署,提升性能,高可伸缩性。,核心领域,大型系统中,有很多有用的组件,他们非常复杂,都是软件成功不可或缺的,这样组件实在太多,以至于领域模型的精髓部分变得不明显甚至被忽视。不可能所有部分都进行提炼,分清轻重缓急,让领域模
16、型真正成为资产。核心模型必须足够灵活和充分平衡来创建应用程序功能,不要倾向于使用技术基础结构如数据库来解决问题。无需专业业务知识容易能理解能引起程序员的兴趣,他们认为只有解决这些问题才能积累自己专业知识,同时为自己简历增光添彩,这对于公司是浪费。,不注重核心领域的案例,银团贷款系统:大多数技术天才和技术高手都对数据库映射层和消息接口津津乐道,而业务模型却交给一些刚刚涉足面向对象技术的新手们打理。尽管为持久领域对象提供详细注解文字说明,能够反映设计思路,也设计了友好的用户界面。这些特性都是外围,当这个软件最终交付用户使用时,差劲程序员二次开发拓展时却依然搞得一塌糊涂,整个项目差点失败。,浓缩模型
17、,找出核心模型,提供一种方法让我们很容易地从众多支持模型中将它区分出来,将最有价值 最体现专门知识的概念凸显出来,核心变小。让最好的程序员来处理核心模型,根据需要调整人员的配备,尽力找出核心的深层模型,对于其他部分投入必须经过考虑,是否能为提炼出来的核心提供支持。,通用子域,提炼核心领域,就必须剔除反面通用子域。不同行业运输业 银行业 制造业都需要某种形式组织结构图。组织结构图就是通用子域。许多应用跟踪应收帐款 费用分类和其他帐务信息,这些信息都可以使用通用的会计财务系统来处理。有两个项目处理带时区功能的日期和时间组件,花费最好的程序员数周时间,虽然必须做,但不是系统核心。考虑现有解决方案或开
18、源公开模型来替代通用子域。考虑外包,将通用子域外包,自己掌握核心领域。,内聚机制,算法或计算非常复杂,导致设计受到了冲击,模型中的概念变成了用“怎么做”来解释,而不是用“是什么”表达。设计中产生了一大堆用来实现算法 解决问题的方法,而描述这个问题的方法变得模糊不清。怎么做的方法在模型中泛滥成灾,表明模型存在某种问题。计算机制本身存在内聚性,我们计算方法不可能把所有功能都包含进来,我们需要的也不是一种万能计算机制。使用策略模式等框架把这些内聚计算分离出来,用一个明确接口来说明这个框架的功能,将怎么做复杂细节交给框架去完成。权限设计属于内聚机制,不是核心领域。使用RBAC,隔离核心,确定一个核心子
19、域把相关类转移到一个新的模块,并为模块指定一个与其概念相符的名称。重构代码,把那些不能直接表示该概念的数据和功能分开,并转移到其他模块。重构核心模块,使关联关系和交互作用更简单易懂。同时减少和其他模块的关系。对其他核心子域重复上面的步骤,直至得到隔离核心。,领域模型切割,1.将复杂大的领域分割成子领域。2.抓住子领域的核心,建立核心模型。3.对核心模型实现灵活性细节设计,旁门左道的快速开发,没有分层架构的快速开发基本是旁门左道,不如返回Foxpro和Delphi/VB两层时代。将本属于业务层的逻辑交由表现层来处理的快速UI方式也是一种旁门左道。快速开发必须基于良好的质量,虽然良好的分层架构带来
20、开发效率的降低,但是这些也是可以有方法解决。,模型元素,实体(Entity) A thread of continuity and identity.在时间上一系列连续性(continuity)和标识(identityID)来定义。值对象(Value Object):如果一个对象代表了领域的某种描述性特征,且没有概念性的标识。Description原型。服务(Service):行为接口。,实体,实体就是在客观世界中有实体内容的物体对象。经过时间延续一直保持其特点不变。软件实际是客观世界的拷贝或镜子,实体就是镜子中那个实物。必须拥有自己的唯一ID,主键,如果没有一个ID标识,为每个实例加上一个具
21、有唯一性ID,可能是内部使用。由于对象主观认定性,在特殊情况下,我们可能会主观划分一些实体。,实体建模,实体最基本职责是保证连续性,以便使之有清晰 可预见的行为。关注重点不是它们的属性或行为,而是找出固有的特征,提出其他细节。这个固有特征包括:可以唯一标识对象的 特征;经常用来查找或匹配对象的特征。只留下和特征相关的行为和属性,其他则转移到与该实体相关联的其他对象。目的:保持实体高度精简。,特征核心,实体标识,一个实体对应一个标识,处于分布式系统内存中,或保存在磁盘中,标识必须在整个系统唯一性。一个对象从数据库检索出来 生成一个新的对象实例,失去上次标识;通过网络传来一个对象实例,丢失原来的标
22、识;同一个对象存在多个不同副本,比如分布式缓存,标识混乱。怎样判断两个对象在概念上代表同一个实体呢?,实体如何标识,为每一个实例加上一个ID(一个数字或一个字符串)标记。标识具有不变性,与实体同生共死。对象实例被保存到数据库中时,ID值也要保存起来。ID可以由系统自动产生,ID产生算法必须保证系统中值的唯一性。,标识性质,隐式ID:软件用户通过人名查找客户,系统必须使用内部ID分辨两个姓名相同的联系人,用户可能看不到。显式ID:包裹传递服务,运输公司软件产生跟踪号码,预订机票酒店,产生确认码订单号。跨系统ID:两家医院的计算机系统对同一个患者生成不同的ID,使用公共机构如社保卡号用户自定义ID
23、:支票对账提供ID匹配,用用户来决定是否真的对应。,值对象,许多对象没有标识,只是事物的某些性质描述。四色原型中的蓝色des直接对应值对象。将所有对象都加上标识,会影响系统的性能,增加复杂性,使所有对象看上去都是一个模式,混乱。只关心what,不关心who 或 which,只关心对象是什么?如果有多个这样对象排列在一起,我们不用去分辨它们。只关心what:有两只相同颜色和粗细的笔,随便拿一个都可以画画。,地址值对象,邮购软件中的地址是值对象:用地址作为发货目的地。如果住在一起多个室友邮购,不影响邮递,有名字作为标识。邮政软件中的地址是实体:将地区分层次结构,区 城市 街道 邮编 个人地址。电力
24、运营软件中地址是实体:如果住在一起多个室友申请电力服务,电力公司必须区分。,值对象和实体是整体,值对象设计,由于不关心软件运行时使用的是值对象的哪个实例,没有了分辨拘束,可提升性能和优化。值对象复制性:两个人具有相同名字,表示名字的值对象可以互换复制,不会使他们成为一个人。值对象共享性:两个Person对象不需要自己各自的Name值对象,可以共用一个Name值对象。值对象不变性:值对象属于实体,当实体把它的值对象传递给其他对象时,如果其他对象对这个传过来的值对象修改不当,就会破坏其所有者的不变性约束,从而破坏它的所有者实体对象。,值对象共享,值对象非常巨大,每个电源插座都是一个值对象,一个房子
25、有上百个插座对象,由于值对象可以互换 共享,只使用一个插座实例就可以。Flyweight模式:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。不适用于实体。,值对象复制,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。Java的clone也是一种复制。复制产生大量对象会阻塞系统,但适合在分布式系统中,相反,使用共享,会降低性能;高并发系统中,复制减少锁处理,共享需要精妙的锁处理技巧。,实体和值对象区分,区分实体和值对象有助于我们在分析需求时抓住重点(实体),有主次之分,纲举目张。由于关注重点不同,就会对值对象定义不同。消费
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 领域 驱动 设计 思路 讲义 ppt 课件
链接地址:https://www.31ppt.com/p-1370702.html