第 6 章 面向对象的软件开发技术
第4章结构化分析设计方法内容回顾 需求分析的任务,步骤 结构化的分析方法 结构设计的任务 结构化设计的概念和原理 软件结构化设计方法 数据流图,数据字典,加工说明 结构设计的任务 结构化设计的概念和原理 模块化设计原理(软件工程设计原理,抽象和分解,信息隐藏和局部化) 模块独立性(耦合,内聚) 软件结构化设计方法 软件结构图 软件的两种典型结构(变换型,事物型) 结构化设计过程
面向对象方法的产生 传统的以瀑布模型为基础的软件生命周期方法学给软件产业带来了巨大的进步,部分地缓解了“软件危机”。 但这种方法学仍然存在比较明显地缺点,不能胜任所有的软件开发任务。 因此,人们在软件开发的时间中逐渐创造出新的软件开发方法——面向对象方法学。
传统的瀑布型软件存在的问题 (1)客观世界的描述——自然语言与计算机对客观世界的描述——程序设计语言存在语义断层。 问题域 自然语言 编程语言 断层 自然语言 问题域 需求分析 总体设计 详细设计 编 码 机器语言 汇编语言 高级语言 计算机 客观世界 自然语言
语义断层举例 SADT方法举例——家庭安全系统(SafeHome) 用户可通过控制面板对SafeHome进行编程和配置: 电话线 警铃 控制面板 显示 传感器 3 激活/不激活 系统 1 与用户交互 5 显示信息 和状态 4 密码处理 6 监控传感器 2 配置系统 用户数据和命令 配置请求 密码 开始 停止 配置数据 信息 检验id信息 传感器状态 警告类型 电话号码拨音 配置信息 用户交互 控制 读取用户 命令 密码处理 激活 系统配置 启动用户 命令处理 读取系统 数据 创建配置 文件 读取密码 比较处理 密码 密码输出 产生 非法消息 显示消息 与状态
传统的瀑布型软件存在的问题(续1) (2)对需求不稳定的系统很难实现。
? 传统的瀑布型软件存在的问题(续2) (3)软件的重用问题。 再编写一个银行ATM自助提款机的程序 自助提款机也需要控制面板,也需要密码处理程序 思考:刚才编写的控制面板相关的程序能否移植到新系统中?? 用户交互 控制 读取用户 命令 密码处理 激活 系统配置 启动用户 命令处理 读取系统 数据 创建配置 文件 读取密码 比较处理 密码 密码输出 产生 非法消息 显示消息 与状态 ?
面向对象方法的产生和发展 面向对象(Object Oriented)的思想最初来源于抽象数据类型(ADT),后来在程序设计语言中引入。 最早引入面向对象思想概念的语言是60年代末的Simula67仿真语言。使用了 “对象”的概念,但并没有得到推广。 70年代的Smalltalk语言是面向对象的主要里程碑,它完整地体现了面向对象语言的特点。推动了“面向对象”的发展。这是一种全新的语言。 我们熟悉的C++和Java都是面向对象语言。
面向对象方法的发展(续) 面向对象的概念和程序设计方法很快受到重视。80年代中期以后,逐渐形成了面向对象分析(OOA)、面向对象设计(OOD)以及面向对象实现(OOP)一整套面向对象方法。 到了90年代,面向对象技术开始变得广泛使用,并且成为软件分析与设计的主流方法。随着时间的流逝,面向对象技术正在替代传统的软件开发方法。
对象技术的发展图示 Simula基本思想 C++ 商业化 UML Smalltalk实用化 Java UML2.0 1967 1980s 1997 1972 1991 2005 Smalltalk实用化 Java UML2.0
为什么要学习面向对象和UML 对于今天的软件开发者来说,UML是他们的面包和黄油 UML+对象技术 软件工程师的“饭碗” OOAD 需要理由吗? 我们从事软件行业 面向对象是最主流的软件开发思想 UML是最主流的建模方法 对于今天的软件开发者来说,UML是他们的面包和黄油 UML+对象技术 软件工程师的“饭碗” OOAD
本章主要内容 5.1从结构化到面向对象 5.2 什么是面向对象 5.3 面向对象相关的基本概念 5.4 面向对象的开发模型 5.5 UML基础
素数问题 素数的定义: 除了1与本身之外,不能被其他正整数整除的数,叫作素数,也叫质数 按照习惯规定,1 不算素数,最小的素数是 2,其余的是 3、5、7、11、13、17、19……等等 由定义判断素数 对于数 n ,从i=2,3,4,5…到 n-1 判断 n 能否被 i 整除,如果全部不能整除,则 n 是素数,只要有一个能除尽,则 n 不是素数,为了压缩循环次数,可将判断范围从 2 ~ n-1 改为 2 ~ sqrt(n)
筛选法求素数 筛选法:生成 2< i <n 的素数序列,设n=50 筛掉2的倍数:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 … 筛掉3的倍数:2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 … 筛掉5的倍数:2 3 5 7 11 13 17 19 23 25 29 31 35 37 41 … 筛掉7的倍数:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 49 留下素数序列:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
思考? 用结构化思维解决上述问题 用对象思维解决上述问题 将解决思路用合适的方式记录下来 思考: 结构化的思维与对象化的思维有什么本质的不同?体现了怎样的思维差异?面向对象思想有何优势? 如何表达设计思想:代码?图形?
结构化设计
结构化实现 //PrimerNumber.c main(){ int *sieve,n; int iCounter=2, iMax, i; printf("Please input max number:"); scanf("%d", &n); sieve=malloc((n+1)*sizeof(int)) for(i=1;i<=n;i++) { sieve[i]=i; } iMax = sqrt(n); while (iCounter<=iMax) { for (i=2*iCounter; i<=n; i+=iCounter) sieve[i] = 0; iCounter++; } for(i=1; i<=n; i++) if sieve[i]!=0 printf("%d ",sieve[i]); }
结构化小结 通过流程图(结构化建模)可以更清楚表达设计思想 针对过程的抽象 过程(函数)是系统的核心,通过过程实现系统功能 数据是静态的,由过程来控制对数据的访问
Java实现-是对象思维吗? import java.lang.Math; public class PrimerNumber{ public static void main(String args[]) { int n=50; int sieve[]=new int[n+1]; int iCounter=2, iMax, i; for(i=1;i<=n;i++) {sieve[i]=i;} iMax=(int)Math.sqrt(n); while(iCounter<=iMax){ for (i=2*iCounter; i<=n; i+=iCounter) sieve[i]=0; iCounter++; } for(i=1; i<=n; i++) if (sieve[i]!=0) System.out.println(sieve[i]);
用对象思维解决问题? 筛选法:生成 2< i <n 的整数序列,设n=50 筛子:存储源数据 过滤器(筛子眼):表明当前过滤因子 筛掉2的倍数:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 … 筛掉3的倍数:2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 … 筛掉5的倍数:2 3 5 7 11 13 17 19 23 25 29 31 35 37 41 … 筛子:存储源数据 筛掉7的倍数:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 49 过滤器(筛子眼):表明当前过滤因子 留下素数序列:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
这才是对象思维! 关联关系
面向对象的编程—过滤器(筛子眼) Java语法 class Hole{ int value; public Hole(int i){value=i;} public int adjust(){return value++;} } Java语法
面向对象的编程-筛子 class Sieve{ int[] sieve; public Sieve(int n){ int i; sieve=new int[n+1]; for(i=1;i<=n;i++) {sieve[i]=i;} } public void toSieve(Hole h){ int i,hole; while((hole=h.adjust())<sieve.length){ for (i = 2 * hole; i < sieve.length; i += hole) sieve[i] = 0; public void displayPrimeNumber(){ for(i=1;i<sieve.length;i++) if(sieve[i]!=0) System.out.println(sieve[i]);
验证设计方案 代码含义一目了然 具体细节被封装 public static void main(String[] args) { Hole ho=new Hole(2); Sieve s=new Sieve(50); s.toSieve(ho); s.displayPrimeNumber(); } 代码含义一目了然 具体细节被封装
面向对象方法小结 通过UML类图(面向对象建模)可以更清楚表达设计思想,并为代码实现提供框架 针对数据的抽象:类 类拥有自己的数据和行为 过程是类的组成部分,为类提供行为 类的对象之间的协作完成系统功能
对象技术的思考 对象思维具有更大的灵活性,更好的模块化,可以进行更大规模的设计 面向对象设计和开发的难度更大,面临着对象的识别、职责分配等一系列问题 学习更多知识和技术,并掌握一系列面向对象的设计原则和模式 图形化工具(UML)有助于表达和交流设计思想,并简化实现的过程
总结:结构化VS面向对象 结构化思维用函数刻画数据间关系 面向对象思维直接用类表达数据间关系 结构化中,数据是死的,全部依赖算法操作 面向对象中,数据是活的,“她”知道自己的信息(属性),并能完成自己的工作(操作) 结构化思维更像是一个人在解决所有问题 面向对象思维更像是一个团队的分工协作
面向对象 VS 结构化-1 扬弃,不是否定
面向对象 VS 结构化-2 (程序)实现角度 数据结构+算法=程序设计 以对象为中心组织数据与操作 数据 对象属性 操作 对象的服务 类型与变量 类与对象实例 函数(过程)调用 消息传递 类型与子类型 一般类与特殊类,继承 构造类型 整体-部分结构,聚合 指针 关联
面向对象 VS 结构化-3 结构化方法(SA+SD+SP) 面向对象的方法 问 题 域 问 题 域 自然语言 自然语言 数据流图 数据字典 结构化分析 OO方法 需求工程 需求模型 分析与设计的鸿沟 OO建模语言 结构化设计 OOA&D 模块和过程 对象模型 编程语言 OO编程语言 结构化编程,如C语言 OOP,如Java语言 测 试 测 试 计 算 机 系 统 计 算 机 系 统
面向对象 VS 结构化-4 传统结构化方法 面向对象方法(UML建模工具为例) 输入I、处理P、输出O的视角, 需求模型 输入I、处理P、输出O的视角, 面向功能的文档(用户需求规格说明书)需求变化,其功能变化,所以系统的基础不稳固 从用户和整体角度出发 使用系统抽象出用例图、活动图,获取需求;如需求变化,对象的性质相对功能稳定,系统基础稳定 分析模型 面向过程的数据流图DFD、 实体—关系图ERD、数据字典DD表示分析模型 功能分解,数据和功能/过程分开 把问题作为一组相互作用的实体,显式表示实体间的关系 数据模型和功能模型一致 类、对象图表示分析模型,状态、顺序、协作、活动图细化说明 设计模型 功能模块(SC图),模块之间的连接/调用是模块的附属形式 类和对象实现, 类/对象的关联、聚集、继承等连接、连接规范和约束作为显式定义 实施模型 体系结构设计 构件图,配置图 测试模型 根据文档进行单元测试,集成测试,确认测试 单元测试采用类图,集成测试用实现图和交互图,确认测试采用用例图
例:选课系统 用户需求: 某学校欲开发一个学生选课系统。业务活动描述如下,学生能够登录系统查看课程情况并进行选课,系统能够记录考生选课结果,任课老师能够查看选课情况,管理员能够对课程信息进行维护和管理,选课结束后,管理员能够打印选课名单。 要求: 对系统进行建模。
结构化方法
面向对象方法
本章主要内容 5.1 从结构化到面向对象 5.2 什么是面向对象 5.3 面向对象相关的基本概念 5.4 面向对象的开发模型 5.5 UML基础
面向对象技术 是一种看待计算机软件系统的观点 是一种系统分析和设计的思想 是一种编程方法 是一组设计原则和模式 是实践者的日常工作 是吹鼓手、骗子和市场人员口中的“万灵丹”
面向对象的概念 什么是面向对象?面向对象就是运用对象、类、继承、消息、结构与连接等面向对象的概念对问题进行分析、求解的系统开发技术,或者说,是以对象(类)为数据中心,对象之间的动态行为模式为运行机制的一种问题求解方法。 用公式可表示为: 面向对象=对象+类+继承+消息+结构与连接 如果一个软件系统是使用这几类概念设计和实现的,则认为这个软件系统是面向对象的。一个面向对象的程序的每一成分应是对象,计算是通过新的对象的建立和对象之间的信息通信来执行的。
对象技术Object Technology A set of principles (abstraction, encapsulation, polymorphism, ..) guiding software construction, together with languages, databases, and other tools that support those principles. (Object Technology - A Manager’s Guide, Taylor,1997.)
对象技术利益-1 在计算机中模拟现实世界的事和物 沟通 顺应人类思维习惯,让软件开发人员在解空间中直接模拟问题空间中的对象及其行为 AHare.Run; ALion.Catch(AHare); ALion.Kill(AHare); AHare.Dead; ALion.Eat; ALion.Happy; PUSH EBX MOV EBX,EDX MOV EDX,EAX SHR EDX,16 DIV BX 在计算机中模拟现实世界的事和物
实例:“东北一家人” 东北人都是活雷锋 人、东北人、雷锋 老张开车去东北…… 撞啦! 老张、汽车、开车 撞啦
面向对象的表示 class Car{ DriveTo(Region) throws Exception (撞车){} class 人 { 人 Driver; } Main Program { 人 老张; Car 夏利; 夏利.Driver = 老张; try { 夏利.DriveTo(东北); } catch (Exception) { } class 人 { Region 籍贯; } class Region { } interface 雷锋 { helpPeople(){ } class 东北人 extends 人 implements 雷锋 { 籍贯 = 东北;
对象技术利益-2 用较稳定把不稳定的包起来 稳定 功能:最易变 数据:较易变 对象:较稳定 较小的需求变化不会导致系统结构大的改变 当需求变化时…… 功能:最易变 数据:较易变 对象:较稳定 稳定性增加 用较稳定把不稳定的包起来
对象技术利益-3 软件开发组越大,组中每个成员的生产率就越低 构造大型软件不能靠堆人 复用 代码重用:类库、框架等重用机制 能提高质量,减少由于编制新的系统代码而产生的成本 通过继承、关联、封装等手段 公式 软件开发组越大,组中每个成员的生产率就越低 --Philippe Kahn, Borland公司创始人 构造大型软件不能靠堆人
本章主要内容 5.1 从结构化到面向对象 5.2 什么是面向对象 5.3 面向对象相关的基本概念 5.4 面向对象的开发模型 5.5 UML基础
5.3 面向对象相关的基本概念 面向对象的概念和术语有很多,但仅有下列是最基本的: 对象 类 封装 继承 消息 多态性 结构与连接
1. 对象 客观世界中存在各种实体,实体可以是物理的也可以是概念性的。 Physical entity,如:一台机器、一辆汽车、一个人(可触及的) Conceptual entity,一个合同、一项计划、一项政策、法律、一个化学反应过程(可感知的) Software entity 化学过程 链表
对象的定义 对象——是各种客观实体的抽象,是由一组属性和对这组属性进行操作的一组服务结合在一起所构成的独立实体。它构成了系统的基本单位。 属性——用来描述对象静态特征的数据项。所有属性值的集合称为对象的状态。 服务——用来描述对象动态特性(行为)的一个操作序列。
对象的特征 无论对象是有形的还是抽象的,是简单的还是复杂的,都有如下特征: 具有一个状态,这个状态由与其相关的属性值的集合所表征。如某人:年龄、性别。 具体唯一的标识,可以区别于其他对象。 有一组操作方法,每个操作决定对象的一种服务。 对象的状态只能被自身的操作所改变——封闭性 对象之间以“消息”的方式进行通讯。
Representing Objects in the UML An object is represented as a rectangle with an underlined name. Named Object Anonymous Object
对象的例子:一个人 属性 操作 属于自身所承受的操作 属于施加于其它对象的操作 例如有一个人名叫小明,性别男,身高1.80m,体重68kg,可以修电器,可以教计算机课,下面我们来描述这个对象。 小明 性别:男 身高:1.80m 体重:68kg 回答性别 回答身高 回答体重 修理电器 教计算机课 属性 操作 对象 属于自身所承受的操作 属于施加于其它对象的操作
对象相关的其它概念 永久对象:一个对象的生命周期超过了软件的执行周期,这个对象称为永久对象。永久对象可用于支持系统的复用。 被动对象:对象所提供的服务,若全部都必须受消息(或事件)的驱动才能调用,这样的对象称为被动对象。绝大多数对象属于被动对象。 主动对象:若对象服务中至少有一项服务,它不需要接受消息就能主动执行。
2. 类 类是一组具有相同数据结构和相同操作的对象的集合。 类的定义包括一组数据属性和在数据上的一组合法操作。 实例:类中的每个对象都称为该类的一个实例。 对象的数量和种类很多,但它们之间却存在着某种共性的东西。我们把共性的东西抽象出来定义成类。在一个类中,每个对象都是类的实例,它们都可使用类中提供的函数。 类与对象的关系,就如同程序设计语言中类型与该类型的变量的关系一样。
Sample-A Class Class Employee Properties Behavior Name Hire Address Position Salary Start Date End Date Behavior Hire Fire Promote Increase Salary Retire
Representing Classes in the UML A class is represented using a rectangle with compartments. 属性 操作
例:人类 人 性别 身高 体重 吃饭 睡觉 呼吸 属性 操作 类
类和对象的关系 每一个对象都是某一个类的实例 每一个类在某一时刻都有零个或更多的实体 类是静态的;它们的存在、语义和关系在执行前就已经定义好了 对象是动态的;它们在程序执行时可以被创建和删除
3. 封装 封装是一种数据组织的方式。在面向对象的概念中,封装是一条重要的原则,其含义是为了实现信息隐藏而把对象的全部属性和服务的实现过程结合成一个独立的实体(对象),即:尽量隐藏对象的内部细节。 封装的特点: 有一个清楚的边界,封装的基本单位是对象。 有一个接口。这个接口描述该对象与其他对象的相互作用。 受保护的内部的实现。对象的外部不能直接存取对象的属性。
例:电视机、银行ATM机等都体现封装性。 操作1 2 3 状态 S 操作1、2、3的实现 用户可以通过显示屏收看电视节目,通过遥控器改变频道,调节音量大小,开关电视等。 除此之外,用户无法了解电视机内部的结构和服务的实现过程。
封装的例子:电视机TV 被封装的行为和状态 变更频道 开请求 Change Channel Turn On Internal State 调节声音 Turn On Turn Off Change Channel Adjust Volume Others... 被封装的行为和状态 关请求
为什么要封装 在软件世界中,封装有助于减少某些不确定因素的影响。在一个包含对象的系统中,对象之间以各种方式相互依赖。如果其中一个对象出现故障,软件工程师不得不修改它的时候,对其他对象隐藏这个对象的操作意味着只需修改这个对象而不需要改变其他对象。 封装有助于保持数据一致性。
为什么要封装 算法 结构化程序设计:程序 = 算法 + 数据结构 算法 全局数据 算法 算法 如何保证数据的一致性?
范例:数据一致性 操作这个数据结构的程序员,必须严格遵守一系列业务逻辑规则,否则很容易破坏数据的一致性 城市代码 例如:北京为01 上海为02 struct ShippingAddress { long cityCode; String address; } 邮政地址 “北京朝阳区静安里6号” class ShippingAddress { private long cityCode; private string address; public long ModifyAddress(String address) } 操作这个数据结构的程序员,必须严格遵守一系列业务逻辑规则,否则很容易破坏数据的一致性 结构化程序设计处理大项目时,多人协同开发时,本质上无法保证数据的一致性
封装:可见性问题 Visibility-可见性 层次 作用域(类/方法),默认作用域 friend 友元 public: + protected: # private: - 作用域(类/方法),默认作用域 friend 友元
4. 继承Generalization 继承是使用已存在的定义做为基础建立新定义的技术。 新类的定义可以是既存类所声明的数据和新类所增加的声明的组合。新类复用既存类的定义,而不要求修改既存类。即:在已定义类(称为父类)的基础上,创建一个新类,新类除了定义自己新的属性和服务以外,它还从父类继承了其全部属性和服务。 既存类可当做基类(父类)来引用,则新类相应地可当做派生类(子类)来引用。 只有一个父类 --单继承 有多个父类 --多继承
继承的例子 各种家用电器继承了Appliance类的属性和操作。 每种家用电器都是Appliance类的子类。Appliance类是各个子类的超类
继承的例子 使用继承设计一个新类,可以视为描述一个新的对象集,它是既存类所描述对象集的子集合。 这个新的子集合可以认为是既存类的一个特殊化。Quadrilateral类是Polygon类的特殊化。Quadrilateral是限制为四条边的多边形。我们还可以进一步地把类Quadrilateral特殊化为Rectangle 。
单一继承 One class inherits from another
Use multiple inheritance only when needed and always with caution! 多重继承 A class can inherit from several other classes Use multiple inheritance only when needed and always with caution!
5. 消息 消息是系统运行过程中对象之间相互传递的请求服务的信息。一个对象可以同时向多个对象发送消息。也可以接受多个对象发来的消息。 消息实际上就是一段数据结构,应包含如下信息: 接受消息的对象标识。 请求的服务名称。 输入参数和应答信号 发送一个消息实际上就是一个函数调用。 发送者:发出信息的对象 接收者:接收信息的对象 消息是对象之间互相通信的唯一合法的动态联系途径。
消息传递示意图
消息传递举例 向Sieve类的对象s 发送消息toSeive() public static void main(String[] args) { Hole ho=new Hole(2); Sieve s=new Sieve(50); s.toSieve(ho); s.displayPrimeNumber(); } 向Sieve类的对象s 发送消息toSeive()
6. 多态性 对象的多态性是面向对象技术中的一种高级特性,它允许对象的一个属性或服务,在接到不同的消息时会采取不同的行为方式。其思想类似于将对象的属性和服务抽象为一个拥有形参的函数,在不同类的对象中再赋予实参,完成不同的处理。 多态性的实现,需要实现工具提供重载、动态绑定等技术手段。 C++语言中的重载、虚函数和抽象类的概念都是多态性的体现。
一个重载的例子(C++) Class number{ int i; float x; char *sl; public: int max(int a){return a>i?a:i;} float max(float b){return b>x?b:x;} char *max(char *c) {return strcmp(c,s1)>0?c:s1;} } 这里重载了三个函数,均为max,它们的功能为将函数的参数分别与类中的各私有数据比较大小。函数名相同,只是参数和返回值不同。
范例:多态 class abstract Shape { public abstract void draw(); } class Rectangle extends Shape { // 覆盖(override)基类方法 public void draw() { ... /* 绘制矩形 */ } class Circle extends Shape { // 覆盖(override)基类方法 public void draw() { … /* 绘制圆形 */ }
应用多态性 假设我们有一个数组sharr,里面放着一排Shape,但是不知道哪些是Rectangle,哪些是Circle。利用多态性,我们可以: for (int i = 0; i < sharr.length; ++i) { Shape shape = (Shape)sharr[i]; shape.draw(); } 遍历整个数组的过程中,各个Shape自己知道应当如何在画布上绘制自己。shape.draw()这同一行代码在shape指向不同的对象时表现出不同的行为,这就是所谓多态性
7. 结构与连接 面向对象系统中的对象不是孤立的实体,在一个实际的问题中,对象与对象之间可能存在着多种类型的关系: 关联 泛化关系 聚集关系
关联 当类之间在概念上有连接关系时,类之间的连接叫做关联。 对象之间的关联关系可以通过对象中的属性来表达。如司机与汽车这两个对象之间可通过司机对象中的“可驾驶的汽车类型”与汽车对象建立联系。
关联关系图示 教师与他指导的学生之间的关联关系 连线上的数字或数字区间表示关联对象的个数,如(1-1),(1-m)、(m-n)当阶为1时可以省略,1+表示多个。
关联属性 复杂的关联可以拥有自己的属性,称为链属性。例如,计算机中的文件与文件的用户之间,存在着多对多的关系。但是,每个用户对不同文件拥有不同的访问权限,访问权限就是文件用用户之间的关联属性。 拥有
对象类之间的泛化关系 泛化关系是对象之间,因继承而组成的分类层次结构,又称为对象的分类结构。泛化关系体现一般与特殊的关系。 基类(一般类)描述了对象的一般属性,而派生类则描述了对象的特殊属性。派生类对象继承了在基类中定义的全部属性和服务。 下图是表示分类关系的图形符号。图中上部是一个基类,下面是若干个具体的派生类。
泛化关系的图示
对象之间的聚集关系 一个对象是另一个对象的组成部分,并且对象间不存在有传递性继承关系,对象间的这种关系称为聚集关系。如飞机是由机头、机身和机翼组成。 聚集关系体现的时整体与部分的关系。 下图是表示组成关系的图形符号。图中上方是一个整体对象,下方是构成该整体对象的若干个部分对象,它们之间用箭头指向标记连接,箭头方向表示组成关系的方向。
聚集关系图示
本章主要内容 5.1 从结构化到面向对象 5.2 什么是面向对象 5.3 面向对象相关的基本概念 5.4 面向对象的开发模型 5.5 UML基础
5.4 .1面向对象的开发过程模型 软件工程的一条重要原则就是,将软件开发的过程划分为若干个不同阶段组成的生存周期。每一个阶段都规定了自己的目标与任务,这就为软件开发的过程管理及阶段复审以及质量控制提供了技术上的保证。 面向对象作为软件开发的一种方法,它依然遵循软件工程的这条原则。
面向对象方法的过程模型
面向对象方法的过程模型的说明 OO的开发过程沿演化的螺旋向前,从客户通信起步,在这里问题域被定义,而且基本的问题类被标识。 和OO软件工程关联的技术工作遵循在阴影方框中显示的迭代路径,OO软件支持复用,因此,类在其被构造之前,被在库中查找,当在库中没有找到时,软件工程师应用面向对象分析,面向对象设计,面向对象程序设计和面向对象测试来创建类及从类导出的对象,新的类随后被放入库中,使得可以在将来被复用。
RUP——Rational统一过程
对比瀑布模型 瀑布模型把软件生存周期划分为计划、开发、运行维护三个时期,每个时期又划分为若干阶段。 只有前一阶段的工作完成后,后一阶段的工作才能开始,前阶段的输出文档即为后一阶段的输入文档。 运行时期 开发 时期 计划 运行/维护 测试 编码 详细设计 问题定义 可行性论证 及软件计划 需求分析 结构设计
面向对象的开发模型的特点 不同阶段之间的非线性性。 把问题的概念直接映射到对象及对象之间的接口,符合人的通常的思维方式。减少了结构化方法从问题域到分析阶段的映射误差。 面向对象方法从分析到设计直至编码采用一致的模型表示,消除了结构化方法从数据流图到模块结构图映射误差。 以客观世界的实体映射为软件的系统。这种结构是相对稳定的。“封装性”带来的易扩充、易修改和易维护。 面向对象的“封装性”和“继承性”支持软件的可复用。
5.4.2 面向对象方法 由于面向对象技术的流行,20世纪80年代后期到进入90年代,产生了很多的面向对象的方法。其中广泛使用的方法有: Rambaugh方法。也称为对象建模技术(Object Modeling Technique,OMT),这个方法可用于分析、系统设计和对象级的设计和实现。 OMT是一种比较完整和有效的面向对象分析与设计方法,也是教材重点介绍的方法。
5.4.2 面向对象方法(续) Coad和Yourdon方法。也称为面向对象的分析与设计方法(OOAD),这种方法被视为最容易学习的OOA方法之一。建模符号相当简单,其开发分析模型的指导原则是直接的。 Booch方法。Booch方法包含“微开发过程”和“宏开发过程”两个过程,微级别定义了一组分析任务,它们在宏过程中的每个步骤被反复使用,因此演化方法得以维持。
5.4.2 面向对象方法(续) Jocobson方法。也称为面向对象软件工程(OOSE),该方法与其它方法的不同点是特别强调use-case——描述用户和产品或系统间如何交互的场景。 Wirfs-Brock方法。这种方法并没有明确区分分析和设计任务,而是从客户规约的估价开始到设计完成结束的一个连续过程。
统一的面向对象方法 在过去的10年中,Grady Booch、James Rumbaugh和Ivar Jacobson一起协作,将他们各自的面向对象分析和设计方法的最好的特性组合成为一种统一方法,其结果称为统一建模语言(Unified Modeling Language,UML),已经在整个业界广为使用。
UML的统一 Grady Booch (Booch) Dr. Ivar Jacobson (OOSE) Dr. James Rumbaugh (OMT) “3 amigos”
References-1 UML Distilled Martin Flower UML最佳入门书籍
其人其事:Martin Flower Martin Fowler:英国口音的软件工程 “统一建模语言(UML)的发明者Grady Booch本人,都不一定比Martin Fowler更会用UML” 官方文献和经典著作: 一方面是严谨、准确,但又高度抽象化甚至形式化 一方面则是生动、直观,不求面面俱到,但能让人很快就对概念大厦的全貌一目了然 从1986年在故乡英国拿到电子工程学位,到参与开发建模软件Ptech,再到成为独立开发顾问,参与国家保健服务系统的开发,再到移居美国,加入著名的克莱斯勒C3项目,到成为软件顾问公司ThoughtWorks的首席科学家 I‘m the only person here, I’ve never heard of…
References2-1 Applying UML and Patterns - An Introduction to Object-Oriented Analysis and Design UML和模式应用-面向对象分析与设计导论 THE BEST Object Orientated Analysis and Design tutorial book (Amazon.com) 在 OOA/D、迭代式开发和 UML 方面是全球最畅销的书籍之一,已被翻译成多种语言并在业界和院校中被广泛使用
References2-2 “People often ask me which is the best book to introduce them to the world of OO design. Ever since I came across it, Applying UML and Patterns has been my unreserved choice.” --Martin Flower, author, UML Distilled and Refactoring Craig Larman
References2-3
References-3 The Unified Modeling Language User Guide(UML用户指南) The Unified Modeling Language Reference Manual(UML参考手册) Grady Booch James Rumbaugh Ivar Jacobson
References-4 Enterprise Java with UML 介绍各种UML软件模型,加深对面向对象分析与设计的理解 结合Java语言,灵活使用UML 通过案例,贯穿全书: 从用户需求到最终实现 从各种UML模型到Java代码实现
References-5 Design Patterns: Elements of Reuseable Object-Oriented Software GoF (Gang of Four): Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 长盛不衰的经典、23种设计模式 李维:不会用设计模式的程序员是低层次的软件人才,他们只会写code罢了 Agile Software Development - Principles, Patterns, and Practices Robert C. Martin 面向对象原则、模式与敏捷软件开发方法结合
References-6 Web Resources http://www.rational.com/uml/index.jsp http://www.omg.org/uml/ http://www.sei.cmu.edu/ http://martinfowler.com/ http://www.umlchina.com/ http://www.uml.org.cn/ http://www.csai.cn http://www.sawin. cn/ http://www.csdn.net
本章主要内容 5.1 从结构化到面向对象 5.2 什么是面向对象 5.3 面向对象相关的基本概念 5.4 面向对象的开发模型 5.5 UML基础