540 likes | 759 Views
《 软件工程 》. 面向对象的概念 陈巧丽. CH7 面向对象的分析和设计方法 在前面各章节中,我们学习的是传统的软件工程方法 --- 结构化方法学,这部分我们将要介绍一种全新的系统分析设计方法 —— 面向对象方法学 。它是一种实用而强有力的软件开发方法,它产生于 20 世纪 70 年代末 , 直到目前, OO 技术已有广泛的应用。
E N D
《软件工程》 面向对象的概念 陈巧丽
CH7 面向对象的分析和设计方法 在前面各章节中,我们学习的是传统的软件工程方法---结构化方法学,这部分我们将要介绍一种全新的系统分析设计方法——面向对象方法学。它是一种实用而强有力的软件开发方法,它产生于20世纪70年代末,直到目前,OO技术已有广泛的应用。 面向对象技术具有许多特色,一是面向对象方法的唯一性,即面向对象方法是对软件开发过程所有阶段进行综合考虑而得到的唯一有效方法.二是面向对象技术中生存期的一个阶段到下一个阶段的高度连续性,即在一个阶段所用的组成部分与下一个阶段所使用的组成部分是衔接的。三是把面向对象分析(OOA)、面向对象的设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。
面向对象(OO,Object Oriented)可用公式表示为:面向对象= 对象+类+继承+通信 面向对象的基本思想是从现实世界客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,将一个实际问题看成是一个对象或几个对象的集合。 面向对象分析是在系统所要求解的问题中找出对象(具有属性和行为)以及它所属的类,并定义好对象与类; 面向对象设计是把系统所要求解的问题分解为一些对象及对象间传递消息的过程;
面向对象实现是把数据和处理数据的过程结合为一个对象。对象既可以像数据一样被处理,又可以像过程一样被描述处理的流程和细节。面向对象实现是把数据和处理数据的过程结合为一个对象。对象既可以像数据一样被处理,又可以像过程一样被描述处理的流程和细节。 总之,面向对象分析到面向对象设计再到面向对象实现(即OOA→OOD→OOP)之间可以直接进行而不用转换,保持了问题域中事物及其相互关系的本来面貌。[例子和概念后面介绍]。
[参考资料]: 概述 面向对象技术 • 系统中的对象是数据抽象与过程抽象的综合。 • 系统的状态保存在各个对象的数据存储中。 • 控制流包含在各个对象中的操作内。 • 在面向对象体系结构消息从一个对象传送到另一个对象。算法被分布到各种实体中。通过执行消息传递和对象中的操作实现算法的功能。 面向对象开发范型的特点
面向对象的特点 • 抽象性:对象的数据抽象和行为抽象; • 封装性:信息隐蔽; • 共享性: • 同一类中所有实例共享数据结构和行为特征; • 同一应用中所有实例通过继承共享数据结构和行为特征; • 不同应用中所有实例通过复用共享数据结构和行为特征
对象 • 对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组属性和一组对属性进行操作的服务组成。 • 属性一般只能通过执行对象的操作来改变。 • 操作(方法或服务)描述了对象执行的功能,若通过消息传递,还可以为其他对象使用。 • 对象可以是外部实体、信息结构、事件、角色、组织结构、地点或位置、操作规程等。
类 • 把具有相同特征(属性)和行为(操作)的对象归在一起就形成了类(如班级) 。 • 类的定义包括一组数据属性和在数据上的一组合法操作。 • 在一个类中,每个对象都是类的实例(例证) ,它们都可使用类中的函数。 • 类定义了各个实例所共有的结构,使用类的构造函数,可以在创建该类的实例时初始化这个实例的状态。
消息 • 消息是一个实例与另一个实例之间传递的信息,要求该实例执行类中定义的某个操作。 • 消息的使用类似于函数调用,消息中指定了某一个实例,一个操作名和一个参数表 (可能是空的) 。 • 接收消息的实例执行消息中指定的操作,并将形式参数与参数表中相应的值结合起来。
继承 • 如果某几个类之间具有共性的东西 (信息结构和行为),抽取出来放在一个泛化类中,将各个类的特有东西放在特殊类中分别描述,则可建立起特殊类对泛化类的继承。 • 继承是使用已有的类定义做为基础建立新类的定义技术。 • 已有的类可当做基类来引用,则新类相应地可当做派生类来引用。
多态与动态绑定 • 多态性指同名的函数或操作可在不同类型的对象中有各自相应的实现。例如 • 整数“+”:整数加法 • 浮点数“+”:浮点数加法 • 字符串“+”:字符串连接 • 点“+”:两个点的坐标位置分别叠加 • 具有多态的函数或操作在运行时才根据实际的对象类型,执行相应实现程序的连接,此即动态绑定。
Rational统一开发过程 • 最佳软件开发实践 为了以一种更好的、迭代的、可预测的方式开发软件产品,总结了软件开发的最佳实践: • 迭代式软件开发; • 需求管理; • 基于构件的软件体系结构; • 建立软件可视化模型; • 不断验证软件质量; • 控制变更。
Rational统一开发过程 软件开发过程的作用是: • 成为开发组活动顺序的向导。 • 详细说明需要开发哪些制品,何时开发。 • 指导每一个成员及整个开发组的工作。 • 提供监控和度量项目产品和活动所依据的准则。 • 如果没有一个良好定义的过程,开发组将各行其是,开发成功与否完全依赖个别优秀的人才,这不是能够长久的。
Rational统一开发过程(RUP, Rational Unify Process)描述了如何在软件开发组织中严格分配任务和职责的方法。 • RUP 是一个过程产品,"软件过程也是软件。" • RUP 采用二维的过程结构: • 横轴表明过程的生存周期,它反映了过程被激活时的动态情况,用周期、阶段、迭代和里程碑表示。 • 纵轴表明过程的静态状况,通过过程构件、活动、工作流、制品和工作人员描述过程。
阶 段 移交 初始 细化 构造 工作流 业务建模 需求 沿内容轴的组织 分析与设计 实现 测试 实施 配置和变更管理 项目管理 环境 构造#1 细化#2 初始化 细化#1 移交#2 构造#3 移交#1 构造#2 迭代 沿时间轴的组织结构
过程的静态描述:过程模型 过程模型中的主要模型元素有 4 种: • 工作人员:谁做(Who) • 活动:怎么做(How) • 制品:做什么(what) • 工作流:何时做(when) • 过程的中心概念是工作人员,工作人员不是指某一个人,而是指完成工作的角色。工作人员定义人们应履行的行为和职责。
活动定义了工作人员所执行的工作。有 3 类步骤: • 思考步骤 • 执行步骤 • 评审步骤 • 制品是过程生产、修改或使用的一种信息。RUP 的制品分为 5 个信息集。 • 管理集:计划制品、操作制品 • 需求集:构想文档、项目相关人员需求、用例模型和业务模型
设计集:设计模型、软件体系结构描述、测试模型设计集:设计模型、软件体系结构描述、测试模型 • 实现集:源代码和可执行程序、相关数据结构和数据文档 • 实施集:安装资料、用户文档、培训材料 • 工作流用来描述生成结果的活动序列,用以描述工作人员之间的交互。在 RUP 中共有 9 个核心过程工作流,包括 6 个核心工程工作流和 3 个核心支持工作流。
业务建模工作流:描述业务过程的本质和执行情形。业务建模工作流:描述业务过程的本质和执行情形。 • 需求工作流:定义系统构想,使用用例模型和补充规格说明定义系统软件需求,管理系统范围和需求变更。 • 分析和设计工作流:研究实现环境和系统构件的效用,定义软件的组织结构,把需求获取结果转化为实现规格。 • 实现工作流: 建立代码的分层结构,实现类和对象,进行单元测试和系统集成。
测试工作流:根据事先定义的度量和准则检查产品,确认产品是否满足或者超出事先定义并被一致接受的需求。测试工作流:根据事先定义的度量和准则检查产品,确认产品是否满足或者超出事先定义并被一致接受的需求。 • 实施工作流:在实际使用环境中测试软件、包装要交付的软件、发布软件产品、培训最终用户及销售人员。
初始 细化 构造 移交 时间 生存周期 构架里程碑 生存周期 目标里程碑 最初运行 能力里程碑 产品发布 里程碑 • 过程的动态描述:迭代开发 • 将一个大项目分解为可连续应用瀑布模型的几个小部分。在对一部分进行分析、设计、实现并确认后,再对下一部分进行分析、设计、实现和确认。以此进行下去,直到整个项目完成。在 RUP 中,迭代过程分为几个阶段。
初始阶段:确定最终产品的构想及其用例,定义项目范围。初始阶段:确定最终产品的构想及其用例,定义项目范围。 • 细化阶段:计划需完成活动和资源,详细说明产品特性并设计软件体系结构。 • 构造阶段:构造整个产品,逐步完善软件体系结构和计划,直到产品(完整的构想)已完全准备好交付给用户。 • 移交阶段:移交产品给用户,包括制造,交付,培训,支持及维护产品。
V1 I E C T 初始开发周期 V2 I E C T 进化周期 V3 I E C T • 这 4 个阶段构成开发周期,周期结束时产生一代新的软件产品。 • 软件产品产生于初始开发周期,随着重复执行同样的过程,软件发展到下一代产品,这一时期即为软件的进化周期。
Actor use case • Rational统一过程的特点: • 用例驱动的、以体系结构(架构)为中心的、迭代和增量的过程。 • 用例建模技术可以用为大多数项目相关人员理解的形式来表述问题。 • 参与者(Actor) • 用例(Use Case) • 场景(scenario) • 事件流(event flow)
转账 检察账户余额 提款 储户 • 用例和参与者的事例 银行储户通过自动取款机(自动柜员机)提款,转账或检查账户余额。用一组用例表达如下:
用例模型 • 将整个系统或子系统的所有用例,以及与之交互的参与者集合起来构成系统的用例模型。 • 用例模型给出系统预期功能模型和系统上下文环境模型,它成为开发人员和用户之间的契约。 • 用例模型的目的是确保系统能处理所有的功能性需求。
用例驱动的过程 • “用例驱动” 指开发过程是基于用例,从一个工作流向下一个工作流,逐步前进的。 • 开发初期,开发人员使用用例获取用户需求,建立用例模型,描述系统的全部功能。 • 基于用例模型,开发人员创建一系列实现这些用例的分析模型、设计模型和实现模型。 • 测试人员测试实现确保系统正确实现了用例。
以体系结构为中心的过程 • 软件体系结构设计不仅涉及系统的组织结构,而且涉及系统的行为,即在结合点和接口处会有什么事件发生。 • 定义体系结构还要考虑系统的外部上下文环境,即操作环境(涉及最终用户)、开发环境(涉及开发系统的组织)。
面向对象分析( OOA ) • 面向对象分析是软件开发过程中的问题定义阶段,这一阶段最后得到的是对问题领域的清晰、精确的定义。 • 在分析中,需要找到特定对象,基于对象的公共特性组合它们,标识出对这个问题的抽象。 • 在应用中的控制流由两部分构成:每个单独操作内部的控制流,对象之间的消息模式。
语义类的静态视图 属性的静态视图 关系的静态视图 行为的静态视图 通信的动态视图 控制/时序的动态视图 对象 ―关系 模型 CRC 索引 卡片 用例 模型 属性、 对象―行为模型 操作、 协作者 OO 分析模型
面向对象设计( OOD ) • 面向对象设计建立软件系统的结构。 • 设计层次为: • 子系统层:包含每个子系统的表示。 • 类和对象层:包含类层次和每个对象的设计表示。 • 消息层:包含使每个对象能够和其协作者通信的细节,建立系统的外部和内部接口。 • 责任层:包含针对每个对象的所有属性和操作的数据结构和算法的设计。
对象 ―关系 模型 CRC 索引 卡片 责任设计 用例 模型 消息设计 属性、 对象―行为模型 类和对象设计 操作、 子系统设计 协作者 将 OO 分析模型转换到 OO 设计模型 设计模型 分析模型
面向对象设计的主要工作分为两个阶段:高层设计和类设计。面向对象设计的主要工作分为两个阶段:高层设计和类设计。 • 高层设计构造应用软件的总体模型。 • 类设计建立类的规格说明,包括类的实例可执行的操作和它们的数据表示。 • 三个可能的利用现有类的方向: • 现有类的复用 • 从现有类进行演化 • 从废弃型进行开发
面向对象分析与设计的建模 • 软件开发需要把问题解决模型化。 • 模型化是理解一个复杂系统的工具; • 模型是系统早期抽象的重要结构; • 常用的面向对象分析与设计模型 • Rumbaugh 等人的 OMT 模型 • Coad 和 Yourdon 的模型 • Booch 开发模型 • UML 统一建模语言
对象模型 功能模型 动态模型 Rumbaugh的对象模型化技术OMT(object modeling technique) • 对象模型化技术的三类模型:对象模型、动态模型和功能模型。 • 这个模型化的过程是一个迭代过程通过不断更新、细化,直到切合系统真正需求为止。。
1. 对象模型 • 是三个模型中最关键的一个模型,它的作用是描述系统的静态结构,包括构成系统的类和对象,它们的属性和操作,及它们之间的关系。 • 在OMT中,类与类之间的关系叫做关联。关联代表一组存在于两个或多个对象之间的,具有相同结构和含义的具体连接。关联可以是物理的,也可以是逻辑的。
类 类的实例 类定义示例 类名 自动售货机 (类名) 属性值 饮料编号 价格 属性 操作 投入货币 送出饮料 显示金额 按下按钮 按退币杆 显示售完
1+ (0个或1个) (1个或多个) 12,4 (0个或多个) (1~2个或4个) • 聚合,代表整体与部分的关系,这是一种特殊形式的关联。 • 菱形框 表示整体侧对象 • 限定,用以对关联的含义做某种约束。 • 角色,用来说明关联的一端。由于多数关联具有两个端点,因而涉及到两个角色。 • 附加的说明对象之间的连接连接属性。
整体 部分 段落 句子 文件 目录 类A 类B 文件名 限定词 个人 名字 公司 名字 类B 类A 雇主 雇员 角色 角色 工作 职务 工资 聚合 限定
雇员 年初至今收入 计算月工资 基类 派生类A 派生类A 正式雇员 年工资额 计算月工资 临时雇员 小时工资额 计算月工资 泛化关联
金额计算器 自动售货机 存量计算器 金额 饮料编号 价格 饮料编号 存量 属于 属于 累加 找零 重置 投入硬币 送出饮料 显示金额 按下按钮 按退币杆 显示售空 递减 显示售空 重置 退币杆 退币杆状态 属于 选择按钮 属于 按退币杆 按钮状态 购买 顾客 按钮灯亮 按钮灯灭 售空灯亮 按下按钮 姓名 硬币 顾客按 下按钮 顾客按 退币杆 投入硬币 取出饮料
状态A / 操作 状态A 活动 状态B 活动 起始状态 终结状态 事件B [条件] 2. 动态模型 • 动态模型着重于系统的控制逻辑,它包括两个图,一是状态图,一是事件追踪图。 状态图 • 状态图是一个状态和事件的网络,侧重于描述每一类对象的动态行为。
投入硬币 (有效的) 投入硬币 规定金额 金额不足 再投币 显示售 货机就 绪,所 有灯灭 显示总 额已够 饮料选 择灯亮 取出饮料 结算找零 扣减存量 完成交易 显示 金额 总数 饮料 售空 灯亮 按下 饮料 选择 按钮 无效硬币 取消 回到就绪状态 取消 回到就绪状态
事件追踪图 • 事件追踪图侧重于说明发生于系统执行过程中的一个特定“场景”。 • 场景也叫做脚本,是完成系统某个功能的一个事件序列。 • 场景通常起始于一个系统外部的输入事件,结束于一个系统外部的输出事件,它可以包括发生在这个期间的系统所有的内部事件。
顾客 售货机 金额计算器 选择按钮 存量计算器 售空灯 投入硬币 累加 总额 显示总额 金额足够 灯亮 选择按钮 按下按钮 送出饮料 结算 余额 找零 扣减存量 存量为零 灯亮
输入:投币、按选 择按钮、取消交易 自动 售 货机 顾客 售空灯亮 输出饮料 显示投 币金额 选择按 钮灯亮 投币金额 显示屏 选择按 钮灯 售空灯 3. 功能模型 • 功能模型由数据流图组成,指明从外部输入到外部输出,数据在系统中传递和变换的情况。 顶层数据流图
顾客 投入 硬币 按下选 择按钮 饮料按 钮灯亮 判断何 种饮料 计算 扣减存量 找零 判断 存量为 零否 顾客 饮料编号 存量为零 存量非零 售空 灯亮 送出饮料 找零 数据流图
Coad 与 Yourdon 的分析与设计 1. 面向对象分析的概念模型 • 通过面向对象分析建立的系统模型是以概念为中心的,因此称为概念模型。 • 这样的模型由一组相关的类组成。 • 构造和评审面向对象分析概念模型的顺序和由五个层次组成,即类与对象、属性、服务、结构和主题。
类边界 类与对 象层 实例边界 实例连接 属性层 属性 服务层 消息 服务 结构层 主题层 主题