分析设计.ppt
《分析设计.ppt》由会员分享,可在线阅读,更多相关《分析设计.ppt(122页珍藏版)》请在三一文库上搜索。
1、领域驱动建模(Evans DDD),彭晨阳,Evans DDD,2004年Eric Evans 发表Domain-Driven Design Tackling Complexity in the Heart of Software (领域驱动设计 )简称Evans DDD 领域建模是一种艺术的技术,它是用来解决复杂软件快速应付变化的解决之道,Evans DDD,领域模型重要性,没有领域模型,只是靠代码编写完成一个又一个功能,复杂的领域需求会使得他们无法交流讨论,使工作陷入泥沼。 有少许领域模型,但是没有维护好模型与代码直接的联系,两者产生差异,无法实现。,DDD优点,分析设计发展的三个阶段,第
2、一阶段:围绕数据库的驱动设计,新项目总是从设计数据库及其字段开始。 第二层次:面向对象的分析设计方法诞生后,有了专门的分析和设计阶段之分,分析阶段和设计阶段是断裂的。 第三阶段:融合了分析阶段和设计阶段的领域驱动设计(Evans: DDD)。,第一阶段:传统的数据库方式,过去软件系统分析设计总是从数据库开始,这种围绕数据库分析设计的缺点非常明显: 1.分析方面:不能迅速有效全面分析需求。 2. 设计方面:导致过程化设计编程,丧失了面向对象设计的优点。 2. 运行方面:导致软件运行时负载集中在数据库端,系统性能难于扩展,闲置了中间件J2EE服务器处理性能。 对象和关系数据库存在阻抗,本身是矛盾竞
3、争的。,第二阶段:分析和设计分裂,第二阶段比第一阶段进步很多,开始采取面向对象的方法来分析设计需求。 分析人员的职责:是负责从需求领域中收集基本概念。面向需求。 设计人员的职责:必须指明一组能北项目中适应编程工具构造的组件,这些组件必须能够在目标环境中有效执行,并能够正确解决应用程序出现的问题 两个阶段目标不一致,导致分裂,项目失败。,分析模型,分析模型会有知识不断消化的过程,但在编码时这些知识会被遗弃。 开发人员被迫为设计进行新的抽象,那么分析人员嵌入模型中知识不能保留和重新发现。 分析模型很多重要发现更改往往出现在设计实现过程,预先的模型可能深入研究无关主题,忽视重要主题。,蜘蛛网式模型类
4、图,问题,一个印在大纸张上的完整类图,整面墙都被它覆盖,花几个月分析开发的领域模型,模型大多数对象都与其中三四个对象有错综复杂的关系,且关系网几乎没有自然边界。分析人员是忠于领域需求本质。 问题:开发人员开始实现应用程序时,彼此纠缠的关系根本无法转换成可存储 可检索的实现。 是不是基于概念的模型类图不能成为程序设计的基础?,DDD领域模型特点,统一领域模型:同时满足分析原型和软件设计 ,如果一个模型实现时不实用,重新寻找新模型。如果模型没有忠实表达领域关键概念时,也必须重新寻找新的模型。 统一语言:一个无处不在(ubiquitous )的语言,项目中所有人统一交流的语言。减少沟通疑惑,减少传达
5、走样。使得软件更加适合需求。 建模和设计成为单个迭代循环。将领域模型和设计紧密联系。因此,建模专家必须懂设计。,Cargo需求,跟踪顾客货物的关键装卸事件 对货物进行实现预约 当货物在运输抵达某点时,自动向顾客发送信息。 这是一个跟踪物体流动的软件系统,关注重点是跟踪事件;顾客预约;货物装卸过程中。,传统分析思路,传统设计实现,CustomerService: 提供有关客户关系操作。 create(Customer customer); . CargoService:提供货物有关操作。 create(Cargo cargo); getLocation(Cargo cargo);,是面向对象吗?
6、,缺陷:,Cargo和CargoService 首身分离。 货物的装卸系列事件或行为应该被封装在货物这个边界内。 维持逻辑上的一致性。因为不同装卸事件会引发货物本身状态变化。,逻辑的一致性Logical Consistency,无逻辑一致封装的失血模型,public class A private int lower, upper; /两个状态值 public int getLower() return lower; public int getUpper() return upper; .setter方法. A模型要求逻辑上一致性是:状态值lower必须小于状态值upper,lowerupp
7、er。,失血模型的调用,class ClientService public void setAUpper(int value) if (value a.getLower() a.setUpper(value); public void setALower(int value) if (value a.getUpper() a.setLower(value); 逻辑一致性判断被放在了客户端或service中,而不是在模型A内部,这样问题造成A的状态结果混乱,会出现A.upperA.lower情况。,破坏A的逻辑一致性,假设A的lower和upper的初始值是(0, 5); 同时下面两个请求事件
8、发生: 一个客户端请求线程A: setLower(4) 一个客户端请求线程B: setUpper(3) A的状态是:lower和upper是 (4, 3) 破坏A模型逻辑一致性要求lowerupper。,将操作状态的行为封装入A边界内,public class A private volatile int lower, upper; /两个状态值 public int getLower() return lower; public int getUpper() return upper; public void setAUpper(int value) if (value a.getLower
9、() a.setUpper(value); public void setALower(int value) if (value a.getUpper() a.setLower(value); 更严格的悲观锁synchronization,值对象比synchronization更优雅。,内聚与边界,无名天地之始,有名万物之母。故常无欲以观其妙; 常有欲以观其徼(jio)。 事物因内聚而有边界,故而有名。,领域模型的核心目标,模型 = “是什么(名)” 。 模型 != “怎么做”。 程序 = 算法 + 数据结构 ? 算法 = “怎么做”,算法也是被设计的对象。 数据结构 = “僵尸” 模型在哪里
10、呢?,算法的内聚特性,算法或计算非常复杂,导致设计受到了冲击变得混乱。 设计中产生了一大堆用来实现算法 解决问题的方法,而描述这个问题的方法变得模糊不清。怎么做的方法在模型中泛滥成灾,表明模型存在某种问题。 计算机制本身存在内聚性,我们计算方法不可能把所有功能都包含进来,我们需要的也不是一种万能计算机制。 使用策略模式等框架把这些内聚计算分离出来,用一个明确接口来说明这个框架的功能,将怎么做复杂细节交给框架去完成。,领域模型切割,1.将复杂大的领域分割成子领域。 2.抓住子领域的核心,建立核心模型,用聚合划定边界。 3.对核心模型实现灵活性细节设计,聚合Aggregates,聚合代表业务核心模
11、型。 聚合= 聚合根 + 聚合边界。 组 = 组长 + 小组边界 聚合因内聚而存在 聚合内部维持逻辑一致性 DDD核心是找出聚合。,聚合,代表一个类是另一个类的一部份这种关系。 全体-部分 箭头由表示whole的类指向表示part的类 模型之间关联尽可能使用聚合表达,代表内聚组成的关联关系,关联要反映最本质的关系。如学生 课程 车和马达。关联不是手头任务本质或不能反映模型对象基本含义,完全取消它。 现实世界中存在大量双向多对多关联关系,双向关联和实现和维护带来很大困难,双向关联极少将联系本质体现出来,少用双向关联。 尽可能约束关联,通过指定导航方向,减少不必要关联。 模型中关联越少、越简单越好
12、。,高内聚 低关联,高内聚 低关联是设计基本原则。是重构的准则。 找出关联是细分模型的一种方式,从而更恰当地定义模型边界。 关联不是手头任务本质或不能反映模型对象基本含义,完全取消它。 少用双向关联,除非技术性能要求。 模型中关联越少、越简单越好。 完全摆脱数据库影子,SQL语句作为规则封装在模型中。,找出聚合,论坛关联关系的提纯与精炼,四色原型:辅助找出聚合,四色使用颜色这种直观对事物进行分类。 类似于名词和动词等语义分类。 四色能够将动静分离,考虑人机交互。 四色的特点是能够比较全面宏观认识需求。,原型建模分析步骤,四色图,属于分析建模,属于Archetypes原型。 在成千上百的业务和工
13、程系统由四种原型组成: 1. 橙色的Moment-Interval 简称MI 2. 黄色的角色 简称Role 3. 蓝色的description 4. 绿色的party, place, or thing .,四色原型DNC,大多数业务系统是由多个四色图反复拼装而成,我们称为这种现象是Domain-Neutral Component模式 用这种基于语义的类图模板进行任何系统的域建模 。 异常的简单好用 ,指导帮助更加完整地对复杂系统建模 。,四色原型详细,MI:时刻时段,表示活动 事件,粉红色核心 MI实现类有些类似: /* MI */ public class Sale public BigD
14、ecimal calcTotal() private int number; private Date date; ,角色 描述 PPT,角色:参与方 人或组织机构 描述description:分类目录,一组反复使用的值,值对象。比如:你的车(序列号 购买日期 颜色)属于车辆描述分类:制造商 型号 制造日期和可选颜色,后者是描述。 PPT: party 指人或组织 place可能是零售处或批发处, thing 在不同业务活动不同角色。,四色原型图,蓝色包含类型 描述 个数和缺省值。 绿色PPT则表达蓝色在当前这个系统中扮演的一个特定实例对象,包含它的序列号 名称 地址和顾客。 黄色:被分配的编
15、号和状态 粉红色:编号 日期段 总价和状态,蓝 绿 黄 红序列,上图描述意思是:很多数量的具有类型 描述(蓝色)特征的东西被某个角色(黄色)分配,分配活动有一个日期以及所有东西总价计算(粉红),具体分配活动结果贴在了这个东西(绿色PPT)上,包括顾客名称和地址等。 PPT更象一个参与者参与系统活动的结果、关联结果体。 什么东西被什么人做了什么事情,产生了一个什么结果。 什么人对什么东西做了什么事情,产生了什么结果。,蓝 绿 黄 红序列,1.蓝:它是不是属于一种种类性质的描述,或者代表一组呢可以反复使用的概念。 2.绿:如果需要单独着重跟踪参与方或某个地方或某个物品,不只是单独记录数量这样简单事
16、情,需要特别关注。 3.黄:是否有和角色相关的职责。 4.红:需要记住相应的时刻和时段,它是不是依赖时间上瞬间或一段短时间存在的。,Cash sales用例提炼,Cash sales四色原型,模板:什么人对什么东西做了什么事情, 产生了什么结果。 收银员卖商品(包括:扫描条形码 计算总价 收钱支付)。 本案中,我们无需跟踪结果,所以没有PPT,侧重是卖商品这个过程涉及的一系列操作和状态改变。,四色与聚合,四色与聚合 上下文,有界上下文场景,在场景中,可以对聚合的状态进行断言,验证聚合设计的正确性。 场景能对模型进行验证,但是因为但细节无法左右模型设计。,聚合根Aggregate,一个聚合是一簇
17、相关联的对象,出于数据变化的目的,将这些对象视为一个单元。 每个聚合都有一个根和一个边界。 边界定义了聚合中应该包含什么。 根是包含在聚合中的单个特定实体。 根是聚合中唯一允许被外部引用的元素,在聚合边界内,对象之间可以相互引用。 实际就是整体和部分的关系。,轿车根,Cargo货运路线案例,聚合内之间不可随意关联,聚合体之间 只引用对方的聚合根,聚合体内部模型元素,实体(Entity) A thread of continuity and identity. 在时间上一系列连续性(continuity)和标识(identity ID)来定义。 值对象(Value Object): 如果一个对象
18、代表了领域的某种描述性特征,且没有概念性的标识。Description原型。,实体,实体就是在客观世界中有实体内容的物体对象。经过时间延续一直保持其特点不变。 软件实际是客观世界的拷贝或镜子,实体就是镜子中那个实物。 必须拥有自己的唯一ID,主键,如果没有一个ID标识,为每个实例加上一个具有唯一性ID,可能是内部使用。 由于对象主观认定性,在特殊情况下,我们可能会主观划分一些实体。,聚合体内部切分,值对象,许多对象没有标识,只是事物的某些性质描述。 四色原型中的蓝色des直接对应值对象。 将所有对象都加上标识,会影响系统的性能,增加复杂性,使所有对象看上去都是一个模式,混乱。 只关心what,
19、不关心who 或 which,只关心对象是什么?如果有多个这样对象排列在一起,我们不用去分辨它们。 只关心what:有两只相同颜色和粗细的笔,随便拿一个都可以画画。,实体切分实体和值对象,值对象设计,由于不关心软件运行时使用的是值对象的哪个实例,没有了分辨拘束,可提升性能和优化。 值对象复制性:两个人具有相同名字,表示名字的值对象可以互换复制,不会使他们成为一个人。 值对象共享性:两个Person对象不需要自己各自的Name值对象,可以共用一个Name值对象。 值对象不变性:值对象属于实体,当实体把它的值对象传递给其他对象时,如果其他对象对这个传过来的值对象修改不当,就会破坏其所有者的不变性约
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分析 设计
链接地址:https://www.31doc.com/p-2545219.html