第六章面向对象的软件工程 一、复习要求 1.了解面向对象的概念,包括什么是范型,面向对象的概念,对象和对象的分类等。 2.了解用面向对象方法构造软件的开发过程,包括应用生存期和类生存期的概念 3.了解面向对象分析方法,包括论域分析,应用分析的介绍 4.了解面向对象设计方法,包括高层设计模型和设计原则,类设计的目标和方针,复用 设计及类设计的方法。 5.了解有影响的coad方法、 Booch方法和OMT方法的基本思想。 二、内容提要 面向对象技术是一个非常实用而强有力的软件开发方法。它的特征是: 方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。 从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前 阶段成果的补充和修改 把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存 期的相应阶段 1.面向对象的概念 (1)范型 范型( (Paradigm)又称为范例、风范或模式( Pattern)。从软件开发角度来看,范型与问题 解决技术有关。范型定义了特定的问题和应用的开发过程中将要遵循的步骤,确定将用于表 示问题和它的解决的那些成分的类型,并利用这些成分表示与问题解决有关的抽象,直接得 到问题的结构。因此,范型的选择影响整个软件开发生存期。就是说,它支配了设计方法、 编码语言、测试和检验技术的选择 ①流行的范型:目前流行多种范型,它们提供了许多方法,可进行系统分解。流行的 范型有:过程性的,逻辑的,面向存取的,面向进程的,面向对象的,函数型的,说明性的 每个范型都有它的支持者和用户,每个范型都特别适合于某种类型的问题或子问题。例如, 逻辑程序设计范型是基于规则的,它把有关问题的知识分解成一组具体规则,用语言的 “ if then”等结构来表示这些规则。面向存取范型是一种在构造用户界面方面很有用的技术。 此外,每一个范型都用不同的方式考虑问题,每一个范型都使用不同的方法来分解问题,而 且每一个范型都导致不同种类的块、过程、产生规则。下面主要讨论三种范型。研究的目的 是帮助我们找到解决问题的入手点 ②过程性范型:过程性范型是使用最广泛、历史最长的软件范型。它产生过程的抽象, 这些抽象把软件视为处理流,并定义成由一系列步骤构成的算法。每一步骤都是带有预定输 入和特定输出的一个过程,把这些步骤串联在一起可产生合理的稳定的贯通于整个程序的控 制流,最终产生一个简单的具有静态结构的体系结构,如图6.1(a)所示。 过程性范型侧重建立构成问题解决的处理流,数据抽象、数据结构是根据算法步骤的要 求开发的,它贯穿于过程,提供过程所要求操作的信息。系统的状态是一组全局变量,这组
1 第六章 面向对象的软件工程 一、复习要求 1. 了解面向对象的概念,包括什么是范型,面向对象的概念,对象和对象的分类等。 2. 了解用面向对象方法构造软件的开发过程,包括应用生存期和类生存期的概念。 3. 了解面向对象分析方法,包括论域分析,应用分析的介绍。 4. 了解面向对象设计方法,包括高层设计模型和设计原则,类设计的目标和方针,复用 设计及类设计的方法。 5. 了解有影响的 coad 方法、Booch 方法和 OMT 方法的基本思想。 二、内容提要 面向对象技术是一个非常实用而强有力的软件开发方法。它的特征是: ▪ 方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。 ▪ 从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前 一阶段成果的补充和修改。 ▪ 把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存 期的相应阶段。 1. 面向对象的概念 (1) 范型 范型(Paradigm)又称为范例、风范或模式(Pattern)。从软件开发角度来看,范型与问题 解决技术有关。范型定义了特定的问题和应用的开发过程中将要遵循的步骤,确定将用于表 示问题和它的解决的那些成分的类型,并利用这些成分表示与问题解决有关的抽象,直接得 到问题的结构。因此,范型的选择影响整个软件开发生存期。就是说,它支配了设计方法、 编码语言、测试和检验技术的选择。 ① 流行的范型 :目前流行多种范型,它们提供了许多方法,可进行系统分解。流行的 范型有:过程性的,逻辑的,面向存取的,面向进程的,面向对象的,函数型的,说明性的。 每个范型都有它的支持者和用户,每个范型都特别适合于某种类型的问题或子问题。例如, 逻辑程序设计范型是基于规则的,它把有关问题的知识分解成一组具体规则,用语言的 “if_then”等结构来表示这些规则。面向存取范型是一种在构造用户界面方面很有用的技术。 此外,每一个范型都用不同的方式考虑问题,每一个范型都使用不同的方法来分解问题,而 且每一个范型都导致不同种类的块、过程、产生规则。下面主要讨论三种范型。研究的目的 是帮助我们找到解决问题的入手点。 ② 过程性范型 :过程性范型是使用最广泛、历史最长的软件范型。它产生过程的抽象, 这些抽象把软件视为处理流,并定义成由一系列步骤构成的算法。每一步骤都是带有预定输 入和特定输出的一个过程,把这些步骤串联在一起可产生合理的稳定的贯通于整个程序的控 制流,最终产生一个简单的具有静态结构的体系结构,如图 6.1(a)所示。 过程性范型侧重建立构成问题解决的处理流,数据抽象、数据结构是根据算法步骤的要 求开发的,它贯穿于过程,提供过程所要求操作的信息。系统的状态是一组全局变量,这组
全局变量保存状态的值,把它们从一个过程传送到另一个过程 过程性范型是一种成熟的应用开发过程。对这种方法已有许多支持工具。然而,在大型 系统的开发上存在一些问题 ③面向对象范型:在过程性范型中优先考虑的是过程抽象,而在面向对象范型中优先 考虑的是实体,即问题论域的对象。在面向对象范型中,把标识和模型化问题论域中的主要 实体做为系统开发的起点,主要考虑对象的行为而不是必须执行的一系列动作 面向对象系统中的对象是数据抽象与过程抽象的综合。系统的状态保存在各个数据抽象 的核心所定义的数据存储中。控制流包含在各个数据抽象中的操作内。不像在过程性范型里 那样,把数据从一个过程传送到另一个过程,而是把控制流从一个数据抽象通过消息传送到 另一个数据抽象。完成的系统体系结构更复杂但也更灵活,如图62(b所示。把控制流分离 成块,这样可以把复杂的动作视为各个局部间的相互作用。 过程性系统 初始化 读入 计算 写出 结束 (a)系统结构基于要执行的任务,改变一个可能需要改变其它所有的 面向对象的系统 (b)系统结构基于对象间的交互,改变一个通常只具有局部影响 图6.1过程性系统和面向对象系统的基本构造 ④面向进程的范型:面向进程的范型是把一个问题分解成独立执行的模块。让不只一 个程序同时运行。这些进程互相配合,解决问题。面向进程范型产生的主要的块是进程。 个进程中的活动独立于其它进程的活动,但可以要求从其它进程得到信息,或为其它进程提 供信息。甚至可以异步处理,仅需要进程暂停发送或接收信息。在面向对象范型中,各个对 象是相对独立的,但也存在单线索(单线程)控制。面向进程范型支持与面向对象范型相同的 封装,但可提供多线索(多线程)执行。 ⑤混合范型:在大型系统的开发中,很难说哪种范型对整个问题的解决最好。系统开 发现在有一种补充步骤,可把大型问题分解成 一组子问题。对于每个子问题可以采用适当的 软件范型。例如,设计一个智能数据分析系统 面向存取范型) 时,可把它分解为4个子系统,如图62所示 系统的数据库界面,可以使用面向对象的方法 知识库 分析算法 进行设计:智能数据分析用逻辑范型设计;而 (逻辑范型) (过程性范型) 分析算法则是过程性的:系统通过一个用户界 面来实用化,这个用户界面是用面向存取范型 数据库界面 (面向对象范型) 设计出来的。 这种设计需要有某种实现语言或一组协 同语言的支持。许多流行的功能不断增强的语 图62一个智能数据分析系统
2 图 6.2 一个智能数据分析系统 全局变量保存状态的值,把它们从一个过程传送到另一个过程。 过程性范型是一种成熟的应用开发过程。对这种方法已有许多支持工具。然而,在大型 系统的开发上存在一些问题。 ③ 面向对象范型 :在过程性范型中优先考虑的是过程抽象,而在面向对象范型中优先 考虑的是实体,即问题论域的对象。在面向对象范型中,把标识和模型化问题论域中的主要 实体做为系统开发的起点,主要考虑对象的行为而不是必须执行的一系列动作。 面向对象系统中的对象是数据抽象与过程抽象的综合。系统的状态保存在各个数据抽象 的核心所定义的数据存储中。控制流包含在各个数据抽象中的操作内。不像在过程性范型里 那样,把数据从一个过程传送到另一个过程,而是把控制流从一个数据抽象通过消息传送到 另一个数据抽象。完成的系统体系结构更复杂但也更灵活,如图 6.2(b)所示。把控制流分离 成块,这样可以把复杂的动作视为各个局部间的相互作用。 图 6.1 过程性系统和面向对象系统的基本构造 ④ 面向进程的范型 :面向进程的范型是把一个问题分解成独立执行的模块。让不只一 个程序同时运行。这些进程互相配合,解决问题。面向进程范型产生的主要的块是进程。一 个进程中的活动独立于其它进程的活动,但可以要求从其它进程得到信息,或为其它进程提 供信息。甚至可以异步处理,仅需要进程暂停发送或接收信息。在面向对象范型中,各个对 象是相对独立的,但也存在单线索(单线程)控制。面向进程范型支持与面向对象范型相同的 封装,但可提供多线索(多线程)执行。 ⑤ 混合范型 :在大型系统的开发中,很难说哪种范型对整个问题的解决最好。系统开 发现在有一种补充步骤,可把大型问题分解成 一组子问题。对于每个子问题可以采用适当的 软件范型。例如,设计一个智能数据分析系统 时,可把它分解为 4 个子系统,如图 6.2 所示。 系统的数据库界面,可以使用面向对象的方法 进行设计;智能数据分析用逻辑范型设计;而 分析算法则是过程性的;系统通过一个用户界 面来实用化,这个用户界面是用面向存取范型 设计出来的。 这种设计需要有某种实现语言或一组协 同语言的支持。许多流行的功能不断增强的语
言支持不只一种设计范型。对于混合范型,现在已经存在不少技术。像C++和并发C这样的 语言都是多范型语言,支持过程性范型和面向对象范型。并发C还支持面冋进程范型。系统 可以使用单一的语言,利用两种或多种范型写成。还可以利用可共享数据格式和连接规约的 某些语言,把用这些语言分别编写的块链接到某个单一的应用中去 (2)面向对象的概念 关于“面向对象”,有许多不同的看法。Coad和 Yourdon给出了一个定义:“面向对 象=对象+类+继承+消息通信”。如果一个软件系统是使用这样4个概念设计和实现 的,则认为这个软件系统是面向对象的。一个面向对象的程序的每一成份应是对象,计算是 通过新的对象的建立和对象之间的消息通信来执行的 (3)对象( object) 一般意义来讲,对象是现实世界中存在的一个事物。可以是物理的,如一个家具或桌子, 如图63所示,可以是概念上的,如一个开发项目 对象是构成现实世界的一个独立的单位,具有自已的家具)桌子 静态特征(用数据描述)和动态特征(行为或具有的功 价格 价格 能)。例如:人的特征:姓名、性别、年龄等,行为 尺寸 尺寸 衣、食、住、行等 重量 ①对象、属性、操作、消息定义 位置 位置 颜色 颜色 对象可以定义为系统中用来描述客观事物的 个实体,它是构成系统的一个基本单位,由一组属性 购买 购买 和一组对属性进行操作的服务组成。 销售 属性一般只能通过执行对象的操作来改变 称重 称重 移动 操作又称为方法或服务,在C++中称为成员函 移动 数,它描述了对象执行的功能,若通过消息传递,还 图6.3对象的定义 可以为其它对象使用 而所谓的消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某 个操作的规格说明。发送给一个对象的消息定义了一个操作名和一个参数表(可能是空的) 并指定某一个对象。由一个对象接收的消息则调用消息中指定的操作,并将传递过来的实际 参数与参数表中相应的形式参数结合起来接收对象对消息的处理可能会改变对象中的状态 即改变接收对象的属性,并发送一个消息给自己或另一个对象。可以认为,这种消息的传递 大致等价于过程性范型中的函数调用 ②对象的分类 外部实体:与软件系统交换信息的外部设备、相关子系统、操作员或用户等。 信息结构:问题信息域中的概念实体,如信号、报表、显示信息等 需要记忆的事件:在系统运行过程中可能产生并需要系统记忆的事件,如单击鼠标左 键、击打键盘“→”键等 角色:与软件系统交互的人员所扮演的角色,如经理、部长、技术支持等 组织机构:有关机构,如单位、小组等。 ■位置:作为系统环境或问题上下文的场所、位置,如客户地址、收件人(机构)地址等 操作规程:如操作菜单、某种数据输入过程等 在标识对象时必需注意遵循“信息隐蔽”的原则:必需将对象的属性隐藏在对象的内部, 使得从对象的外部看不到对象的信息是如何定义的,只能通过该对象界面上的操作来使用这 些信息。对象的状态通过给对象赋予具体的属性值而得到。它只能通过该对象的操作来改变 对象有两个视图,分别表现在分析设计和实现方面。从分析及设计方面来看,对象表示 了一种概念,它们把有关的现实世界的实体模型化。从实现方面来看,一个对象表示了在应
3 图 6.3 对象的定义 言支持不只一种设计范型。对于混合范型,现在已经存在不少技术。像 C++和并发 C 这样的 语言都是多范型语言,支持过程性范型和面向对象范型。并发 C 还支持面向进程范型。系统 可以使用单一的语言,利用两种或多种范型写成。还可以利用可共享数据格式和连接规约的 某些语言,把用这些语言分别编写的块链接到某个单一的应用中去。 (2) 面向对象的概念 关于“面向对象”,有许多不同的看法。Coad 和 Yourdon 给出了一个定义:“面向对 象 = 对象 + 类 + 继承 + 消息通信”。如果一个软件系统是使用这样 4 个概念设计和实现 的,则认为这个软件系统是面向对象的。一个面向对象的程序的每一成份应是对象,计算是 通过新的对象的建立和对象之间的消息通信来执行的。 (3) 对象(object) 一般意义来讲,对象是现实世界中存在的一个事物。可以是物理的,如一个家具或桌子, 如图 6.3 所示,可以是概念上的,如一个开发项目。 对象是构成现实世界的一个独立的单位,具有自己的 静态特征(用数据描述)和动态特征(行为或具有的功 能)。 例如:人的特征:姓名、性别、年龄等,行为: 衣、食、住、行等。 ① 对象、属性、操作、消息定义 对象可以定义为系统中用来描述客观事物的一 个实体,它是构成系统的一个基本单位,由一组属性 和一组对属性进行操作的服务组成。 属性一般只能通过执行对象的操作来改变。 操作又称为方法或服务,在 C++中称为成员函 数,它描述了对象执行的功能,若通过消息传递,还 可以为其它对象使用。 而所谓的消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某 个操作的规格说明。发送给一个对象的消息定义了一个操作名和一个参数表(可能是空的), 并指定某一个对象。由一个对象接收的消息则调用消息中指定的操作,并将传递过来的实际 参数与参数表中相应的形式参数结合起来。接收对象对消息的处理可能会改变对象中的状态, 即改变接收对象的属性,并发送一个消息给自己或另一个对象。可以认为,这种消息的传递 大致等价于过程性范型中的函数调用。 ② 对象的分类 ▪ 外部实体:与软件系统交换信息的外部设备、相关子系统、操作员或用户等。 ▪ 信息结构:问题信息域中的概念实体,如信号、报表、显示信息等。 ▪ 需要记忆的事件:在系统运行过程中可能产生并需要系统记忆的事件,如单击鼠标左 键、击打键盘“→”键等。 ▪ 角色:与软件系统交互的人员所扮演的角色,如经理、部长、技术支持等。 ▪ 组织机构:有关机构,如单位、小组等。 ▪ 位置:作为系统环境或问题上下文的场所、位置,如客户地址、收件人(机构)地址等。 ▪ 操作规程:如操作菜单、某种数据输入过程等。 在标识对象时必需注意遵循“信息隐蔽”的原则:必需将对象的属性隐藏在对象的内部, 使得从对象的外部看不到对象的信息是如何定义的,只能通过该对象界面上的操作来使用这 些信息。对象的状态通过给对象赋予具体的属性值而得到。它只能通过该对象的操作来改变。 对象有两个视图,分别表现在分析设计和实现方面。从分析及设计方面来看,对象表示 了一种概念,它们把有关的现实世界的实体模型化。从实现方面来看,一个对象表示了在应 家具 价格 尺寸 重量 位置 颜色 属性 服务 购买 销售 称重 移动 桌子 价格 尺寸 重量 位置 颜色 购买 销售 称重 移动 属性 服务
用程序中出现的实体的实际数据结构。之所以有两个视图,是为了把说明与实现分离,对数 据结构和相关操作的实现进行封装。 (4)类( class和实例( Instance) 把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描 述了属于该类的全部对象的属性和操作。属于某个类的对象叫做该类的实例。对象的状态则 包含在它的实例变量,即实例的属性中。如图64所示。从“李杰”、“王辉”和“杨芳 等对象可得到类“学生”,而这些对象就称为该类的实例 类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的 当前状态是由实例所执行的操作定义的。 李杰 杨芳 杨芳 姓名 广东 湖南 北京 籍贯 软件 计算机控制 系统结构 专业 19804 979.1 1979.12 出生年月 9#楼129室 楼320室 5#楼418室 住址 服务 看书 看书 看书 看书 实验 实验 实验 实验 图64对象、类与实例 面向对象程序设计语言,如C++和 smalltalk都定义了一个new操作,可建立一个类的 新实例。C+还引入了构造函数,用它在声明一个对象时建立实例。此外,程序设计语言给 出了不同的方法,来撤消(称为析构)实例,即当某些对象不再使用时把它们删去,把存储释 放以备其它对象使用。C++给出了一个操作 delete,可以释放一个对象所用的空间。C++还允 许每个类定义自己的析构方法,在撤消一个对象时调用它。 smalltalk没有提供一个机制来撤 消对象,但可以进行无用单元收集 类常常可看做是一个抽象数据类型(ADT)的实现。但更重要的是把类看做是表示某种概 念的一个模型。事实上,类是单个的语义单元,它可以很自然地管理系统中的对象,匹配数 据定义与操作。类加进了操作,给通常的记录赋予了语义,可提供各种级别的可访问性 (5)继承( inheritance) 如果某几个类之间具有共性的东西(信息结构和行为),抽取出来放在一个一般类中,而 将各个类的特有的东西放在特殊类中分别描述,则可建立起特殊类对一般类的继承。如图65 所示,。各个特殊类可以从一般类中继承共性,这样避免了重复。 车 大轿车 起重 图6.5特殊类对一般类的继承关系
4 用程序中出现的实体的实际数据结构。之所以有两个视图,是为了把说明与实现分离,对数 据结构和相关操作的实现进行封装。 (4) 类(class)和实例(instance) 把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描 述了属于该类的全部对象的属性和操作。属于某个类的对象叫做该类的实例。对象的状态则 包含在它的实例变量,即实例的属性中。如图 6.4 所示。从“李杰”、“王辉”和“杨芳” 等对象可得到类“学生”,而这些对象就称为该类的实例。 类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的 当前状态是由实例所执行的操作定义的。 图 6.4 对象、类与实例 面向对象程序设计语言,如 C++和 smalltalk 都定义了一个 new 操作,可建立一个类的 新实例。C++还引入了构造函数,用它在声明一个对象时建立实例。此外,程序设计语言给 出了不同的方法,来撤消(称为析构)实例,即当某些对象不再使用时把它们删去,把存储释 放以备其它对象使用。C++给出了一个操作 delete,可以释放一个对象所用的空间。C++还允 许每个类定义自己的析构方法,在撤消一个对象时调用它。smalltalk 没有提供一个机制来撤 消对象,但可以进行无用单元收集。 类常常可看做是一个抽象数据类型(ADT)的实现。但更重要的是把类看做是表示某种概 念的一个模型。事实上,类是单个的语义单元,它可以很自然地管理系统中的对象,匹配数 据定义与操作。类加进了操作,给通常的记录赋予了语义,可提供各种级别的可访问性。 (5) 继承 (inheritance) 如果某几个类之间具有共性的东西(信息结构和行为),抽取出来放在一个一般类中,而 将各个类的特有的东西放在特殊类中分别描述,则可建立起特殊类对一般类的继承。如图 6.5 所示,。各个特殊类可以从一般类中继承共性,这样避免了重复。 图 6.5 特殊类对一般类的继承关系 李杰 李杰 男 广东 软件 1980.4 9#楼129室 看书 实验 上课 运动 杨芳 服务 王辉 男 湖南 计算机控制 1979.1 9#楼320室 杨芳 女 北京 系统结构 1979.12 5#楼418室 姓名 性别 籍贯 专业 出生年月 住址 学生 属性 王辉 属性 属性 属性 看书 实验 上课 运动 服务 看书 实验 上课 运动 服务 看书 实验 上课 运动 服务 汽车 大轿车 运货车 救火车 起重车
建立继承结构的好处 易编程、易理解代码短,结构清晰 易修改:共同部分只要在一处修改即可 师 退休者 易增加新类:只须描述不同部分。 (6)多继承 如果一个类需要用到多个既存类的特征,可以从 多个类中继承,称为多继承。例如退休教师是继承退 休者和教师这两个类的某些特征或行为而得到的一个 新类。 图66多继承 (7)多态性和动态绑定 对象互相通信,即一个对象发消息给另一个对象,执行某些行为或又发消息给另外的对 象,从而执行系统的功能。 发送消息的对象可能不知道另一个对象的类型是什么。如在C程序中使用命令 ClearInt( 时要严格区分该命令适合一个整数,还是一个整数数组。但在C++情形, ClearIng()对两者 都适用,它自己判断对象是哪一个 这就是多态性。它意味着一个操作在不同类中可以有不同的实现方式。如清零操作 ClearInt()针对消息对象是 Int array还是int,其实现是不同的。在一个面向对象的多态性 语言中,可能代替一个特定类型的类型的集合就是它的子类集合 例如,图67给出了4个类的继承层次。使用这个继承结构,发送给多边形类的所有消 息,它的所有子类都能够响应。又例如,想要在屏幕上画一系列多边形,多态性允许一个表 的元素可以属于一组指定的类型而不仅仅是 个类型,可以认为这是一个类族。通过遍 力形 历这个表,发送给各个表元素以draw消息 画出所有的多边形。 动态绑定把函数调用与目标代码块的连 三角形 四边形 接延迟到运行时进行。这样,只有发送消息 时才与接收消息实例的一个操作绑定。它与 多态性可以使我们建立的系统更灵活,易于 扩充。做为动态绑定的例子,考虑在多边形 类中的方法 contains?( apoint)。这个操作可以 图674个类的继承层次 在类层次的各层重新实现,以有效利用各个 子类的特殊的特征。例如,假定一个矩形有某些边与屏幕的边平行,这时,检查一个点是否 包含在矩形内,比检查一个点是否在一个一般的四边形内的效率要高一些 2.面向对象软件的开发过程 面向对象范型不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件 系统与现实世界的关系以及如何进行系统构造的软件方法学。用面向对象开发方法构造的软 件具有以下特点 面向对象的技术建立的模型与客观世界一致,因而便于理解 适应变化的需要,修改局限在模块中; 可复用性 (1)应用生存期 图68给出应用生存期模型。在图中各个阶段的顺序是线性的,但实际上开发过程不是 线性的。还没有办法用图来逼真地反映在面向对象开发过程中各个阶段之间的复杂交互。有
5 图 6.7 4 个类的继承层次 图 6.6 多继承 建立继承结构的好处: ▪ 易编程、易理解 代码短, 结构清晰; ▪ 易修改:共同部分只要在一处修改即可; ▪ 易增加新类:只须描述不同部分。 (6) 多继承 如果一个类需要用到多个既存类的特征,可以从 多个类中继承,称为多继承。例如退休教师是继承退 休者和教师这两个类的某些特征或行为而得到的一个 新类。 (7) 多态性和动态绑定 对象互相通信,即一个对象发消息给另一个对象,执行某些行为或又发消息给另外的对 象,从而执行系统的功能。 发送消息的对象可能不知道另一个对象的类型是什么。如在 C 程序中使用命令 ClearInt ( ) 时要严格区分该命令适合一个整数,还是一个整数数组。但在 C++情形,ClearInt ( ) 对两者 都适用,它自己判断对象是哪一个。 这就是多态性。它意味着一个操作在不同类中可以有不同的实现方式。如清零操作 ClearInt ( ) 针对消息对象是 int array 还是 int,其实现是不同的。在一个面向对象的多态性 语言中,可能代替一个特定类型的类型的集合就是它的子类集合。 例如,图 6.7 给出了 4 个类的继承层次。使用这个继承结构,发送给多边形类的所有消 息,它的所有子类都能够响应。又例如,想要在屏幕上画一系列多边形,多态性允许一个表 的元素可以属于一组指定的类型而不仅仅是 一个类型,可以认为这是一个类族。通过遍 历这个表,发送给各个表元素以 draw 消息, 画出所有的多边形。 动态绑定把函数调用与目标代码块的连 接延迟到运行时进行。这样,只有发送消息 时才与接收消息实例的一个操作绑定。它与 多态性可以使我们建立的系统更灵活,易于 扩充。做为动态绑定的例子,考虑在多边形 类中的方法 contains? (aPoint)。这个操作可以 在类层次的各层重新实现,以有效利用各个 子类的特殊的特征。例如,假定一个矩形有某些边与屏幕的边平行,这时,检查一个点是否 包含在矩形内,比检查一个点是否在一个一般的四边形内的效率要高一些。 2. 面向对象软件的开发过程 面向对象范型不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件 系统与现实世界的关系以及如何进行系统构造的软件方法学。用面向对象开发方法构造的软 件具有以下特点: ▪ 面向对象的技术建立的模型与客观世界一致,因而便于理解; ▪ 适应变化的需要,修改局限在模块中; ▪ 可复用性。 (1) 应用生存期 图 6.8 给出应用生存期模型。在图中各个阶段的顺序是线性的,但实际上开发过程不是 线性的。还没有办法用图来逼真地反映在面向对象开发过程中各个阶段之间的复杂交互。有 教师 退休者 退休教师 多边形 四边形 矩形 三角形
部分分析工作在设计之前实行,但有些分析工作与其它部分的设计与实现并行进行 开发可复用的软件构件是软件开发 过程的一部分。面向对象方法以类作为信息系 客户输入 单元,并分别考虑类的生存期与应用生人 存期。类生存期可包含在图68中的类开 发阶段中,可与应用生存期集成 分析 析 (2)类生存期 在面向对象软件开发过程中特别重 视复用。软件构件应独立于当初开发它 们的应用而存在。构件的开发瞄准某些 局部的设计和实现,它们可用于当前问 开发 题的解决,但为了在以后的项目中使用 组装 建立 它们还应当足够通用。在以后的应用开 测试 发中,可以调整这些独立构件以适应新维护 问题的需要。因此,应使得类成为一个 可复用的单元,图69提出了一个类生存 图6.8一个基于复用的应用生存期 期 类生存期与应用生存期交叉。在应用 生存期的每一个阶段都可做类的标识。类 类的规 格说明 生存期有自己的步骤,与任一特定应用的 从既存 演变 开发无关。按照这些步骤,可以完整地描 从废弃 述一个基本实体。而不仅仅考虑当前正在 型开发 开发的系统。系统开发的各个阶段都可能 既存类 的复用 渐增式 会标识新的类。随着各个新类的标识,类 的实现 生存期引导开发工作逐个阶段循序渐进 (实现 例如,在应用分析中已经标识了对 渐增式 个图形显示设备的要求。如果这样一个图 测试 测试用 形显示设备类不存在,就应着手开发。但 例和测试 是,用到显示器所有可能操作的应用寥寥 的开发 求精和 无几。若把这些操作的开发当做一个特定 维护 应用系统开发的一部分,那么只可能标识 和实现该系统所要求的那些操作。但如果 图69类生存期 考虑让构件独立于应用,就必须能够综合出超出当前系统需求的开发要求,生成一种能表示 成一个完全的概念的模型并可建立为以后其它系统复用的类 在纯面向对象的系统开发中,一个应用程序就“是”一个类。基本的类,像lst类,可 不涉及应用,但基本类的实例要聚合到其它类的定义中。这些类依次又聚合到更复杂的类定 义中,最终将会遇到一个类,它涉及整个应用 下面概括了类生存期各个阶段主要做的事情 ①类的规格说明:对每一个类都要开发它的规格说明,无论是在哪一个阶段标识的类 都是如此。类的规格说明定义了施加于对象的数据存储上的一组操作。这组操作应工作在封 装在对象内部的数据存储上,或返回关于对象状态的信息。操作的名字应能反映这个操作本 身的含义。类的规格说明必须足够完整,使得它能够与在类资源库中的那些可复用的类的规 格说明做比较。 ②类的设计与实现:此时尽可能利用既存类提供为当前应用所需要的功能。图69给
6 一部分分析工作在设计之前实行,但有些分析工作与其它部分的设计与实现并行进行。 开发可复用的软件构件是软件开发 过程的一部分。面向对象方法以类作为 单元,并分别考虑类的生存期与应用生 存期。类生存期可包含在图 6.8 中的类开 发阶段中,可与应用生存期集成。 (2) 类生存期 在面向对象软件开发过程中特别重 视复用。软件构件应独立于当初开发它 们的应用而存在。构件的开发瞄准某些 局部的设计和实现,它们可用于当前问 题的解决,但为了在以后的项目中使用, 它们还应当足够通用。在以后的应用开 发中,可以调整这些独立构件以适应新 问题的需要。因此,应使得类成为一个 可复用的单元,图 6.9 提出了一个类生存 期。 类生存期与应用生存期交叉。在应用 生存期的每一个阶段都可做类的标识。类 生存期有自己的步骤,与任一特定应用的 开发无关。按照这些步骤,可以完整地描 述一个基本实体。而不仅仅考虑当前正在 开发的系统。系统开发的各个阶段都可能 会标识新的类。随着各个新类的标识,类 生存期引导开发工作逐个阶段循序渐进。 例如,在应用分析中已经标识了对一 个图形显示设备的要求。如果这样一个图 形显示设备类不存在,就应着手开发。但 是,用到显示器所有可能操作的应用寥寥 无几。若把这些操作的开发当做一个特定 应用系统开发的一部分,那么只可能标识 和实现该系统所要求的那些操作。但如果 考虑让构件独立于应用,就必须能够综合出超出当前系统需求的开发要求,生成一种能表示 成一个完全的概念的模型并可建立为以后其它系统复用的类。 在纯面向对象的系统开发中,一个应用程序就“是”一个类。基本的类,像 list 类,可 不涉及应用,但基本类的实例要聚合到其它类的定义中。这些类依次又聚合到更复杂的类定 义中,最终将会遇到一个类,它涉及整个应用。 下面概括了类生存期各个阶段主要做的事情。 ① 类的规格说明 :对每一个类都要开发它的规格说明,无论是在哪一个阶段标识的类 都是如此。类的规格说明定义了施加于对象的数据存储上的一组操作。这组操作应工作在封 装在对象内部的数据存储上,或返回关于对象状态的信息。操作的名字应能反映这个操作本 身的含义。类的规格说明必须足够完整,使得它能够与在类资源库中的那些可复用的类的规 格说明做比较。 ② 类的设计与实现 :此时尽可能利用既存类提供为当前应用所需要的功能。图 6.9 给 图 6.8 一个基于复用的应用生存期 图 6.9 类生存期
出了利用既存类的三个途径: 原封不动地复用既存类 对既存类进行演化以得到满足要求的类。演化可以是横向的,也可以是纵向的。横向 的演化生成既存类的一个新的版本,而纵向的演化将从既存类导出新类 重新开始进行开发。 一个新的继承结构将建立两种类:一种是抽象类,它概括了将要表达的概念:另一种是 具体类,它要实现这个概念 ③求精和维护:维护活动是针对应用系统的,但求精过程是针对类和结构的。因为我 们利用抽象进行开发,因此,维护活动每时每刻都可能修改这些抽象。随着经验的增长,还 可以标识抽象的抽象,使得继承结构通过一般化,增加新的层次。 为便于类的调整,应尽量做到定义与实现分离,实现概念封装和信息隐蔽,使得类具有 更大的独立性。在使用一个类或复用一个类时,类与类之间产生一种相互依赖关系。但对一 个类的公有界面所做的多次修改不应影响使用它的那些类,在公有界面上增加新的操作不应 改变既存的软件。需要谨慎处理的是删除操作或改变操作的特征。 (3)面向对象软件的开发过程 面向对象软件的开发过程开始于问题论域,经历从问题提出到解决的一系列过程。下面 具体说明在过程中的这些步骤。 ①分析阶段:分析阶段包括两个步骤:论域分析和应用分析。它们都要标识问题论域 中的抽象。在分析中,需要找到特定对象,基于对象的公共特性把它们组合成集合,标识出 对这个问题的一个抽象。同时要标识抽象之间的关系,并建立对象之间的消息连接 ■论域分析:论域分析开发问题论域的模型。论域分析应当在应用分析之前进行,我 们在了解问题之前应当对问题敞开思想考虑,考察问题论域内的一个较宽的范围,分析覆盖 的范围应比直接要解决的问题更多 应用分析:应用(或系统)分析细化在论域分析阶段所开发出来的信息,并且把注意 力集中于当前要解决的问题。因为通过论域分析,分析人员具有了较宽的论域知识,因而能 开发出更好的抽象。 ②高层设计:在一个纯面向对象环境中,软件体系结构设计与类设计常常是同样的过 程,但还是应当把体系结构设计与类的设计分开。在高层设计阶段,设计应用系统的顶层视 图。这相当于开发一个代表系统的类,通过建立该类的一个实例并发送一个消息给它来完成 系统的“执行”。 ③类的开发:根据高层设计所标识的对各个类的要求和类的规格说明,进行类的开发 因为一个应用系统往往是一个类的继承层次。对这些类的开发是最基本的设计活动 ④实例的建立:建立各个对象的实例,实现问题的解决方案 ⑤组装测试:按照类与类之间的关系组装一个完整的应用系统的过程中进行的测试 各个类的封装和类测试的完备性可减少组装测试所需要的时间。 ⑥维护:维护的要求将影响应用和各个类。继承关系可支持对现有应用的扩充,或者 加入新的行为,或者改变某些行为的工作方式。 ■应用系统的维护:包括在系统的操作中定位故障、在既存的系统中加入新的行为 应用的维护能够简化对类实例的定位、修改其类的实现、通过改变消息或接收消息的次序来 改变应用中特殊对象的角色。新的行为可通过定义新的类和建立实例来实现 ■类的维护:把类的实现与其规格说明分离可局部化修改的影响。一般情况下,修正 问题要求应尽可能不改变类的界面。然而,为了在系统中增加新的行为,偶尔会有改变界面 的需求。 3.面向对象分析(OA)与模型化
7 出了利用既存类的三个途径: ▪ 原封不动地复用既存类。 ▪ 对既存类进行演化以得到满足要求的类。演化可以是横向的,也可以是纵向的。横向 的演化生成既存类的一个新的版本,而纵向的演化将从既存类导出新类。 ▪ 重新开始进行开发。 一个新的继承结构将建立两种类:一种是抽象类,它概括了将要表达的概念;另一种是 具体类,它要实现这个概念。 ③ 求精和维护 :维护活动是针对应用系统的,但求精过程是针对类和结构的。因为我 们利用抽象进行开发,因此,维护活动每时每刻都可能修改这些抽象。随着经验的增长,还 可以标识抽象的抽象,使得继承结构通过一般化,增加新的层次。 为便于类的调整,应尽量做到定义与实现分离,实现概念封装和信息隐蔽,使得类具有 更大的独立性。在使用一个类或复用一个类时,类与类之间产生一种相互依赖关系。但对一 个类的公有界面所做的多次修改不应影响使用它的那些类,在公有界面上增加新的操作不应 改变既存的软件。需要谨慎处理的是删除操作或改变操作的特征。 (3) 面向对象软件的开发过程 面向对象软件的开发过程开始于问题论域,经历从问题提出到解决的一系列过程。下面 具体说明在过程中的这些步骤。 ① 分析阶段 :分析阶段包括两个步骤:论域分析和应用分析。它们都要标识问题论域 中的抽象。在分析中,需要找到特定对象,基于对象的公共特性把它们组合成集合,标识出 对这个问题的一个抽象。同时要标识抽象之间的关系,并建立对象之间的消息连接。 ▪ 论域分析 :论域分析开发问题论域的模型。论域分析应当在应用分析之前进行,我 们在了解问题之前应当对问题敞开思想考虑,考察问题论域内的一个较宽的范围,分析覆盖 的范围应比直接要解决的问题更多。 ▪ 应用分析 :应用(或系统)分析细化在论域分析阶段所开发出来的信息,并且把注意 力集中于当前要解决的问题。因为通过论域分析,分析人员具有了较宽的论域知识,因而能 开发出更好的抽象。 ② 高层设计 :在一个纯面向对象环境中,软件体系结构设计与类设计常常是同样的过 程,但还是应当把体系结构设计与类的设计分开。在高层设计阶段,设计应用系统的顶层视 图。这相当于开发一个代表系统的类,通过建立该类的一个实例并发送一个消息给它来完成 系统的“执行”。 ③ 类的开发 :根据高层设计所标识的对各个类的要求和类的规格说明,进行类的开发。 因为一个应用系统往往是一个类的继承层次。对这些类的开发是最基本的设计活动。 ④ 实例的建立:建立各个对象的实例,实现问题的解决方案。 ⑤ 组装测试:按照类与类之间的关系组装一个完整的应用系统的过程中进行的测试。 各个类的封装和类测试的完备性可减少组装测试所需要的时间。 ⑥ 维护:维护的要求将影响应用和各个类。继承关系可支持对现有应用的扩充,或者 加入新的行为,或者改变某些行为的工作方式。 ▪ 应用系统的维护 :包括在系统的操作中定位故障、在既存的系统中加入新的行为。 应用的维护能够简化对类实例的定位、修改其类的实现、通过改变消息或接收消息的次序来 改变应用中特殊对象的角色。新的行为可通过定义新的类和建立实例来实现。 ▪ 类的维护 :把类的实现与其规格说明分离可局部化修改的影响。一般情况下,修正 问题要求应尽可能不改变类的界面。然而,为了在系统中增加新的行为,偶尔会有改变界面 的需求。 3. 面向对象分析(OOA)与模型化
面向对象分析过程分为论域分析和应用分析。论域分析建立大致的系统实现环境,应用 分析则根据特定应用的需求进行论域分析 1)OOA分析的基本原则和任务 为建立分析模型,要运用如下的5个基本原则:①建立信息域模型:②描述功能:③ 表达行为:④划分功能、数据、行为模型,揭示更多的细节:⑤用早期的模型描述问题的 实质,用后期的模型给出实现的细节。这些原则形成OOA的基础 OOA的目的是定义所有与待解决问题相关的类(包括类的操作和属性、类与类之间的关 系以及它们表现出的行为)。为此,OOA需完成的任务是 ①软件工程师和用户必须充分沟通,以了解基本的用户需求 ②必须标识类(即定义其属性和操作) ③必须定义类的层次; ④应当表达对象与对象之间的关系(即对象的连接) ⑤必须模型化对象的行为 ⑥反复地做任务①-⑤,直到模型建成。 (2)OOA概述 目前已经衍生许多种OOA方法。每种方法都有各自的进行产品或系统分析的过程,有 一组可描述过程演进的图形标识,以及能使得软件工程师以一致的方式建立模型的符号体系。 现在广泛使用的OOA方法有以下几种: ① Booch方法: Booch方法包含“微开发过程”和“宏开发过程”。微开发过程定义 了一组任务,并在宏开发过程的每一步骤中反复使用它们,以维持演进途径。 Booch ooa宏 开发过程的任务包括标识类和对象、标识类和对象的语义、定义类与对象间的关系,以及进 行一系列求精从而实现分析模型 ② Rumbaugh方法: Rumbaugh和他的同事提出的对象模型化技术OMT用于分析 系统设计和对象级设计。分析活动建立三个模型:对象模型(描述对象、类、层次和关系) 动态模型(描述对象和系统的行为),功能模型(类似于髙层的DFD,描述穿越系统的信息流) ③Coad和 Yourdon方法:coad和 Yourdon方法常常被认为是最容易学习的OOA 方法。建模符号相当简单,而且开发分析模型的导引直接明了。其OOA过程概述如下: 使用“要找什么”准则标识对象 定义对象之间的一般化/特殊化结构; 定义对象之间的整体/部分结构 标识主题(系统构件的表示) 定义属性及对象之间的实例连接 定义服务及对象之间的消息连接。 ④ Jacobson方法:也称为OOSE(面向对象软件工程)。 Jacobson方法与其它方法的不 同之处在于他特别强调使用实例( use case)一一用以描述用户与系统之间如何交互的场景 Jacobson方法概述如下: 标识系统的用户和它们的整体责任; 通过定义参与者及其职责、使用实例、对象和关系的初步视图,建立需求模型; 通过标识界面对象、建立界面对象的结构视图、表示对象行为、分离出每个对象的子 系统和模型,建立分析模型。 ⑤wirs- Brock方法: Wires-Brok方法不明确区分分析和设计任务。从评估客户规 格说明到设计完成,是一个连续的过程。与 Wires- Brock分析有关的任务概述如下 评估客户规格说明 使用语法分析从规格说明中提取候选类;
8 面向对象分析过程分为论域分析和应用分析。论域分析建立大致的系统实现环境,应用 分析则根据特定应用的需求进行论域分析。 (1) OOA 分析的基本原则和任务 为建立分析模型,要运用如下的 5 个基本原则:① 建立信息域模型;② 描述功能;③ 表达行为;④ 划分功能、数据、行为模型,揭示更多的细节;⑤ 用早期的模型描述问题的 实质,用后期的模型给出实现的细节。这些原则形成 OOA 的基础。 OOA 的目的是定义所有与待解决问题相关的类(包括类的操作和属性、类与类之间的关 系以及它们表现出的行为)。为此,OOA 需完成的任务是: ① 软件工程师和用户必须充分沟通,以了解基本的用户需求; ② 必须标识类(即定义其属性和操作); ③ 必须定义类的层次; ④ 应当表达对象与对象之间的关系(即对象的连接); ⑤ 必须模型化对象的行为; ⑥ 反复地做任务①―⑤,直到模型建成。 (2) OOA 概述 目前已经衍生许多种 OOA 方法。每种方法都有各自的进行产品或系统分析的过程,有 一组可描述过程演进的图形标识,以及能使得软件工程师以一致的方式建立模型的符号体系。 现在广泛使用的 OOA 方法有以下几种: ① Booch 方法 :Booch 方法包含“微开发过程”和“宏开发过程”。微开发过程定义 了一组任务,并在宏开发过程的每一步骤中反复使用它们,以维持演进途径。Booch OOA 宏 开发过程的任务包括标识类和对象、标识类和对象的语义、定义类与对象间的关系,以及进 行一系列求精从而实现分析模型。 ② Rumbaugh 方法 :Rumbaugh 和他的同事提出的对象模型化技术(OMT)用于分析、 系统设计和对象级设计。分析活动建立三个模型:对象模型(描述对象、类、层次和关系), 动态模型(描述对象和系统的行为),功能模型(类似于高层的 DFD,描述穿越系统的信息流)。 ③ Coad 和 Yourdon 方法 :Coad 和 Yourdong 方法常常被认为是最容易学习的 OOA 方法。建模符号相当简单,而且开发分析模型的导引直接明了。其 OOA 过程概述如下: ▪ 使用“要找什么”准则标识对象; ▪ 定义对象之间的一般化∕特殊化结构; ▪ 定义对象之间的整体∕部分结构; ▪ 标识主题(系统构件的表示); ▪ 定义属性及对象之间的实例连接; ▪ 定义服务及对象之间的消息连接。 ④ Jacobson 方法 :也称为 OOSE(面向对象软件工程)。Jacobson 方法与其它方法的不 同之处在于他特别强调使用实例(use case)——用以描述用户与系统之间如何交互的场景。 Jacobson 方法概述如下: ▪ 标识系统的用户和它们的整体责任; ▪ 通过定义参与者及其职责、使用实例、对象和关系的初步视图,建立需求模型; ▪ 通过标识界面对象、建立界面对象的结构视图、表示对象行为、分离出每个对象的子 系统和模型,建立分析模型。 ⑤ Wirfs―Brock 方法 :Wirfs―Brock 方法不明确区分分析和设计任务。从评估客户规 格说明到设计完成,是一个连续的过程。与 Wirfs―Brock 分析有关的任务概述如下: ▪ 评估客户规格说明; ▪ 使用语法分析从规格说明中提取候选类;
将类分组以表示超类; 定义每一个类的职责 将职责赋予每个类 标识类之间的关系 基于职责定义类之间的协作 建立类的层次表示; 构造系统的协作图。 ⑥统一的OOA方法(UML 统一的建模语言(UML)已经在企业中广泛使用,它把 Booch、 Rumbaugh和 Jacobson等 各自独立的OOA和OOD方法中最优秀的特色组合成一个统一的方法。UML允许软件工程 师使用由一组语法的语义的实用的规则支配的符号来表示分析模型 在UML中用5种不同的视图来表示一个系统,这些视图从不同的侧面描述系统。每 个视图由一组图形来定义。这些视图概述如下 用户模型视图:这个视图从用户(在UML中叫做参与者)角度来表示系统。它用使用 实例( use case)来建立模型,并用它来描述来自终端用户方面的可用的场景 结构模型视图:从系统内部来看数据和功能性。即对静态结构(类、对象和关系)模 型化 ■行为模型视图:这种视图表示了系统动态和行为。它还描述了在用户模型视图和结 构模型视图中所描述的各种结构元素之间的交互和协作。 实现模型视图:将系统的结构和行为表达成为易于转换为实现的方式。 环境模型视图:表示系统实现环境的结构和行为。 通常,UML分析建模的注意力放在系统的用户模型和结构模型视图,而UML设计建模 则定位在行为模型、实现模型和环境模型 (3)论域分析( Domain Analysis 论域分析是基于特定应用论域,标识、分析、定义可复用于应用论域内多个项目的公共 需求的技术。它的目标是发现和创建一组应用广泛的类,这组类常常超出特定应用的范围 可以复用于其它系统的开发 论域分析可以被视为软件过程的一种保护伞活动,是与任一软件项目都没有牵连的软件 工程活动。论域分析员的工作是设计和建造可复用的构件,供许多工作在类似的但不一定相 同的应用项目中的人员使用。 论域分析过程的关键输入/输出参看图6.10。主要的过程活动有: 技术文化 类的分类法 复用标准 域知识源 论域 功能模型 专家建议 分析 论域分析模型 当而/未米求 图6.10论域分析的输入/输出 ①定义要研究的论域:分析员首先隔离感兴趣的业务论域、系统类型或产品分类,再 抽取OO项和非OO项。其中,OO项包括既存应用的类的规格说明、设计和代码:;支持类 (GUⅠ类或数据库存取类);与论域相关的市售构件库:测试用例等。非OO项包括方针、步 骤、计划、标准和指南:既存的非OO应用的规格说明、设计和测试信息:度量、市售非OC 软件等
9 ▪ 将类分组以表示超类; ▪ 定义每一个类的职责; ▪ 将职责赋予每个类; ▪ 标识类之间的关系; ▪ 基于职责定义类之间的协作; ▪ 建立类的层次表示; ▪ 构造系统的协作图。 ⑥ 统一的 OOA 方法(UML) 统一的建模语言(UML)已经在企业中广泛使用,它把 Booch、Rumbaugh 和 Jacobson 等 各自独立的 OOA 和 OOD 方法中最优秀的特色组合成一个统一的方法。UML 允许软件工程 师使用由一组语法的语义的实用的规则支配的符号来表示分析模型。 在 UML 中用 5 种不同的视图来表示一个系统,这些视图从不同的侧面描述系统。每一 个视图由一组图形来定义。这些视图概述如下: ▪ 用户模型视图 :这个视图从用户(在 UML 中叫做参与者)角度来表示系统。它用使用 实例(use case)来建立模型,并用它来描述来自终端用户方面的可用的场景。 ▪ 结构模型视图 :从系统内部来看数据和功能性。即对静态结构(类、对象和关系)模 型化。 ▪ 行为模型视图 :这种视图表示了系统动态和行为。它还描述了在用户模型视图和结 构模型视图中所描述的各种结构元素之间的交互和协作。 ▪ 实现模型视图 :将系统的结构和行为表达成为易于转换为实现的方式。 ▪ 环境模型视图 :表示系统实现环境的结构和行为。 通常,UML 分析建模的注意力放在系统的用户模型和结构模型视图,而 UML 设计建模 则定位在行为模型、实现模型和环境模型。 (3) 论域分析(Domain Analysis) 论域分析是基于特定应用论域,标识、分析、定义可复用于应用论域内多个项目的公共 需求的技术。它的目标是发现和创建一组应用广泛的类,这组类常常超出特定应用的范围, 可以复用于其它系统的开发。 论域分析可以被视为软件过程的一种保护伞活动,是与任一软件项目都没有牵连的软件 工程活动。论域分析员的工作是设计和建造可复用的构件,供许多工作在类似的但不一定相 同的应用项目中的人员使用。 论域分析过程的关键输入∕输出参看图 6.10。主要的过程活动有: 图 6.10 论域分析的输入∕输出 ① 定义要研究的论域 :分析员首先隔离感兴趣的业务论域、系统类型或产品分类,再 抽取 OO 项和非 OO 项。其中,OO 项包括既存应用的类的规格说明、设计和代码;支持类 (GUI 类或数据库存取类);与论域相关的市售构件库;测试用例等。非 OO 项包括方针、步 骤、计划、标准和指南;既存的非 OO 应用的规格说明、设计和测试信息;度量、市售非 OO 软件等。 领 域 知 识 源 论 域 分 析 模 型 论 域 分 析 技术文化 现有应用 客户调查 专家建议 当前∕未来需求 类的分类法 复用标准 功能模型 论域语言
②分类从论域抽取的项:对所有的项进行归类并定义各个种类的一般定义特征。提出 种类的分类模式并定义每个项的命名惯例。适当的时候建立分类的层次 ③收集论域中各个应用的有代表性的样例:为了完成这个活动,必须保证在问题中的 应用具有适合已定义的某些种类的项。 ④分析样例中的每一个应用:分析员接下来要做的事情是 标识候选的可复用的对象 指明标识对象为可复用的理由 定义可复用对象的适合性 估计在论域中可做到对象复用的应用的百分比 用名字标识对象并使用配置管理技术控制它们。一旦标识了对象,分析员应当估计一 个典型的应用能够使用可复用对象构造的百分比 此外,论域分析员还应建立一组复用指南,并给出一个例子,说明如何使用论域对象来 建立新的应用 总之,论域分析实际上是一种学习,涉及与应用论域有关的所有知识。论域的边界可能 很模糊,很多是凭借经验和实际考虑(如可用资源)。主要思想是想把考虑的论域放宽一些, 把相关的概念都标识到,以帮助更好地掌握应用的核心知识。当用户改变他们对系统的需求 时,范围广泛的分析可以帮助预测这些变化 (4)应用分析 应用分析的依据是在论域分析时建立起来的论域分析模型,并把它用于当前正在建立的 应用当中。客户对系统的需求可以当做限制来使用,用它们缩减论域的信息量。就这一点来 说,保留的信息受到论域分析视野的影响。论域分析产生的模型并不需要用任何基于计算机 系统的程序设计语言来表示,而应用分析阶段产生影响的条件则伴随着某种基于计算机系统 的程序设计语言的表示。响应时间需求、用户界面需求和某些特殊的需求,如数据安全等 都在这一层分解抽出。 许多模型识别的要求是针对不止一个应用的。通常我们着重考虑两个方面:应用视图和 类视图。必须对每个类的规格说明和操作详细化,还必须对形成应用结构的类之间的相互作 用加以表示 4.面向对象设计(OOD) OOA和OOD之间有密切的衔接关系,从OOA到OOD是一个逐渐扩充模型的过程。 分析处理以问题为中心,可以不考虑任何与特定计算机有关的问题,而OOD则把我们带进 了面向计算机的“实地”开发活动中去。通常,OOD分为两个阶段,即高层设计和低层设计。 高层设计建立应用的体系结构。低层设计集中于类的详细设计 (1)高层设计 高层设计阶段开发软件的体系结构,构造软件的总体模型。在这个阶段,标识在计算机 环境中进行问题解决工作所需要的概念,并增加了一批需要的类。这些类包括那些可使应用 软件与系统的外部世界交互的类。此阶段的输出是适合应用软件要求的类、类间的关系、应 用的子系统视图规格说明。通常,利用面向对象设计得到的系统框架如图6.11所示。 ①高层设计模型 个典型的高层设计模型即客户一服务器模型,它构造起应用软件的总体模型,这个模 型导出的体系结构既可在过程性系统中使用,又可在面向对象的系统中使用。 客户一服务器模型的想法是让系统的一个部分(服务器子系统)提供一组服务给系统的 另一个部分(客户子系统)。请求服务的对象都归于客户子系统,而接受请求提供服务的部分 就是服务器。X- window系统在用户界面设计时就使用了客户一服务器方法来构造它的图形
10 ② 分类从论域抽取的项 :对所有的项进行归类并定义各个种类的一般定义特征。提出 种类的分类模式并定义每个项的命名惯例。适当的时候建立分类的层次。 ③ 收集论域中各个应用的有代表性的样例 :为了完成这个活动,必须保证在问题中的 应用具有适合已定义的某些种类的项。 ④ 分析样例中的每一个应用 :分析员接下来要做的事情是: ▪ 标识候选的可复用的对象; ▪ 指明标识对象为可复用的理由; ▪ 定义可复用对象的适合性; ▪ 估计在论域中可做到对象复用的应用的百分比; ▪ 用名字标识对象并使用配置管理技术控制它们。一旦标识了对象,分析员应当估计一 个典型的应用能够使用可复用对象构造的百分比。 此外,论域分析员还应建立一组复用指南,并给出一个例子,说明如何使用论域对象来 建立新的应用。 总之,论域分析实际上是一种学习,涉及与应用论域有关的所有知识。论域的边界可能 很模糊,很多是凭借经验和实际考虑(如可用资源)。主要思想是想把考虑的论域放宽一些, 把相关的概念都标识到,以帮助更好地掌握应用的核心知识。当用户改变他们对系统的需求 时,范围广泛的分析可以帮助预测这些变化。 (4) 应用分析 应用分析的依据是在论域分析时建立起来的论域分析模型,并把它用于当前正在建立的 应用当中。客户对系统的需求可以当做限制来使用,用它们缩减论域的信息量。就这一点来 说,保留的信息受到论域分析视野的影响。论域分析产生的模型并不需要用任何基于计算机 系统的程序设计语言来表示,而应用分析阶段产生影响的条件则伴随着某种基于计算机系统 的程序设计语言的表示。响应时间需求、用户界面需求和某些特殊的需求,如数据安全等, 都在这一层分解抽出。 许多模型识别的要求是针对不止一个应用的。通常我们着重考虑两个方面:应用视图和 类视图。必须对每个类的规格说明和操作详细化,还必须对形成应用结构的类之间的相互作 用加以表示。 4. 面向对象设计(OOD) OOA 和 OOD 之间有密切的衔接关系,从 OOA 到 OOD 是一个逐渐扩充模型的过程。 分析处理以问题为中心,可以不考虑任何与特定计算机有关的问题,而 OOD 则把我们带进 了面向计算机的“实地”开发活动中去。通常,OOD 分为两个阶段,即高层设计和低层设计。 高层设计建立应用的体系结构。低层设计集中于类的详细设计。 (1) 高层设计 高层设计阶段开发软件的体系结构,构造软件的总体模型。在这个阶段,标识在计算机 环境中进行问题解决工作所需要的概念,并增加了一批需要的类。这些类包括那些可使应用 软件与系统的外部世界交互的类。此阶段的输出是适合应用软件要求的类、类间的关系、应 用的子系统视图规格说明。通常,利用面向对象设计得到的系统框架如图 6.11 所示。 ① 高层设计模型 一个典型的高层设计模型即客户-服务器模型,它构造起应用软件的总体模型,这个模 型导出的体系结构既可在过程性系统中使用,又可在面向对象的系统中使用。 客户-服务器模型的想法是让系统的一个部分(服务器子系统)提供一组服务给系统的 另一个部分(客户子系统)。请求服务的对象都归于客户子系统,而接受请求提供服务的部分 就是服务器。X-window 系统在用户界面设计时就使用了客户—服务器方法来构造它的图形