1.21k likes | 1.44k Views
4.1 什么是 OOA 为何需要 OOA?. 第 4 章 面向对象的分析与建模. 内容. 4.2 面向对象分析方法简介. 4.3 面向对象的分析原则和过程. 4.4 建立对象模型 — 类图 4.5 建立动态模型. 掌握. 建立两种模型的过程. 简易的开发过程. 用例图和文字描述. 类图. 序列图. 源代码. 图 4-1 简易的开发过程. 4.1 什么是 OOA (Object-Oriented Analysis)? 为何需要 OOA ?. 分析是对问题的调查 , 了解系统工作的业务过程。.
E N D
4.1 什么是OOA 为何需要OOA? 第4章 面向对象的分析与建模 内容 4.2 面向对象分析方法简介 4.3 面向对象的分析原则和过程 4.4 建立对象模型—类图 4.5 建立动态模型 掌握 建立两种模型的过程
简易的开发过程 用例图和文字描述 类图 序列图 源代码 图 4-1 简易的开发过程
4.1 什么是OOA (Object-Oriented Analysis)? 为何需要OOA? • 分析是对问题的调查,了解系统工作的业务过程。 面向对象的分析是: 按照对象(事物、概念、实体)的观点考虑问题域。 概念应 用的一 组实例 Sale 1 Sale date time 一个Sale代表了一次购物交易的事件,它有日期和时间 Sale 3 Sale 2 Sale 4 概念的内涵 概念记号 3 概念的外延 • OOA,识别出问题域的不同概念,并用概念模型 表示是分析阶段的主要任务。
概念模型(conceptual model): 是问题域中概念的描述,强调领域中的概念, 而不是软件实体。概念模型可以展示: 一组概念 概念间的关联 概念的属性 在UML中,一个概念模型是用一静态结构图 (static structure diagram)来描述的。 Sale date time Sale date Time Print() SalesDatabase 属性为 成员变量 软件制品 操作为 成员函数 真实世界中的概念 (实体,实体信息) 软件类
分析方法发展的必 然: 功能分解法 数据流法 信息模拟法 面向对象方法 需要OOA的原因: • 分析中的困难 • OOA的优点 5
状态迁移图,时序图 系统组成结构 类图、对象图 模块图、进程图 图 4-2 Booch方法 4.2 面向对象分析方法简介 1)OMT(Object modelling Technique)Rumbaugh 91 对象模型 建 立 动态模型 功能模型 2) Booch方法 (method of object analysis and design,1994))
类和对象层 属性层 结构层 主题层 服务层 3) Coad & yourdon 方法 (OOA/OOD,1991) 图 4-3 Coad&yourdon 模型
提供一套符号如 、 等描述系统 4 ) Wirfs – Brock 方法 称RDD(Responsibility Driven Design)责任驱动法 建立CRC(Class Responsibility Collaborator)卡, 描述类及相关的协助类,共同承担的责任。 5) Bailin方法 也称OOS方法,1989 主要是建立实体关系图ERD,实体数据流图EDFD。 6) OOSE方法[Jacobson ,1992] (Object oriented software engineering)
4.3 面向对象的分析原则和过程 抽象、封装、继承、多态、结构化分析原则 • 把过程抽象 (procedural abstraction) 与数据抽象 (data abstraction)结合在一起. 超类(super class)是一组子类的抽象. 方法(method):是隐藏实现过程抽象. 操作(operation):是一组方法的抽象. 属性(attribute)和关联(association): 是实现它们基本实例变量的抽象. • 对象(object):对客观事物的抽象. 类(class):是一种数据抽象,即是对一组对象的抽象. 包含作用于对象上的过程或方法抽象.
迭代 过程 面向对象的分析过程 什么是业务过程? 用户、客 户 需求 分析 开发者 问题描述(用例) 管理者 领域知识 OOA 分析 专家知识 角色是什么? 现实世界经验 建立对象(概念)模型:初始类图 动态模型(职责分配) 类图 建立 模型 图 4-4 OO分析过程
4.4 建立对象模型—类图 步骤 • 确定类和对象 • 确定属性 • 确定关联 • 确定结构
概念层 (Conceptual) 类图描述应用 领域中的 概念, 一般地,这些 概念和类有自 然的联系,但 两者并没有直 接的映射关系. 实现层 (Implementation) 类图才真正考虑类的 实现问题,揭示实现 细节。 说明层 (Specification) 类图描述软件的接 口部分,而不是软 件的实现部分 4.4.1 类图(class diagram) 1)类的抽象层次 图 4-5 类的抽象层次(是由 Steve Cook和John Daniels引入的)
Dialer拨号器 类名 public class Dialer { private Vector digits; int nDigits; public void digit(int:n); protected boolean recordDigit(int n); } - digits:Vector - nDigits:int 属性/ 成员 变量 + digit(n:int) # recordDigit( n:int):boolean 操作/ 方法 • 图 4-6 类的实现层
2) 类图(class diagram)及组成 类(Class)、对象(Object)和它们之间的 关系是面向对象技术中最基本的元素 • 类图技术是OO方法的核心 • 类图是静态视图,表示类的静态结构模型 • 描述类和类之间的关系的图就构成了类图 • 类图是定义其他图的基础
类4 实现接口 • 类 Class2 Class4 • 接口 • 类图包含下述内容: Class1 • 协作 Interface • 依赖、泛化、 Class3 • 实现和关联关系 协作Collaboration 依赖于类1 • 类图可以包含注解和约束; • 类图还可以有包或子系统, 二者都用于把模型元素聚 集成更大的组快。 • 图 4-7 类图包括内容
类图上的关系 类之间的静态关系主要有: • 依赖:它表示类之间的使用关系 (包括精化、跟踪和绑定关系) • 泛化:它把一般类连接到它的特殊类; • 关联:它表示对象之间的结构关系。
类名 属性 方法 4.4.2 确定类和对象 事物 1) 什么可以作为对象 组织单位 设备 充当角色 地点/位置 其他系统 突发事件 实实在在的事 物 图 4-8 作为对象的 事物图
对象、属性、 关系、结构 实体关系图 语义数据模型 OOA 面向对象的程序设计语言 类结构、继承、 封装、消息通信 图 4-9 实体到对象方法 2) 确定类和对象的方法 (1) 实体 ——对象法 ERD(Erentity Relationship Diagrams) ORD(Object Relationship Diagrams) 转换规则: 实体可能成为对象 简单的实体成为一个对象 复杂的实体分解为几个对象
姓名 地址 工资 电话号 名称 地址 身 份 证 号 为之 工作 主 要 产 品 员工 公 司 组成 ISA ISA 职务 管理 经 理 部门 部门名 工 人 参 加 主 持 生产 项目 产品 项目名 预算 优先级 产品名 成本 质量 图 4-10 实体关系图
公司 1 1..* 为之工作 员工 姓 名 地 址 电话号 主要产品 姓名 地址 身份证号 工资 职 务 雇用 解雇 部门名 1 1..* 1..* 1..* 1..* 产品 项目 产品名 成本 质量 名称 预算 优先级 工人 经理 部门 图 4-11 对象关系图
(2) 根据(事物)概念目录列表找出概念 ——名词或名词短语作为对象
产品目录 服务员 销售规格说明 支付 图 4-12销售点终端问题域中的初始概念模型 销售点终端系统的概念模型 销售点终端 商品项 商店 销售项 顾客 销售项条目 出纳员 管理员
(3) 使用类 —职责—协作卡(CRC卡进行建模) Class ResponisbilityCollaborator Card 从用例出发找出类 类名:是一个名词或一个短语 类的职责:是类知道并要完成(“做”)的事情 知道型(knowing)职责 知道自己私有的封装了的数据 知道自己相关联的对象信息 知道自己派生或计算出来的事物 23
做(doing)职责 自己完成某件任务 发起其他对象执行动作 控制和协调其他对象内活动 定义协作者 当类没有足够的信息来履行职责时就需要协作, 协作必须发生在一个类需要信息的时候。 确定协作时考虑的问题 • 对于任何协作,总是至少有一个发起者。 • 有时协作者完成工作的主要部分。 • 协作应是直接的。 • 可能会产生新的职责来实现协作。
注册讨论班(UI) **参阅原型** 请求确定学生信息 启用讨论班搜索信息 显示讨论班列表 显示讨论班费用 显示教授信息 学生 讨论班 教授 学生(Actor) 学生 提供自己的信息 请求注册讨论班 请求成绩单 注册讨论班 成绩单 教授 姓名 地址 电话 邮件 平均分 验证确定信息 提供参加讨论班类表 注 册 记 录 讨 论 班 姓名 地址 电话 邮件 薪水 提供信息 指导的讨论班 安全登陆(UI) **参阅原型** 请求学生确认信息 学生 注册讨论班的 CRC卡
讨 论 班 名称 讨论班编号 费用 等待列表 注册学生 导师 添加学生 撤销学生 学生 教授 成 绩 单 (UI) **参阅原型** 获得学生信息 获得学生参加讨论班的信息 确定平均分 输出成绩 学生 讨论班 教授 注册记录 注 册 记 录 获得的分数 平均截至日期 最终成绩 学生 讨论班 注册讨论班的 CRC卡
(4)去掉无用的类和对象 * 去掉冗余的类和对象 * 不考虑与本问题无关的类和对象 * 不考虑和实现有关的类和对象 * 去掉模糊概括的类 * 不要把概念当作属性 火车订票系统中的目的地是车次的属性还是概念? * 区分领域中的系统分析员观察世界所得到的真实概念 (是对问题内事物的描述)和软件设计人员描述软件实体 所使用的概念,是从不同视觉出发而得到的。 Sale date time Sale date Time Print() 软件类, 不是概念 的一部分 SaleDatabase 软件制品,不是概念的一部分 真实世界中的概念(记号)
* 怎么选择相近的概念? Register 登记薄 POST 1 1 Register这个概念可以代替POST? * * Sale Sale 图 4-13 具有不同名称的类似概念 POST是一个领域常见的术语,从熟悉和传达信息角度, 是个有用的记号。 Register更为抽象一些,如果从软件的实现和模型的抽象相分离为目标来建立模型, Register也是有用的,这个术语也有了普遍意义了。 28
用例 外部系统 用户 用户界面 外部系统接口 3) UML可描述三个主要的类 (1)边界类(boundary) • 边界类用于描述外部参与者与系统之间的交互. • 一个参与者与一个用例之间的交互对应一个边界类. • 边界类包括: 用户界面:描述用户与系统之间的交互,而不是 显示形式,如按钮、菜单等. 系统接口、设备接口:描述所定义的通信或交换 协议,而不是说明协议如何实现的.
例: MiniLibray 边界类 BrowseForm 注册用户进行查询浏览的操作界面 LoginForm 注册用户进行登录的操作界面 MakeReservationForm 普通读者预订图书的操作界面 注意: • 边界类关注参与者与用例之间交互的信息或响应的 事件,不描述窗口组件等界面的组成元素. • 若两个用例同时与一个参与者交互,可能会共用一个 边界类. • 分析阶段,应使用用户的术语描述界面.
用例 外部系统 用户 控制逻辑 (2) 控制类(Control) 控制类:用于描述一个用例所具有的事件流控 制行为,它本身不处理具体的任务,而 是调度其它类完成具体的任务. 控制类,隔离和协调了边界类和实体类.
例: MiniLibray 控制类 MakeReservationControl 负责执行普通读者的预订图书 BrowseCountrol 负责执行注册用户的查询浏览 RemoveReservationControl负责执行普通读者的取消预订 注意 • 当用例比较复杂时(如有分支的事件流),一个用例可 以有多个控制类; • 当用例事件流逻辑结构十分简单,则没有必要使用控 制类,可用边界类实现用例的行为,如“登录”。 • 一般一个用例对应一个控制类,若不同用例包含的任 务之间存在紧密联系,则这些用例可共用一个控制类.
MiniLibray 实体类: BorrowerActor 借阅者 BorrowerInfo 普通借阅者的基本信息 Loan 普通借阅者的借书记录 (3) 实体类 用例中的参与对象,对应现实世界中的事物. 实体类用于描述必须存储的信息及其相关行为. Librarian 图书管理员 注意 • 实体类的识别质量取决于文档的风格和质量 • 自然语言描述不精确,注意文档用辞规范 • 自然语言描述中,名词对应类、属性或同义词等, 要进一步筛选.
4.4.3 确定类和对象的属性(attribute) 属性:是某个对象的逻辑数据值 Sale data startTime: Time 1) 属性类型 (1)简单的数据类型: 数字Number、字符串String 、布尔值Boolean、 日期Date 、时间Time 、文本Text等 (2) 其他常见的类型: 地址Address、颜色Color、几何元素Geometrics、 电话号码PhoneNumber、通用商品代码UPC、 社会安全代码Social Security Number、 邮政编码Postal Code 、枚举类型等
Sale (3) 描述型(descriptire) date /total (派生的属性) time (4) 定义型(definiton) (5) 恒定派生型(always derivable) (6) 偶然派生型(occasionlly derivable) (7) 单值属性 (8) 互斥值属性 (9) 多值属性 (10)非简单的数据类型:电话号、人名、安全号、 促销价格(开始、截止日期)、 支付金额有货币单位
2) 属性的特点 可见性 (visibility) 利用可见性控制外部事物对类 中属性的操作方式 +公有的 (public) 能被系统中任何操作查看,修改 #保护的 (protected) 属性仅供自身的类及子类操作 -私有的 (private) 该属性仅在自身类内被使用
项目 人员 程序语言 程序语言 人员 项目 3) 注意 (1) 误把对象当作属性 Store address:Address Store 1 * Address (2) 不要把链上的属性当作属性 (3) 不要把限定词当作属性
Cashier 人员 POST Cashier number name name currentPOST 注意 (4) 一个类的属性,应当对该类的每一个实例都适用 (5) 可用一个属性代替同意下的分散属性 性别 籍贯 (6) 若有一个对象,仅有一个属性,可将该属性移到 有实例关系关联的对象上 (7) 底层对象共有的属性,应放在上层对象中定义, 而底层只定义特有的属性 (8) 使用关联而不使用属性来表达概念之间的联系 Uses 差 好 1 1 1 不是简单属 图 4- 14 用关联表达概念之间的联系 38
销售点模型的属性 Cashier Customer Manager POST Item Sales Lineitem Store Product Catalog address: Address name:Text quantity:Integer Sale Product Specification Payment datd:Data time:Time amount:Quantity description:Textprice:Quantity Upc:UPC 图 4-15销售点终端有属性的概念模型
15 Phone Button itsButtons 4.4.4 对象或类的关联(object or class Association) • 关联是不同对象或类之间有意义的结构化关系。 • 在类图中,关联是一种简单的数据关系。 (用一条把类连接在一起的实线或带箭头的单向实线表示) • 在程序中,关联常常表示拥有对其他对象的引用 的实例变量。 public class Phone { private Button itsButtons[15] } 关联上标注的名称与用来保存 引用变量的名称是一致的。 在Java中,通常用 Vector、List或其 他某种容器类型来 实现多元关联。
0..1 1 0..* 1..* n 0..n 1..n 多重性 (Multiplicity) 多重性:一个类型A的实例在一个特定时间里能够和多少个类型B的实例发生关联 1) 关联描述的属性 导读箭头,表示方向, (经常被省略) 关联的基数 Works for 1 1..* company person employer employer • 关联的元素 关联的角色(role):一个对象上下文含义 拥有 1..* 0..* 人 小汽车 被拥有 图 4-16 关联属性
双向有导航的关联 A B (1) 连接线的几种情况: 不具有导航的关联 C × × D 单向关联,仅由G导航到H G × H 分析 双向(无导航的)关联 E F 设计 单向导航的关联, (I端没决定可否导航) I J 图 4-17 连接线的几种情况
指出可被允许生成的实例(instance)数量。 Records- sale-of 每一行记录一个 单独商品的售销项 Item (2) 多重性(multiplicity): SalesLineItem 0..1 1 Records-sale-of 每一行记录一组 相同商品的售销项 Item SalesLineItem 0..1 1..* Records-sale-of Item SalesLineItem quantity 0..1 1..* 图 4-18 在一个售销项 记录中记录商品项的数量 根据多重性的取值 派生而来的属性
有两种方式对一个现实世界中的角色—尤其是一 个人的角色建模. (3) 角色 1 Employs 1 * Manager Store Manager 1 Employs * Cashier * 图 4-19 作为概念的角色 # 作为概念的角色在增加独特的属性、关联方面提供 了方便性和灵活性。角色作为分离的类来实现更容 易(语言限制,不方便动态地将一个类的实例变异为 另一个类的实例,或随着一个人的角色改变而动态地 增加属性和行为)。
Employs-to- manage manager 1 * Employs-to-handle-sales # 关联中的角色 Store Person cashier * 1 * 1 manager worker Manages 图 4-20 关联中的角色 关联中的角色以一种较精确的方法表达了一个人 相同实例在不同关联中表现为多重(以及动态改变)角 色的概念。一个人,同时或按次序地可能表现为教师、 技师、父亲等角色。
2) 关联的几种情况 (1) 递归关联(Recursive Association) 关联的两端使用同一个类 经理 0..1 管理 职员 公司 1 * 类在关联 中以不同 角色出现 名称 地址 名 称 地址 职 位 工 资 雇主 职员 *工人 public class BinaryTreeNode{ private BinaryTreeNode leftNode; private BinaryTreeNode rightNode; } Binary TreeNode 二元树节点 图 4-21 类的自身关联
每一个订单都有 对应的产品列表 * * order product Line item 0..* {按时间排序} 图 4-23 关联次序 • 关联的几种情况 (2) 关联的导航性 (navigability) 表示对一个类有用的状态信息 * * order product Line item 不可导航,产品未存储订单信息,要搜索产品,才能找到订单。 图 4-22 导航性 (3) 关联次序 (对多关联的多端对象进行排序) 1..* 保险合同 客户
关联的几种情况 (4) 关联的限定符 对限定关联(qualified association)的考虑: 主要是减少限定符远端处的多重性,从多个减少 到1个。分析类图中的限定符只是区分两种不同 类型的事物。 Contains Product Catalog 1 Product Specification 1..* 1 Product Catalog 1 Product Specification UPC 产品代码 图 4-24 增加类的限定符 限定符并没有增加有用的信息,明智的使用,增加对问题的理解。
关联的几种情况 (5) 有约束的关联 1 0..* 保险公司 保险合同 0..* 0..* {OR} 1..* 1..* 图 4-25 有约束的关联 人 公司 保险合同 图 4-26 用继承表示 有约束的关联 人 公司
(7) 含有子集的关联 公司的职员 1 * 公司 职员 { 子集 } 公司的 股东 1 * 图 4-28 有子集的关联 • 关联的几种情况 (6) 依赖关系(dependency relationship) 《UI》 EnrollInseminar seminar 图 4-27 有依赖关系的关联