• 1. OOA/D与UMLPart01
  • 2. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 3. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 4. 1-1 面向对象本质论—面向对象范型 中程在线信息产业培训网
  • 5. 待解决的问题编写代码访问存储在数据库中的几何形状的描述,再把得到的所有几何形状显示出来。 中程在线信息产业培训网
  • 6. 功能分解的解决步骤在数据库中查找几何形状的列表; 打开形状列表; 以某种规则将这个列表排序; 在显示器上显示单个的几何形状; 识别形状的具体类型 获得形状的位置 调用适当的函数,并传递形状的位置给它,来显示这个形状 中程在线信息产业培训网
  • 7. 功能分解的核心思想分析者将问题拆分成多个功能步骤,这些步骤组合起来就可以解决实际的问题。 因为把问题分解成小块来解决,比一次处理整个问题要简单。 生活中的实例:制作意大利烤面、装配自行车 一种最自然的方法 中程在线信息产业培训网
  • 8. 功能分解方法的主要问题它不能帮助我们为未来可能发生的变化作准备。 它不能把帮助我们的代码优雅的演变。 例如:可能必须处理新的形状或显示形状的新方法 排序的方法可能发生变化 变化的发生还为错误和意外结果的发生创造了机会-许多错误都来自于代码的变化。 例如:想在代码中做一些改变,但又不敢,因为知道这样会对另一处造成破坏 写一处代码时总需要注意所有的函数和所有使用该函数的方式,一个函数可能与另一个函数交互 中程在线信息产业培训网
  • 9. 需求永远是变化的由于与开发者进行讨论且看到软件中新的可能性,用户对自己需求的看法发生了改变 因为要开发软件来提高用户问题领域的自动化程度,开发者对问题领域更加熟悉,所以开发者对问题领域的看法发生了变化 软件开发的环境产生了变化,诸如Web的出现 中程在线信息产业培训网
  • 10. 使用功能分解来处理变化如果将上述步骤的所有逻辑放在一个大函数或模块中,任何一个步骤变化都将修改整个模块 解决方案:模块化 函数功能:显示形状 输入:形状类型,形状描述 操作: switch (type of shape) case square: put display function for square here case circle: put display function for circle here 需要显示一个新的形状时,只需修改一个模块 中程在线信息产业培训网
  • 11. 用模块化处理变化的利弊模块化可以帮助你写出更容易理解的代码,更容易理解的代码也更容易维护; 模块化并不能帮助你写出能应付所有可能出现的变化代码 问题:该模块的输入是形状的类型和描述,但也许找不到适用于所有形状的描述,例如存储为包含坐标点的数组,但能够适用于所有形状? 中程在线信息产业培训网
  • 12. 模块化的核心原则内聚度:是指程序中的操作之间联系紧密的程度。描述了一个子程序的内部成分之间相互联系的强度。 耦合度:是指两个子程序联系的强度。描述了一个子程序与其他子程序之间的联系强度。 耦合度与内聚度成反比。 目标:具有内部完整性(强内聚)的子程序,以及小的、直接的、可见的、灵活的与其他子程序之间的联系( 松耦合) 中程在线信息产业培训网
  • 13. 内聚类型内聚类型描 述功能内聚完成一个单一功能,各个部分协同工作,缺一不可顺序内聚处理元素相关,而且必须顺序执行通信内聚所有处理元素集中在一个数据结构的区域上过程内聚处理元素相关,而且必须按特定的次序执行瞬时内聚所包含的任务必须在同一时间间隔内执行(如初始化模块)逻辑内聚完成逻辑上相关的一组任务偶然内聚完成一组没有关系或松散关系的任务低 中程在线信息产业培训网
  • 14. 耦合类型高耦合类型描 述非直接耦合没有直接联系,互相不依赖对方数据耦合借助参数表传递简单数据标记耦合一个数据结构的一部分借助于模块接口被传递控制耦合模块间传递的信息中包含用于控制模块内部逻辑的信息外部耦合与软件以外的环境有关公共耦合多个模块引用同一个全局数据区内容耦合一个模块访问另一个模块的内部数据 一个模块不通过正常入口转到另一模块的内部 两个模块有一部分程序代码重叠 一个模块有多个入口 中程在线信息产业培训网
  • 15. 用责任转移处理变化 1问题描述: 在第三届软件工程大会上,我主讲了“软件需求实践的艺术”,当参加会议的听众听完我的演讲后,需要到其他的分会场去参加其他的技术演讲,我的一种做法是: 获得参加会议的听众的人名单; 对于名单上的每个人: > 查找他的下一技术演讲的题目 > 查找他的下一参会的地点 > 查找到他下一分会场的路径 > 告诉他怎样去下一个地点 需要一个方法需要一个方法需要一个方法控制者 中程在线信息产业培训网
  • 16. 用责任转移处理变化 2新的解决思路: 把从你的会场到其他会场的路径张贴出来 告诉会场中的所有人:“其他的技术演讲题目和相应的分会场的地址已经张贴在xx处,请大家根据其内容去下一个分会场 前种方法:对每个人都明确地指出路径 后种方法:给出一个普遍的指令,期望每个人都能知道如何完成 中程在线信息产业培训网
  • 17. 面向对象范型面向对象范型的核心是“对象”的概念 所有的东西都聚焦于对象 使用对象:可以定义自己负责的东西,对象中包含数据因而可以知道自己的状态,对象中拥有代码因而可以适当地执行 围绕对象-而非函数-组织代码 中程在线信息产业培训网
  • 18. 过程范型 vs 面向对象范型 中程在线信息产业培训网
  • 19. 对象及其责任听众:知道自己在哪个分会场 知道自己接着应该去哪个分会场 从这个分会场走到下一个分会场 演讲者:告诉听众走到下一个分会场 分会场:拥有一个地址 路径向导:给定两个分会场,指出一个分会场到另一个分会场的路径 中程在线信息产业培训网
  • 20. 软件开发过程的视角概念(conceptual) 展示了问题领域中的概念; 一个概念模型可以在对实现软件有很少或毫无注意的情况下勾勒出来。 规格(Specification) 我们只看软件的接口,而不看软件的实现。 实现(implementation) 置身于代码当中,使常规视角 目标: 一个层次(概念层次)上通信而在另一个层次(实现层次)上执行;也就是告诉”你希望他们做什么”,而非“怎么去做" 请求者不知道发生了什么,只知道概念上发生了什么 中程在线信息产业培训网
  • 21. 对象是什么概念层次:一个对象是一系列责任 规格层次:一个对象是一系列可以被其他对象或该对象自己调用的方法 实现层次:一个对象是一些和数据 不要忽略概念层次和规格层次上的含义 中程在线信息产业培训网
  • 22. 面向对象范型下的解决方案开始控制程序 对分会场内的听众的集合体做初始化 告诉听众的集合体:让听从们去他们的下一个分会场 该集合体告诉每个学生去各自的下一个分会场 每个学生: > 查找自己的下一个分会场 > 决定如何去下一个分会场 > 去下一个分会场 完成 中程在线信息产业培训网
  • 23. 1-2 面向对象的核心概念 中程在线信息产业培训网
  • 24. 对象伴随有方法的数据智能数据 从实现的视角对对象的观察 对象是拥有责任的实体 从概念的视角观察对象 将注意力由“如何实现他们”转移到“对象应该作什么” 按照责任来考虑问题可以使问题更简单化,这样可以帮助我们定义公共的接口 关注于动机而不是实现的情景在设计模式中反复出现。 中程在线信息产业培训网
  • 25. 真实对象与类的表示法 中程在线信息产业培训网
  • 26. 封装封装等于数据隐藏? 封装不仅可以隐藏数据,还可以隐藏实现的细节、派生类或其他的很多的东西 数据的封装 方法的封装 子类的封装 其他对象的封装 中程在线信息产业培训网
  • 27. 封装可访问性 Public Protected Private 中程在线信息产业培训网
  • 28. 继承继承传统方式:特化和复用 继承的新观点:对象分类的一种方法 使用继承的技巧: > 寻找相似性 > 寻找已有的类 > 遵循语句规则:is a kind of 、is like a > 避免继承过度 > 继承所有的内容 中程在线信息产业培训网
  • 29. 单一继承 中程在线信息产业培训网
  • 30. 多重继承 中程在线信息产业培训网
  • 31. 抽象类抽象类常被描述为不能被实例化的类,这仅仅是实现层次上 在概念层次上,抽象类只是其他类的占位符。也就是说给相关的类命名的方法,可以把一组类当作同一个概念来处理 用抽象类表示的概念,是在问题领域内并不存在的一个东西 使用抽象类进行封装 抽象类与重构的关系对象分类的一种方法 中程在线信息产业培训网
  • 32. 多态使用同一个调用指令获得了许多不同形态的行为 draw > 对于艺术家:画画 > 对于专业牌手:出牌 > 对于枪手:拔枪 中程在线信息产业培训网
  • 33. 1-3 分析与设计基础 中程在线信息产业培训网
  • 34. 什么是分析与设计分析:强调的是对问题和需求的调查研究,而不是解决方案。 设计:强调的是满足需求概念上的解决方案,而不是实现,但最终,设计可以被实现。 中程在线信息产业培训网
  • 35. 面向对象的分析与设计在面向对象的分析过程中: 强调的是在问题领域内发现和描述对象和概念,比如图书馆系统中有书(Book)、图书馆(Library)、顾客(Patron)这样一些概念。 在面向对象设计过程中: 定义软件对象和这些软件对象如何协作来满足需求 如:对象Book可以有某些属性和方法。 最后,在面向对象编程(OOP)来实现这些设计对象(比如Java或C#中的Book类) 中程在线信息产业培训网
  • 36. 核心技能OOA/D模式UML原则与指导需求分析敏捷与UP 中程在线信息产业培训网
  • 37. 讨论面向对象开发范型给你带来了什么新的思考? 在现在的工作中,是否存在“类是一个框,什么都往里装”的“功能分解”思想? 中程在线信息产业培训网
  • 38. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 39. 2-1 面向对象建模语言—UML 中程在线信息产业培训网
  • 40. 讨论谈谈你对UML的认识… 中程在线信息产业培训网
  • 41. 模型是对现实的简化 中程在线信息产业培训网
  • 42. 建模的目的与原则帮助我们按照实际情况或按我们需要的样式对系统进行可视化;提供一种详细说明系统的结构或行为的方法;给出一个指导系统构造的模板;对我们所做出的决策进行文档化 仅当需要模型时,才构建它 选择要创建什么模型对如何动手解决问题和如何形成解决方案有着意义深远的影响;每一种模型可以在不同的精度级别上表示;最好的模型是与现实相联系的;单个模型是不充分的。对每个重要的系统最好用一组几乎独立的模型去处理。 中程在线信息产业培训网
  • 43. UML发展历程 中程在线信息产业培训网
  • 44. UML特性与发展现状UML是一种Language(语言) UML是一种Modeling(建模)Language UML是Unified(统一)Modeling Language 已进入全面应用阶段的事实标准 应用领域正在逐渐扩展,包括嵌入式系统建模、业务建模、流程建模等多个领域 成为“产生式编程”的重要支持技术:MDA、 可执行UML等 中程在线信息产业培训网
  • 45. 为什么使用UML建模UML是一种统一的、标准化的建模语言 UML是一种应用面很广泛的建模语言模型的种类模型的用途业务模型对业务过程、工作流、组织的建模需求模型对捕获的需求进行整理和分析的工具,辅助开发人员与用户进行沟通设计模型包含高层设计(架构模型)和详细设计模型,用于统一开发人员、沟通设计信息数据库模型设计数据库的结构、表结构以及与应用系统的交互实现模型用来理清软件的组成、部署方案,为安装与维护人员的工作提供指导 中程在线信息产业培训网
  • 46. 草图和蓝图蓝图一般是指采用CASE工具绘制的、正式的、规范的UML模型 草图则通常是指手工绘制的、规范度较低的在纸张的UML模型 大胆地绘制草图,尽可能基于草图进行讨论。对于局部的、重要性不高的、共享范围较小的UML模型,直接将草图扫描到电脑存档即可;对于全局的、重要性高的、高度共享的,在草图的基础上用CASE工具绘制成为正式的蓝图,并将其纳入统一的模型管理中 中程在线信息产业培训网
  • 47. 谁应该建模业务建模:以领域专家为主,需求分析人员是主力,系统分析员、架构师可参与 需求模型:以需求分析人员为主,系统分析员是主力,领域专家提供指导,架构师和资深开发人员参与 设计模型:高层设计模型以架构师为主,系统分析员从需求方面提供支持,资深开发人员从技术实现方面提供支持。详细设计模型则以资深开发人员为主,架构师提供指导。 实现模型:以资深开发人员(设计人员)为主,架构师提供总体指导。 数据库模型:以数据库开发人员为主,架构师提供指导,资深开发人员(设计人员)予以配合。 中程在线信息产业培训网
  • 48. 常见认识误区UML是一种方法论 UML就是一堆图形 UML只能够应用于面向对象开发中 UML就是Rose里的符号 UML的学习周期很长、很复杂 中程在线信息产业培训网
  • 49. UML的组成基本构造块:也就是建模 元素,是模型的主体 UML规则:也就是支配基 本构造块如何放在一起的 规则 公共机制:运用于整个 UML模型中的公共机制、 扩展机制 中程在线信息产业培训网
  • 50. 事物构造块事物构造块是对模型中最具有代表性的成分的抽象 结构事物:UML中的名词,它是模型的静态部分,描述概念或物理元素。 行为事物:UML中的动词,它是模型中的动态部分,是一种跨越时间、空间的行为。 分组事物:UML中的容器,用来组织模型,使模型更加的结构化。 注释事务:UML中的解释部分,和代码中的注释语句一样,是用来描述模型的。 中程在线信息产业培训网
  • 51. 面向对象视角下的世界 首先建立反应现实世界中不同事物的“构造块”,然后确定“构造块”之间的“关系”,再确定各个构造块的“属性”和“行为”。这样,在软件系统中就可以模拟现实世界的“构造块”之间的交互与协作 面向对象软件开发的核心思想就是高内聚(封装)、低耦合(消息驱动),使用简洁的接口拼合简单部件 中程在线信息产业培训网
  • 52. 结构事物类(class)和对象(object) 接口(interface) 主动类(active class) 用例(use case) 协作(collaboration) 构件(component) 节点(node) 中程在线信息产业培训网
  • 53. 类和对象类是对一组具有相同属性、相同操作、相同关系和相同语义的对象的抽象 UML中类是用一个矩形表示的,它包含三个区域,最上面是类名、中间是类的属性、最下面是类的方法 对象则是类的一个实例 中程在线信息产业培训网
  • 54. 接口接口是描述某个类或构件的一个服务操作集 中程在线信息产业培训网
  • 55. 主动类主动类实际上是一种特殊的类。引用它的原因,实际上是在开发中需要有一些类能够起到 启动控制活动的作用 主动类是指其对象至少拥有一个进 程或线程,能够启动控制活动的类 中程在线信息产业培训网
  • 56. 用例与协作用例是著名的大师Ivar Jacobson首先提出的,现已经成为了面向对象软件开发中一个需求分析的最常用工具 用例实例是在系统中执行的一系列动作,这些动作将生成特定执行者可见的价值结果。 一个用例定义一组用例实例。 协作定义了一个交互,它是由一组共同工作以提供某协作行为的角色和其他元素构 成的一个群体。 对于某个用例的实现就可 以表示为一个协作 中程在线信息产业培训网
  • 57. 构件在实际的软件系统中,有许多要比“类”更大的实体,例如一个COM组件、一个DLL文件、一个JavaBeans、一个执行文件等等。为了更好地对在UML模型中对它们进行表示,就引入了构件(也译为组件) 构件是系统设计的一个模块化部分,它隐藏了内部的实现,对外提供了一组外部接口。在系统中满足相同接口的组件可以自由地替换 中程在线信息产业培训网
  • 58. 节点为了能够有效地对部署的结构进行建模,UML引入了节点这一概念,它可以用来描述实际的PC机、打印机、服务器等软件运行的基础硬件 节点是运行时存在的物理元素,它表示了一种可计算的资源,通常至少有存储空间和处理能力 中程在线信息产业培训网
  • 59. 行为事物交互(interaction):是在特定语境中,共同完成某个任务的一组对象之间交换的信息集合 交互的表示法很简单,就是一条有向直线,并在上面标有操作名 状态机(state machine):是一个对象或交互在生命周期内响应事件所经历的状态序列 在UML模型中将状态画为一个圆 角矩形,并在矩形内写出状态名 称及其子状态 中程在线信息产业培训网
  • 60. 分组事物对于一个中大型的软件系统而言,通常会包含大量的类,因此也就会存在大量的结构事物、行为事物,为了能够更加有效地对其进行整合,生成或简或繁、或宏观或微观的模型,就需要对其进行分组。在UML中,提供了“包(Package)”来完成这一目标 中程在线信息产业培训网
  • 61. 注释事物结构事物是模型的主要构造块,行为事物则是补充了模型中的动态部分,分组事物而是用来更好地组织模型,似乎已经很完整了。而注释事物则是用来锦上添花的,它是用来在UML模型上添加适当的解释部分 中程在线信息产业培训网
  • 62. 关系构造块—关联关系关联(Association)表示两个类之间存在某种语义上的联系。关联关系提供了通信的路径,它是所有关系中最通用、语义最弱的。 在UML中,使用一条实线来表示关联关系 在关联关系中有两种比较特殊的关系:聚合和组合 聚合关系:聚合(Aggregation)是一种特殊形式的关联。聚合表示类间的关系是整体与部分的关系 如果发现“部分”类的存在,是完全依赖于“整体”类的,那么就应该使用“组合”关系来描述 中程在线信息产业培训网
  • 63. 关系构造块—其他关系泛化关系描述了一般事物与该事物中的特殊种类之间的关系,也就是父类与子类之间的关系。 实现关系是用来规定接口和实现接口的类或组件之间的关系。接口是操作的集合,这些操作用于规定类或组件的服务。 扩展表示将一个构造型附加到一个元类上,使得元类的定义中包括这个构造型。 有两个元素X、Y,如果修改元素X的定义可能会引起对另一个元素Y的定义的修改,则称元素Y依赖于元素X。 中程在线信息产业培训网
  • 64. UML规则命名:也就是为事物、关系和图起名字。和任何语言一样,名字都是一个标识符 范围:与类的作用域相似,包括所有者作用域和目标作用域两类 可见性:可见性规则标准表示法Rose属性Rose方法public任一元素,若能访问包容器,就可以访问它+protected只有包容器中的元素或包容器的后代才能够看到它#private只有包容器中的元素才能够看得到它-package只有声明在同一个包中的元素才能够看到该元素~ 中程在线信息产业培训网
  • 65. 公共机制—规格描述在图形表示法的每个部分后面都有一个规格描述(也称为详述),它用来对构造块的语法和语义进行文字叙述。这种构思,也就使可视化视图和文字视图的分离 : 中程在线信息产业培训网
  • 66. 公共机制—UML修饰与通用划分在为了更好的表示这些细节,UML中还提供了一些修饰符号,例如不同可视性的符号、用斜体字表示抽象类 UML通用划分: 1)类与对象的划分:类是一种抽象,对象是一个具体的实例 2)接口与实现的分离:接口是一种声明、是一个契约,也是服务的入口;实现则是负责实施接口提供的契约 中程在线信息产业培训网
  • 67. UML扩展机制构造型:在实际的建模过程中,可能会需要定义一些特定于某个领域或某个系统的构造块 中程在线信息产业培训网
  • 68. UML扩展机制标记值:则是用来为事物添加新特性的。标记值的表示方法是用形如“{标记信息}”的字符串 约束:是用来增加新的语义或改变已存在规则的一种机制(自由文本和OCL两种表示法)。约束的表示法和标记值法类似,都是使用花括号括起来的串来表示,不过它是不能够放在元素中的,而是放在相关的元素附近 中程在线信息产业培训网
  • 69. 图名功能备注类图描述类、类的特性以及类之间的关系UML 1原有对象图描述一个时间点上系统中各个对象的一个快照UML 1非正式图复合结构图描述类的运行时刻的分解UML 2.0新增构件图描述构件的结构与连接UML 1原有部署图描述在各个节点上的部署UML 1原有包图描述编译时的层次结构UML中非正式图用例图描述用户与系统如何交互UML 1原有活动图描述过程行为与并行行为UML 1原有状态机图描述事件如何改变对象生命周期UML 1原有顺序图描述对象之间的交互,重点在强调顺序UML 1原有通信图描述对象之间的交互,重点在于连接UML 1中的协作图定时图描述对象之间的交互,重点在于定时UML 2.0 新增交互概观图是一种顺序图与活动图的混合UML 2.0新增UML定义的图 中程在线信息产业培训网
  • 70. 主要领域视图图结构静态视图类图设计视图复合结构图、协作图、构件图用例视图用例图动态状态视图状态机图活动视图活动图交互视图顺序图、通信图物理部署视图部署图模型管理模型管理视图包图特性描述包图UML视图和图 中程在线信息产业培训网
  • 71. UML图形分类 中程在线信息产业培训网
  • 72. 4+1视图 中程在线信息产业培训网
  • 73. 4+1视图用例视图:它是最基本的需求分析模型,是可被最终用户看到的系统行为的用例组成。常用的模型包括用例图、交互图、状态图、活动图等。 设计视图:又称为逻辑视图,以问题域的语汇组成的类和对象集合,用来描述类、接口、协作。常用的模型包括类图、交互图、状态图、活动图等。 进程视图:形成系统并发与同步机制的线程和进程,也就是将可执行线程和进程作为活动类的建模,可理解为设计视图的一次执行实例。它使用的模型与设计视图类似,区别在于更侧重于主动类。 中程在线信息产业培训网
  • 74. 4+1视图实现视图:对组成基于系统的物理代码的文件和组件进行建模,即装配与发布物理系统的构件和文件。常用的模型包括构件图、交互图、状态图、活动图。 部署视图:包含了形成系统硬件拓扑结构的节点,也就是描述组件是如何物理地部署到一组物理的、可计算节点上的。常用的模型包括部署图、交互图、状态图、活动图。 中程在线信息产业培训网
  • 75. 讨论上述的内容与你原来认识中的UML有什么区别? 如何在你的开发过程中引入UML? 中程在线信息产业培训网
  • 76. 2-2 CRC卡 中程在线信息产业培训网
  • 77. CRC卡的历史背景CRC卡的全称是Class Responsibility Collaborator Card,也就是类-职责-协作卡 最早是由Ward Cunningham和Kent Beck(极限编程之父)在1989年OOPSLA大会上发布的 许多人却是从CRC卡最好的传道士Rebecca J.Wirfs-Brock那里认识到这个技术的 多年来该技术并没有太大的变化,这也从另一个侧面显示出了它的价值 中程在线信息产业培训网
  • 78. CRC卡的主要特性虽然不是UML的组成部分,但是它对于职责分配和描述对象间的协作关系有很大的帮助 它是一个职责驱动设计的方法,能够有效地为清晰地划分类与类之间的职责提供良好的基础 卡片式设计、角色扮演式分析与设计,在游戏中体现其价值 中程在线信息产业培训网
  • 79. CRC卡的适用场景进一步帮助“发现类”的工作 完成类的职责分配与设计工作 也可以用来确定架构元素的职责与协作 中程在线信息产业培训网
  • 80. 简要说明CRC卡是使用一个4英寸×5英寸规格的索引卡片 每张卡片里写上类的名字;在名字的下面可以写上其子类和超类 卡面正面的剩余部分分成两块。在左边写上职责,在右边写在协作 中程在线信息产业培训网
  • 81. 使用过程用头脑风暴或其它的发现类(例如名词动词法)的方法找到一些候选类 将每个候选类写在一张CRC卡片上 然后通过角色扮演的方式来进行类的职责分配与分析,以及寻找协作类 通过分析的过程来修正候选类。重复2-3步骤,直至分析完成 中程在线信息产业培训网
  • 82. 应用实例通过概念建模及名词动词法,得到BookList和Book两个候选类 为BookList和Book新建一张CRC卡,只写下类名 确定工作由AddButton类触发,然后开始进行角色扮演,在过程中完成职责的分配工作 中程在线信息产业培训网
  • 83. 应用实例首先明确扮演者,例如程序员A扮演AddButton,而由程序员扮演BookList、Book,然后开始进行扮演 程序员A挥动AddButton卡片,说:“我收到一个按下的消息,说明我收到一个新增书籍的请求,这时就创建一个新的Book对象,并将窗体上的输入信息作为参数”; 程序员B挥动Book卡片,说:“我负责对该对象进行初始化,即创建实例,根据传入的参数进行初始化,返回给你。” 程序员A挥动AddButton卡片,继续说:“当我实例化了一个新的Book对象后,就要求BookList将这个新的Book对象作为参数传给BookList,要求它完成写入保存的工作。” 程序员B挥动BookList卡片,说:“我将通过调用自身的Add方法,将这个新的Book对象保存起来”。 …… 中程在线信息产业培训网
  • 84. 应用实例最后根据角色扮演过程中的分析,填充CRC卡 : 中程在线信息产业培训网
  • 85. 技巧提示使用纸质的CRC卡要比电子介质的好得多,首先它是100%便携的,而且刚好与口袋大小相当,并且是人卡一体(也就是你容易在使用时挥动它,充分体现了参与感) 使用CRC卡最重要的目标不是生成漂亮的CRC卡,而是在于通过CRC卡、通过角色扮演,从而实现的职责分配的过程,这也是CRC卡的最大价值所在 CRC卡的背面是一个很好的可利用空间,可以用来写一个其它相关的描述语句 中程在线信息产业培训网
  • 86. 技巧提示CRC卡的设计能够帮助你更好地检查自己的设计是否符合要求。如果你感到CRC卡上的职责栏不够写,那么可能就说明这个类太大了,很容易就违背了单一职责原则;如果CRC卡上的协作栏不够写,那么意味着该类与其它类的协作太多,可能是内聚性不高或者是耦合性太强 当使用CRC卡时,如果你需要合并CRC卡时,可以简单地将两个卡写在一块,将原来的卡撕掉 中程在线信息产业培训网
  • 87. 讨论CRC技术给你什么样的启发? 在什么场景下可以使用CRC? 中程在线信息产业培训网
  • 88. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 89. 3-1 软件开发过程 中程在线信息产业培训网
  • 90. 系统三元素 中程在线信息产业培训网
  • 91. 不同视角的不同解读企业(运作者)从业人员(参与者)人甄别合适的人才,并力求选择尽可能“优秀”的合适人才; 帮助、培训人才,不断提高其产能。明确职业定位,有针对性学习; 专业化的学习,打造自己的核心竞争力。过程根据过程管理理论,制定符合团队特点的组织级过程; 收集反馈,不断改进过程。了解过程管理理论、掌握组织过程,融入过程,提高团队协作; 建立个人的规范开发过程。方法根据企业发展的需要,评估并动态调整所选择的方法论、新技术; 通过外训、内训、内部交流的形式提高团队的技能。跟踪新的方法、技术发展,并宏观的了解与掌握发展动向; 根据自己的职业定位,超时的选择新方法、技术,并且在工作中积极的尝试与应用。 中程在线信息产业培训网
  • 92. 软件开发过程定义软件过程是指实施于软件开发和维护中的阶段、方法、技术、实践和相关产物(计划、文档、模型、代码、测试用例和手册等)的集合。 软件过程是开发高质量软件所需要完成的任务的框架。 中程在线信息产业培训网
  • 93. 理论指导与实践指南理论指导类:CMM/CMMI --只定义了要做什么 实践指南类:RUP、XP、FDD、MSF --说明了如何做 中程在线信息产业培训网
  • 94. 管理越来越可视化 中程在线信息产业培训网
  • 95. 传统的软件开发模型瀑布模型:严格遵循软件生命周期各阶段的固定顺序,一个阶段完成再进入另一个阶段。其优点是:可以使过程比较规范化,有利于评审;缺点在于:过于理想,缺乏灵活性,容易产生需求偏差 快速原型模型:对于许多需求不够明确的项目,比较适合采用该模型。它采用了一种动态定义需求的方法,通过快速地建立一个能够反映用户主要需求的软件原型,让用户在计算机上使用它,了解其概要,再根据反馈的结果进行修改,因此能够充分体现用户的参与和决策。 喷泉模型:主要用于描述面向对象的开发过程,最核心的特点是迭代。所有的开发活动没有明显的边界,允许各种开发活动交叉进行 中程在线信息产业培训网
  • 96. 传统的软件开发模型演化模型:也是一种原型化开发,但与快速原型不同的是,快速原型模型在获得真实需求时,就将抛弃原型。而演化模型则不然,它将从初始的模型中逐渐演化为最终软件产品,是一种“渐进式”原型法。 增量模型:它采用的是一种“递增式”模型,它将软件产品划分成为一系列的增量构件,分别进行设计、编码、集成和测试。 螺旋模型:结合了瀑布模型和演化模型的优点,最主要的特点在于加入了风险分析。它是由制定计划、风险分析、实施工程、客户评估这一循环组成的,它最初从概念项目开始第一个螺旋。 中程在线信息产业培训网
  • 97. 3-2 RUP简介 中程在线信息产业培训网
  • 98. RUP是什么是一种软件工程过程 是一个过程产品 有自己的过程框架 捕获了现代软件开发中的最佳实践 中程在线信息产业培训网
  • 99. RUP过程的背景Rational Unified Process(RUP,统一开发过程)是一套面向对象的软件工程过程 RUP的前身是Objectory方法 RUP说明了如何有效地使用成熟技术开发软件 RUP是一个用例驱动、以体系结构为中心的迭代、增量的开发过程 RUP是“三友”方法论的统一 中程在线信息产业培训网
  • 100. 最佳实践之一:迭代开发 中程在线信息产业培训网
  • 101. 最佳实践之二:用例驱动 中程在线信息产业培训网
  • 102. 最佳实践之三:体系结构为中心 中程在线信息产业培训网
  • 103. 3-3 RUP的二维开发模型 中程在线信息产业培训网
  • 104. RUP是一个二维开发模型传统的瀑布开发模型是一个一维的模型,开发过程被划分为多个连续的阶段。 在RUP中,软件开发生命周期根据时间和RUP的核心工作流划分为二维空间。横轴表示项目的时间维,纵轴以内容来组织为自然的逻辑活动。 中程在线信息产业培训网
  • 105. 二维RUP的整体架构 中程在线信息产业培训网
  • 106. 3.1 RUP的核心工作流RUP中有9个核心工作流,分为6个核心过程工作流(Core Process Workflows)和3个核心支持工作流(Core Supporting Workflows)。 9个核心工作流在项目中轮流被使用,在每一次迭代中以不同的重点和强度重复。 中程在线信息产业培训网
  • 107. 核心工作流中英文对照1. 业务建模(Business Modeling) 2. 需求(Requirements) 3. 分析与设计(Analysis and Design) 4. 实施(Implementation) 5. 测试(Test) 6. 部署(Deployment) 7. 配置与变更管理(Configuration and Change Management) 8. 项目管理(Project Management) 9. 环境(Environment) 中程在线信息产业培训网
  • 108. 核心过程工作流业务建模:理解系统的组织结构及其商业运作,确保所有参与人员对开发系统有共同的认识。 需求:定义系统功能及用户界面,明确客户需要的系统的功能,开发人员理解系统的需求,为项目预算及计划提供基础。 分析与设计:把需求分析的结果转化为实现规格。 实现:定义代码的组织结构、实现代码、单元测试、系统集成。 测试:验证各自子系统的交互与集成。 部署:打包、分发、安装软件,升级系统;培训用户及销售人员并提供技术支持,制定并实施beta测试。 中程在线信息产业培训网
  • 109. 核心支持工作流配置和变更管理:跟踪并维护系统所有产品的完整性和一致性 项目管理:为计划、执行和监控软件开发项目提供可行性的指导;为风险管理提供框架。 环境:为组织提供过程管理和工具的支持 中程在线信息产业培训网
  • 110. 3.2 RUP的四个阶段RUP包括以下几个阶段: ① 初始(先启)阶段 ② 细化(精化)阶段 ③ 构建阶段 ④ 交付(产品化)阶段 每个阶段结束于一个主要的里程碑,每个阶段本质上是两个里程碑之间的时间跨度。 中程在线信息产业培训网
  • 111. 初始阶段—活动初始阶段所要进行如下的活动: ① 明确说明项目规模,了解环境以及最重要的需求和约束,以便可以得出最终产品的验收标准。 ② 计划和准备商业理由。评估风险管理、人员配备、项目计划以及成本/进度/收益折衷的被选方案。 ③ 综合考虑被选构架,评估构架。 ④ 准备项目的环境,评估项目和组织,选择工具,决定流程中要改进的部分。 中程在线信息产业培训网
  • 112. 初始阶段—评估标准初始阶段的评估标准如下: ① 出资人同意系统范围定义以及费用和进度评估。 ② 主要用例是否符合需求。 ③ 费用和进度评估、优先级、风险以及开发过程的可信性。 ④ 任何已开发的原型的深度和广度。 ⑤ 实际开销与计划开销。 初始阶段的焦点是需求和分析工作流。 中程在线信息产业培训网
  • 113. 细化阶段细化阶段的评估标准如下: ① 标明用例模型中的用户和参与者,并且建立用例的描述文档。用例模型需完成80%。 ② 创建软件系统开发过程中的软件结构的描述文档。 ③ 创建可执行的系统原型。 ④ 细化商业案例和风险列表。 ⑤ 创建整个项目的开发计划。 细化阶段的焦点是需求、分析和设计工作流 中程在线信息产业培训网
  • 114. 构建阶段构建阶段的主要目标如下: ① 优化资源、避免不必要的报废和返工,使开发成本降到最低。 ② 尽快达到质量的要求。 ③ 快速完成有用的版本,例如Alpha 版、Beta 版和其他测试发布版。 ④ 完成所有功能的分析、开发和测试。 ⑤ 迭代式、递增地开发随时可以发布的产品。 ⑥ 确定准备好软件系统的外部环境。 构建阶段的焦点是实现工作流。 中程在线信息产业培训网
  • 115. 交付阶段交付阶段的主要目标如下: ① 进行Beta版测试,按用户的要求验证新系统。 ② 替换旧的系统。 ③ 对用户和维护人员进行培训。 ④ 开始调整活动,例如调试、性能或可用性的增强。 ⑤ 与用户达成共识,配置基线与评估标准一致。 交付阶段的焦点是实现和测试工作流。 中程在线信息产业培训网
  • 116. RUP的迭代开发模型RUP中的每个阶段可以进一步分解为迭代。 中程在线信息产业培训网
  • 117. 迭代模型的特点与传统的瀑布模型相比较,迭代过程的优点: ① 降低了在一个增量上的开支风险。 ② 降低了产品无法按照既定进度进入市场的风险。 ③ 加快了整个开发工作的进度。 中程在线信息产业培训网
  • 118. RUP过程透视RUP2000中文版 中程在线信息产业培训网
  • 119. 剪裁RUP—定义开发案例科目实践制品初始细化构造移交业务建模敏捷建模 需求讨论会领域模型开始精化需求需求讨论会 计点投票表决 用例模型 愿景 补充规格说明 词汇表开始 开始 开始 开始精化 精化 精化 精化设计敏捷建模 测试驱动开发设计模型 软件架构文档 数据模型开始 开始 开始精化 精化实现测试驱动开发 结对编程 编码规范……项目管理…… 中程在线信息产业培训网
  • 120. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 121. 面向对象方法论Booch、OMT、OOSE都不仅包括建模符号,而且还包括具体的方法指导; Booch:在详细设计、实现方面占有优势,较少注重分析 OMT:关注“问题领域”,忽略“解决方案领域”; OOSE:对于“解决方案领域”而言非常实用,没有强调“问题领域”,而且没关于如何完成高层设计阶段的足够信息; 他们就是著名的“Rational三友”,伟大的“UML之父”。 中程在线信息产业培训网
  • 122. 面向对象方法论遗憾的是,UML仅对建模符号进行了统一,但却未包括具体的方法指导; 他们在Ivar Jacobson的Objectory过程的基础上完成了著名的RUP; RUP是现今最权威、最完整、内容最详实的一部软件过程规范; 但其离地至少有30000英尺之遥,落地 指导存在困难; 我推荐先从ICONIX开始! 中程在线信息产业培训网
  • 123. 最小UML建模技术—ICONIX思想对于大多数问题而言,只需使用20%的UML,就可以完成80%的建模工作。 实际中,好像总是没有足够的时间来完成建模、分析和设计工作,总是过早地进入到编码阶段。 足以很好地完成软件项目工作所需的、最小的UML和建模技术子集。 中程在线信息产业培训网
  • 124. 我们研究什么? 中程在线信息产业培训网
  • 125. 构造系统时的重要问题谁是系统的用户(参与者),他们想完成何种工作? 何为“现实世界”(问题域)对象,它们之间存在何种联系? 每个用例需要何种对象? 在每次用例交互,对象是如何协作的? 如何处理实时控制问题? 在具体细节上,实际上准备如何建立该系统? 中程在线信息产业培训网
  • 126. 问题与答案问 题OOSEOMTBoochUML工具/技术用户与用户活动?☆Use-case“现实世界”对象?☆高层类图为每个用例建立对象?☆Robustness分析对象交互?☆☆顺序图/协作图实时控制活动?☆☆☆状态图如何建立?☆低层类图 中程在线信息产业培训网
  • 127. ICONIX过程JacobsonBoochJacobsonRumbaugh 中程在线信息产业培训网
  • 128. 需求分析确定现实世界域对象,然后归纳并聚集对象 间的关系,开始绘制高层类图; 如果可行,做一些建议系统的快速原型。或 者收集大量与正在重新设计的旧系统有关的 信息; 使用用例图确定用例; 把用例组织成组,包图中捕获组织结构; 在该阶段,给用例与域对象分配功能需求。里程碑1:需求回顾 中程在线信息产业培训网
  • 129. 分析与高层设计编写用例描述—即一些基本动作流程,它们代表“主流”的基本流程和另一些很少遍历的路径的流程及错误情况流程; 执行健壮性分析。对于每个用例而言: > 对具有明确脚本的对象确定首次剖析,使用UML对象原型; > 当找到新的对象与属性时,更新域模型类图。 完成类图更新,使它可以反映项目分析阶段完成。里程碑2:高层设计回顾 中程在线信息产业培训网
  • 130. 设计分配行为。对一每个用例: > 确定那些需在对象间传送的消息、对象以 及涉及的相关方法。绘制顺序图,其中用例 放在左边,设计信息放置在右边。当发现属 性与操作过程时,用它们继续更新类图; > 如果愿意,可以使用协作图来显示关键的类间事务; > 如果愿意,可以使用状态图来显示实时行为; 通过添加详细信息来结束静态模型(例如,可见值与模式)。 与小组员一起来验证设计是否满足所有 已确定的需求。 里程碑3:详细/关键设计回顾 中程在线信息产业培训网
  • 131. 实现如果需要,在实现阶段绘制一些图,例如,部署图、构件图,这将对你有所帮助; 编写代码/生成代码; 执行单元测试与综合测试; 执行系统测试与用户接受度测试,对于后者,把用例作为黑盒测试使用。 里程碑4:交付 中程在线信息产业培训网
  • 132. 一些思考方法论源于实践的总结,应该用其指导建模,在合理的范围应用它,便它不应成“教条”、“信仰”,那样将使项目走向失败; 软件过程应该灵活,以适应不同风格和种类的问题;必须支持人真实的工作方式;过程对新手而言应该成为指南,但也不应该妨碍经 验丰富的成员;应以一种可理解的 方式进行管理。 中程在线信息产业培训网
  • 133. 模型演变过程概述 1首先从需求开始,产生领域模型、用例模型这一静一动两个关键的模型。其中领域模型的构建主要是利用“名词动词法”从需求描述中提取相应的领域类,然后再加入主要的属性、识别它们之间的关联关系;对于涉及领域较复杂的系统需求,则应在领域建模前进行业务分析,建立业务模型。而用例模型则是在需求的基础上进行合并,在这个过程中可以进行用户界面原型的构建,从而强化开发人员与用户之间的沟通,发现使用场景;对于用户界面原型的构建,可以采用可视化语言来快速生成、窗口导航图描述,甚至可以使用纸和笔绘制草图的方式实现。 中程在线信息产业培训网
  • 134. 模型演变过程概述 2接着在用例模型的基础上,进行Robustness分析,通过识别实体对象、控制对象、边界对象,绘制Robustness图,进一步细化,过渡到设计阶段。对于流程较复杂的用例,在描述其事件流时,还可以借助活动图来进行表示 中程在线信息产业培训网
  • 135. 模型演变过程概述 3在Robustness分析的基础上,将会发现在领域建模阶段遗漏了的对象,并引入一些与设计更相关的对象。因此,就需要将这些对象进行抽象化,更新在领域模型中,并生成初始的类模型(用类图表示),类模型就是在领域模型的基础上加入了设计阶段的内容。 在Robustness分析的基础上,就可以对每个用例进行交互建模,通过交互建模能够捕获更多设计细节,包括类的成员方法以及一些更细化的成员属性。从而对类模型进行更新,得到较完善的类模型。 最后在较完善的类模型的基础上,进行质量评审,引入基础类,通过设计模式优化结构,以生成高内聚、内耦合,扩展性好的设计方案 中程在线信息产业培训网
  • 136. 讨论RUP、ICONIX、XP给你带来什么样的启示? 如何选择软件开发过程? 中程在线信息产业培训网
  • 137. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 138. 理解面向对象思想 中程在线信息产业培训网
  • 139. 理解面向对象思想每个对象都扮演了一个角色,并为其它成员提供特定的服务或执行特定的行为。 在面向对象世界中,行为的启动是通过将“消息”传递给对此行为负责的对象来完成的;同时还将伴随着执行要求附上相关的信息(参数);而收到该消息的对象则会执行相应的“方法”来实现需求 用类和对象表示现实世界,用消息和方法来模拟现实世界的核心思想 中程在线信息产业培训网
  • 140. 如何用UML表示一个类名称:每个类都有一个惟一的名称,通常采用CamelCase格式表示 属性:是已被命名的类的 特性,它描述该类实例中 包含的信息 操作:是类所提供的服务, 它可以由类的任何对象请求以影响其行为 属性名和操作名也通常采用CamelCase格式表示,只不过首字母通常为小写。 中程在线信息产业培训网
  • 141. 如何阅读类图先看清有哪些类,然后看 看类之间存在的关系,并 结合多重性来理解类图的 结构特点以及 各个属性和方 法的含义 中程在线信息产业培训网
  • 142. 读图过程读出类:图中共有7个类,Order、OrderItem、Customer、Consignee、DeliverOrder、Peddlery、Prodcut 读出关系:从图中关系最复杂(也就是线最密集)的类开始阅读,本图中最复杂的就是Order类。 1)OrderItem和Order之间是组合关系,根据箭头的方向可知Order包含了OrderItem。 2)Order类和Customer、Consignee、DeliverOrder是关联关系。也就是说,一个订单和客户、收货人、送货单是相关的。 中程在线信息产业培训网
  • 143. 读图过程多重性:用来说明关联的两个类之间的数量关系源类及多重性目标类及多重性分析Customer(1)Order(0…n)订单是属于某个客户的,网站的客户可以有0个或多个订单Order(1)Consignee(1)每个订单只能够有一个收货人Order(1)OrderItem(1…n)订单是由订单项组成的,至少要有一个订单项,最多可有n个Order(1)DeliverOrder(1…n)一个订单有一个或多个送货单说明:系统根据订单项的产品所属的商户,将其分发给商户,拆成了多个送货单!DeliverOrder(1)OrderItem(1…n)一张送货单对应订单中的一到多个订单项DeliverOrder(1)Consignee(1)每张送货单都对应着一个收货人Peddlery(1)DeliverOrder(0…n)每个商户可以有相关的0个或多个送货单OrderItem(1)Product(1)每个订单项中都包含着唯一的一个产品Peddlery(1)Prodcut(0…n)产品是属于某个商户的,可注册0到多个产品 中程在线信息产业培训网
  • 144. 读图过程—理解方法和图Order类,有两个方法:dispatch()和close(),从名字中可以猜出它们分别实现“分拆订单生成送货单”和“完成订单”。而在DeliveOrder()类中则有一个Close()方法,同理它应该表示“完成送货”。而在OrderItem中有一个stateChange()方法和deliverState,不难猜出它就是用来改变其“是否交给收货人”标志位的 中程在线信息产业培训网
  • 145. 读图过程—理解方法和图先调用Order的dispatch()方法,它将根据其包含的OrderItem中产品信息,来按供应商户分拆成若干个DeliverOrder。商户登录系统后就可以获取其DeliverOrder,并在执行完后调用close()方法。这时,就将调用OrderItem的stateChange()方法来改为其状态。同时再调用Order的close()方法,判断该Order的所有的OrderItem是否都已经送到了,如果是就将其真正close()掉 中程在线信息产业培训网
  • 146. 使用了更多建模元素的类图 中程在线信息产业培训网
  • 147. 辅助建模符号导航箭号:类的实例之间只能沿着导航箭头的方向传递 ,在Order中可以获取其相应的Consignee,而从Consignee中是无法了解与其相关的Order的 角色名称:Customer端有一个“+Owner”字符串 ,这表示Customer扮演的角色是Owner,也能对关联进行命名 中程在线信息产业培训网
  • 148. 辅助建模符号导出属性:是指可以根据其他值计算出来的特性,这种属性应在其名称前加上一个“/”符号。 限定符:在Order和OrderItem之间的组合关系中,OrderItem这端多了个方框,写着“ProductId”。在UML中称为限定符,存在限定符的关联称为受限关联。它用来表示某种限定关系。在本例中说明:对于一张订单,每一种产品只能用一个订单项 约束:用来说明规则,{xor}… 职责:在类的属性栏中添加注释行表示,或增加了一个新的分栏 中程在线信息产业培训网
  • 149. 对象约束语言环境与约束:每个OCL表达式都必须是针对某个元素的,因此在OCL表达式前必须说明它针对元素(这就称为环境) 1)“context Object inv:”,其中Object是OCL表达式针对的建模元素名称; 2)“ Object ”,其中Object是OCL表达式针对的建模元素名称。 当声明了环境之后,就可以用self来引用它的变量 中程在线信息产业培训网
  • 150. 对象约束语言子集约束: 一致性:一个客户拥有零个或多个合同,发票是基于某个合同的,而一个客户将收到零张或多张发票 Invoice:self.contract.customer=self.customer 中程在线信息产业培训网
  • 151. 对象约束语言异或关系: 规定的取值范围: Rectangle:length>0 and width>0 中程在线信息产业培训网
  • 152. 用类图表示软件系统模型 领域模型是从面向对象视角看待现实世界的结果,也就是通过类图描述现实世界中各种事物的关系。 分析模型和领域模型很相近,分析模型主要是针对软件系统,领域模型则更多偏重对业务领域的分析 设计模型则是在分析模型的基础上添加设计元素的结果。设计模型中的类的属性集更趋完善。 中程在线信息产业培训网
  • 153. 用类图表示数据库逻辑模型从某种意义上说UML中的类图是E-R图的超集,E-R图只针对存储的数据,而类图则在些基础上,增加了行为建模的能力。在使用类图来表示E-R模型时,要注意遵循以下策略 将表示E-R模型的类,用UML的标准构造型“{persistent}”来表示; 展开类的结构性细节,并加强关联和多重性分析; 尽量消除循环关联、n-元关联 中程在线信息产业培训网
  • 154. Agenda面向对象分析与设计 软件设计工具概述 RUP统一软件开发过程 ICONIX过程 类模型基础 面向对象设计原则 中程在线信息产业培训网
  • 155. 海的启示上甲板,人说要望着远处就不晕了 中程在线信息产业培训网
  • 156. 面向对象的设计目标可维护性 可复用性 中程在线信息产业培训网
  • 157. 可维护性现在存在的问题 过于僵硬 过于脆弱 复用率低 黏度过高 中程在线信息产业培训网
  • 158. 可维护性设计的目标 可扩展性(Extensibility) 新的功能可以很容易地加入到系统中 灵活性(Flexibility) 允许代码修改平稳地发生,而不会涉及到许多其它模块 可插入性(Plug ability) 可以很容易地将一个类抽出去,同时将一个可以很容易地将一个类抽出去,同时将一个有同样接口的类加入进来。 中程在线信息产业培训网
  • 159. 可复用性重要性 较高的生产效率 较高的软件质量 恰当使用复用可以改善系统的可维护性 传统的复用 代码的剪贴使用 算法的复用 数据结构的复用 中程在线信息产业培训网
  • 160. 设计原则单一职责原则(SRP) “开闭”原则(OCP) 里氏替换原则(LSP) 依赖倒转原则(DIP) 接口隔离原则(ISP) 中程在线信息产业培训网
  • 161. 5-1 单一职责原则 中程在线信息产业培训网
  • 162. 问题假设你在做一个人事管理方面的信息系统,系统采用B/S结构,其中有一个功能需求是这样的,让用户新创建一个新员工,输入其相关的资料,并将其资料存储到数据库中,你会怎么做? 在员工类(Employee)中构建了个方法,创建一个新的员工(对象),并从相应的界面类中获取用户输入的内容,然后存储到数据库中去 在你的解决方法中,是在方法中直接使用SQL语句,与数据库进行交互,对吗? 中程在线信息产业培训网
  • 163. 分离业务逻辑与数据库处理一个类应该只承担一个职责,这样做的原因是,一个职 责通常是一变化的轴线,如果多个职责都放在一起,那 么就会有多种可能,给该类带来很大的修改麻烦 中程在线信息产业培训网
  • 164. 并非必需的分离在使用Socket套接字进行编程时,其实包括两方面的 职责,一是建立数据连接,二是进行数据通讯。那有 必要像上图那样将它们分离吗? --把握度的问题! 中程在线信息产业培训网
  • 165. 小结就一个类而言,应该仅有一个引起它变化的原因。通俗地说,就将要将不同的职责分到不同的类中,让每个类只承担一个职责。如果一个类承担了多个职责,那么引起它变化的原因就会有多个,这就是SRP(单一职责)原则的核心思想。 如果一个类承担的职责过多,就等于把这些职责耦合在一起了,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏 中程在线信息产业培训网
  • 166. 讨论在你的实践中是否存在违反SRP原则的例子? SRP原则给你带来了什么启示? 中程在线信息产业培训网
  • 167. 又一个违背SRP的例子一个使用公文流的项目,根据客户的需求,需要图形化地显示出公文审批的状态,我就是直接在公文流、审批环节等与业务逻辑相关的类中写代码,绘制出相应的节点,并将其连接起来。后来图形化的要求不断在变,公文流的需求也在变,天呀,我的类是改来改去 中程在线信息产业培训网
  • 168. 5-2 开闭原则 中程在线信息产业培训网
  • 169. OCP原则介绍软件实体应该是可以扩展的,但是不可修改的。如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性的问题 “对于扩展是开放的”:这意味着模块的行为是可以扩展的,当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换句话说,我们可以改变模块的功能。 “对于更改是封闭的”:对模块行为进行扩展时,不必改模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或Java的.jar文件,都无需改动。 中程在线信息产业培训网
  • 170. 问题有一个书店销售系统项目,其中有一个功能需求是计算购书总金额,该书店需要根据会员的累计消费金额进行折扣,一开始定义的业务规则是:累计消费金额达到500元以上,打9.5折;达到1000元以上,打9折;达到2000元以上,打8.5折 中程在线信息产业培训网
  • 171. 最初的解决方案在Order类中,实现了一个compTotal方法,在该方法是一个条件判断语句,通过调用Member类的getAmount方法获得会员的累计消费金额,然后进行总价的计算,并将新的消费金额通过Member类的updataAmount方法更新该会员累计消费金额 中程在线信息产业培训网
  • 172. 讨论这种解决方案有带来什么问题? 中程在线信息产业培训网
  • 173. 后续的需求变更当其程序完成的时候,客户又提出了新的要求:对于非会员客户,将根据其一次性购书金额进行折扣,达到300元时,打9.8折;达到500元时,打9.5折;达到1000元时,打9折。无奈之下,又修改了Order类compTotal方法,增加了几个IF语句组。 可是,就在项目完成不久,需求又变化了,对于单位会员的用户,将实行专门的折扣制度:累计消费金额达到达到2000元以上,打9折;达到3000元以上,打8.5折;达到5000元以上,打8折。而且还开新增了一个在线购书的子系统,这时需要修改的类更多了 中程在线信息产业培训网
  • 174. 讨论应该怎么办? 中程在线信息产业培训网
  • 175. 一个源于生活的实例在我国政府的干部选拔时,遇到这样一个问题,有一些领导干部已经快到退休年龄,但随时时代的发展,为了更好地开展工作,需要选拔新的年轻干部担任领导职务,但这些老干部如何处理呢?毕竟他们曾经做出了不可磨灭的成绩呀。 因此,就设立了一些诸如督导员、巡视员等级别相同的职务,这样既方便老干部发挥余热,又解决了新干部的提升。最关键的是,保护了原有的编制制度 中程在线信息产业培训网
  • 176. 问题分析对于折扣的计算是一个充满变数的业务规则,在原来的设计方案中,把这样一个易变的东西打包在一起。这样在每一次业务规则的变化时,都需要修改与计算折扣操作相关的类,包括这里的Order类,也包括在线购书那个部分中的相关的类。这就让你已有的模块,需要根据新的业务规则进行修改 中程在线信息产业培训网
  • 177. 新的解决方案将计算折扣的操作,作为Member类的一个虚方法compDiscount,并且根据非会员、个人会员、单位会员三种不同的情况,从Member类中继承出三个子类,并在子类中实现这个虚方法!这样如果有第四种情况,也只需从Member类中再继承出一个新的子类,而对Order类没有任何的变化 中程在线信息产业培训网
  • 178. 讨论在你的实践中是否存在违反OCP原则的例子? OCP原则给你带来了什么启示? 中程在线信息产业培训网
  • 179. 5-3 里氏替换原则 中程在线信息产业培训网
  • 180. 概述在面向对象语言中,继承是一个关键的机制,而LSP(里氏替换原则)原则就是针对继承的设计原则:子类型必须能够替换掉它们的基类型 中程在线信息产业培训网
  • 181. 问题那是一个学校图书馆的信息系统。在这个图书馆中有书籍和杂志,通常一本相同的书有多个复本,而杂志则只有一本。该图书馆向会员和职员开放,会员一次可以借阅少许书籍,不能借阅杂志,而职员则可以借阅少许杂志和书籍。 How Design? 中程在线信息产业培训网
  • 182. 原解决方案有问题吗? 中程在线信息产业培训网
  • 183. 需求变更业主方提出了许多诸如对图书馆会员进行统计积分、预约管理等新功能需求,而这些功能都与职员无关。更有戏剧性地,其修改了业务规则,也允许会员借阅杂志 中程在线信息产业培训网
  • 184. 新解决方案 中程在线信息产业培训网
  • 185. 实例2我们构建了一个父类—直线,然后从其中派生出子类—线段。线段新增了一个成员方法—求长度,而重载了另一个成员方法—是否在线上 有问题吗? 中程在线信息产业培训网
  • 186. 问题与解决方案对于直线来说,如果取X轴或Y轴的交点,这个交点一定会在线上;而对于线段还说,则不一定。这就是违反LSP原则的一个例子 其实要解决这个问题也很简单,也就是当我们发现一组类中都包括相同的职责,那就就应该将他们抽取出来,形成超类(方法一) 中程在线信息产业培训网
  • 187. 问题与解决方案对于Java这样的支持接口的面向对象编程语言,还可以将继承关系改变成为委托关系(方法二) 中程在线信息产业培训网
  • 188. 讨论在你的实践中是否存在违反LSP原则的例子? LSP原则给你带来了什么启示? 中程在线信息产业培训网
  • 189. 5-4 依赖倒转原则 中程在线信息产业培训网
  • 190. 定义高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象—这就是著名的DIP(依赖反转)原则 因为许多传统的软件开发方法(诸如结构化分析与设计)总是倾向于创建一些高层模块依赖于低层模块、策略依赖于细节的软件结构。实际上这些方法的目的之一就是要定义子程序层次结构,该层次结构描述了高层模块怎样调用低层模块 一个设计良好的面向对象的程序,其依赖结构相对于传统的过程式方法设计的通常结构而言就是“反转”了 中程在线信息产业培训网
  • 191. 不成熟的设计Button对象感知外部环境的变化,当接收到Poll消息时,它会判断是否被用户“按下”。它不关心是通过什么样的机制去感知的。可能是GUI上的一个按钮图标,也可能是一个能够用手指按下的真正按钮,甚至可能是一个家庭安全系统中的运行检测器。Button对象可以检测到用户激活或者关闭它 Lamp对象会影响外部环境,当接收到TurnOn消息时,它显示某种灯光。当接收到TrunOff消息时,它把灯光熄灭。它可以是计算机控制台的LED,也可以是停车场的水银灯,甚至是激光打印机中的激光 中程在线信息产业培训网
  • 192. 讨论为什么说它不成熟? 中程在线信息产业培训网
  • 193. 理由注意Button类直接依赖于Lamp类。这个依赖关系意味着当Lamp类改变时,Button类会受到影响。此外,想要重用Button来控制一个Motor对象是不可能的。在这个设计中,Button控制着Lamp对象,并且只能控制Lamp对象 public class Button { private Lamp itsLamp; public void poll() { if ( /* some codition */) itsLamp.turnOn(); } } 如何解决? 中程在线信息产业培训网
  • 194. 改进方案反转对Lamp对象的依赖关系(如下图),从中可以看到Button现在和一个称为ButtonServer的接口关联起来了。ButtonServer接口提供了一些抽象方法,Button可以使用这些方法来开启或者关掉一些东西。Lamp实现了ButtonServer接口。这样,Lamp现在是依赖于别的东西了,而不是被依赖了 中程在线信息产业培训网
  • 195. 5-5 接口隔离原则 中程在线信息产业培训网
  • 196. 定义主要用来处理“胖”接口的缺点 如果类的接口内聚性不高,就表示该类具有“胖”的接口,也就是可以分解成多组方法,每一组方法都服务于一组不同的客户程序 ISP(接口隔离原则):不应该强迫客户依赖于它们不用的方法 中程在线信息产业培训网
  • 197. 接口污染实例Door是抽象的,可 以使用符合Door接 口的对象,而不要 依赖于其特定实现 有一个TimedDoor 实现,门开的时间 太长,就会警告, 它要与一个Timer 对象交互class Door { public: virtual void Lock()=0; virtual void Unlock()=0; virtual bool IsDoorOpen()=0; };class Timer { public: void Register(int timeout,TimerClient * client); }; Class TimerClient { public: virtual void TimeOut()=0; }; 中程在线信息产业培训网
  • 198. 将它们连接起来Door继承了TimerClient,因此TimedDoor也就继承了TimerClient。这就保证 TimeClient可以把自己注 册到Timer中,并且可以 接收TimeOut消息有什么问题? 中程在线信息产业培训网
  • 199. 问题分析Door依赖于TimerClient了,但并不是所有的Door都需要定时功能 如果创建无需定时功能的Door的派生类,那么在这些派生类的应用程序中要提供TimeOut方法的退化实现 显然,Door接口和TimerClient接口是完全不同的客户程序使用的 中程在线信息产业培训网
  • 200. 使用委托分离接口 中程在线信息产业培训网
  • 201. 使用多重继承分离接口 中程在线信息产业培训网
  • 202. 5-6 设计实例讨论 中程在线信息产业培训网
  • 203. 问题某“集中告警管理系统”对告警信息的分级提示处理,为其构建一个良好的设计。 对“信用卡客户服务系统”,要求能够以多种方式发送多种信息给用户,并能够适应未来业务的发展变化 中程在线信息产业培训网
  • 204. 信用卡系统 中程在线信息产业培训网