290 likes | 449 Views
第九课. 面向对象分析与设计方法. 方法学和面向对象方法论. 1.方法论是指思考和做事的策略、步骤、方向和行动 面向对象方法论的概念在1987年由 Booch 首先提出 2.目前面向对象方法论有50多种,主要有: Booch 模型; Rumbaugh 的 OMT 模型; Jacobson 的 OOSE 模型; Martin 的 OOAD 模型; Shlaer 的 OOSA 模型; Coad 的面向对象方法论; Martin 的面向对象方法论等等。
E N D
第九课 面向对象分析与设计方法
方法学和面向对象方法论 • 1.方法论是指思考和做事的策略、步骤、方向和行动 面向对象方法论的概念在1987年由Booch首先提出 • 2.目前面向对象方法论有50多种,主要有: • Booch模型;Rumbaugh的OMT模型;Jacobson的OOSE模型;Martin的OOAD模型;Shlaer的OOSA模型;Coad的面向对象方法论;Martin的面向对象方法论等等。 • 3.目前人们在努力统一各种面向对象方法论,统一的结果是产生了统一模型语言——UML。UML本身不是方法,但是UML提供了能够描述所有面向对象方法的符号工具和语义工具。
面向对象程序设计的一般方法 建立面向对象的领域模型 描述问题域 OOA 重点考虑什么事必须完成,而不是如何完成。 提出解决方案 确定面向对象的实现模型 OOD 决定问题如何来解决。 实施解决方案 构造、测试和发布面向对象程序 OOP
本课使用的例子 • 一个文件分割、合并器 • 能够分割和合并文件 • 能够增加和删除文件 • 能够展示和提取文件
领域模型 • OMT方法 • Coad对象方法 • Jacobson用例驱动方法
领域模型(Coad方法) 模型部件 问题域(PD) 人机交互(HI) 数据管理(DM) 系统交互(SI)
领域模型(OMT方法) • 1.什么是对象模型 • 对象模型描述了客观世界实体以及实体彼此间的关系,是问题域的静态数据结构表示,以对象图形式表示。 • 2.什么是动态模型 • 动态模型表示瞬时的、行为化的系统的“控制”性质,规定了类型模型中实体的合法变化序列,即对象的动态行为,以状态图形式表示。 • 3.什么是功能模型 • 功能模型用来描述系统中对象功能,表达数据的流动、转换情形,以数据流程图、用例图形式表示。
领域模型( Jacobson用例方法) • 用例(use case)是指行为相关的事务(transaction)序列,该序列由用户在与系统交互中执行。每一个用例就是一个使用系统的方式,当用户给定一个输入,就执行一个用例的实例,并引发执行属于该用例的一个事务。 • 确定用例模型,用例由使用者、实例和作用三个部分描述 • 使用用例模型构造需求模型 • 需求模型包括领域对象模型、界面描述 • 使用用例和需求模型建立分析模型,分析模型用于划分出接口对象、实体对象、控制对象,以及由这些对象组成的子系统
建立领域模型的一般方法 • 领域模型的内涵: • 问题域有什么 • 问题域做什么 • 问题域需要我们提供什么功能 • 领域模型建立的一般步骤: • 1. 跟踪、记录所有的实体,输出一个实体的词汇表 • 2. 统一类型、实体命名方法和规则 • 3. 描述单个类型,输出不完全的类图 • 4. 确定类型之间的关系,输出完整的类图(问题域的静态结构) • 5. 描述状态、时序、流程(问题域的动态结构) • 6. 建立用例,用于描述功能 • 7. 提取界面并展示给用户 • 8. 迭代上述过程
描述实体类型 • 文件 • 集合文件
描述类型之间的静态关系 • 关联关系 • 普通关联 递归关联 限定关联 • 或关联 有序关联 关联类 三元关联 • 聚合关系 • 继承关系 • 依赖关系
文件和集合文件的关系 在问题域中的模型主要用于呈现给用户以及对问题的理解,可以是不精确的,可能与最后的实现模型有一定的区别
描述实体类型的动态关系 可以用活动、状态 序列等描述类型之 间的动态关系
建立用例 • 用例用于以下目的: • 确定系统功能,达成与用户的共识 • 在分析、设计、开发人员之间取得一致 • 提供系统设计、实现中类、对象等的设计依据 • 为系统测试打下基础 • 用例由以下几个部分构成: • 角色 • 实例 • 实例的操作关系(时序、调用、合并) • 角色-实例的描述
小结(领域模型) • 对问题域的分析输出了以下成果 • 1.确定了问题域中有哪些实体类型以及它们之间的关系 • 2.确定了问题域中这些实体类型的动态结构 • 3.确定了需要实现的功能 • 如果使用UML工具,将形成 • 1 .类图 • 2.活动图 • 3.用例图
实现模型(OMT方法) • 1.确定体系结构 • 将系统划分成子系统 • 确定问题域中一致的继承 • 分配子系统的处理器和任务 • 选择一个方法管理数据存储 • 确定全局资源以及访问方式 • 确定系统的控制流 • 处理边界条件 • 2.确定对象结构 • 合并问题域三个模型来获得类的操作(服务) • 设计算法实现操作 • 优化对数据的访问路径 • 调整类结构,增加继承、抽象和泛化 • 确定类关系(作用关系) • 将类和关系封装在子系统或者模块中 • 3 输出结果 • 更加详细的对象模型、动态模型、功能模型
主题层 人机 交互 问题域 数据 管理 任务 管理 类与对象层 结构层 属性层 服务层 实现模型(Coad方法) 主题层:模块、包、命名空间的划分 类与对象层:确定有哪些类 结构层:确定类、对象之间的关系(通用-特定;整体-部分) 属性层:确定类的属性,以及属性的封装机制 服务层:确定类的接口
实现模型(用例方法) • 用例方法将该阶段称为构造阶段,构造阶段的成果包含了: • 1.构块模型,构块模型的设计集中考虑可跟踪性、实现环境 • 2.交互作用图,交互作用、事件与激励、均一化 • 3.确定对象内部行为(状态图) • 4.实现和测试
建立实现模型的一般方法 • 实现模型的内涵: • 1.实现模型中有哪些类,每个类有哪些接口 • 2.实现模型中这些类是怎样组织的 • 3.对于每一项功能,实现模型中类的动态调用过程是怎样的 • 4.类、接口、功能以怎样的方式呈现给用户 • 建立实现模型的一般步骤: • 1.扩展问题模型确定对象类以及对象类的领域(类图) • 2.寻找可重用的设计模式 • 3.根据问题模型确定类的状态空间和行为接口(类图) • 4.根据问题模型确定类的组织方式(类图/对象图/包图/配置图) • 5.确定类的工作流、控制流(细化的活动图、序列图等) • 6.迭代上述过程
确定类的领域 • 一个标准的面向对象系统的类包括四个领域 • 1.应用领域——包含了对于应用本身有价值的类 • 事件管理类 • 事件识别类 • 2.商业领域——包含了对于行业有价值的类 • 关系类 • 角色类 • 属性类 • 3.结构领域——包含了对于体系结构有价值的类 • 人机界面类 • 数据操作类 • 机器通信类 • 4.基础领域——包含了实现应用、商业、结构的语言相关的类 • 语义类 • 结构类 • 基础类 • 可重用性:基础领域>结构领域>商业领域>应用领域
确定类的领域 • 应用领域类 • 文件集合类(SetFile) • 商业领域类 • 文件类(File) • 文件流类(FileStreamOpt) • 文件合并分割类(FileCutMerge) • 结构领域类 • 系统主窗口 MainWindow • 集合文件浏览窗口 FilesBrowseWindow • 文件详细信息查看窗口 FileInfoWindow • 命令按钮/工具栏 CommandButton/CommandToolBar • 基础领域类 • 字符串/整数/布尔 String/Integer/Boolean • 日期时间 DateTime • 哈希表 Hash • 枚举 Iterator
确定类的状态空间和行为接口 • 类的状态空间是指类的属性以及属性的约束条件 • 类的行为接口是指类暴露的方法或者服务 • 在复杂的类设计中,类的状态空间和行为接口应通过对不变式、前置条件和后置条件的设计作为依据 • 类的不变式、前置条件和后置条件可以作为系统单元测试的主要依据 • 例如在设计时刻应确保FileStreamOpt的行为接口 • ExtractStream前置条件是存在一个File(file1)对象,后置条件是存在一个File(file2)对象和一个FileStreamOpt(stream1)对象,且 • Size(file1) = size(file2) + size(stream1)为不变式
确定类的组织方式 类的组织方式往往和实现的语言有关,类可以有以下几种组织方式,类的组织设计应以问题域的类图为依据: 1.通用-特化(继承关系) 2.抽象-实例(接口、抽象类、模板) 3.聚集(成员) 4.关联(单向或者双向的引用) 5.依赖(函数参数、友元)
确定类的工作流 • 根据用例细化问题域的状态图、活动图等,详细描述 • 对于用例的每一个实例,确定系统对象调用流程
小结(实现模型) • 建立实现模型将输出以下结果: • 确定了系统所有实现的类、类的接口、不变式 • 确定了类之间的组织关系 • 每一个功能的实现细节 • 如果使用UML,将形成以下内容 • 类图、对象图、包图 • 协作图、活动图、配置图 • 细化的用例图