面向对象软件工程实践指南 1.4.5类之间的关系 类之间存在三种基本的关系:(1)一般-特殊关系,表示“是一种”关系(isa):例如, 樱花是一种花,花是一般的类,而樱花是一种特殊的子类:(2)整体-部分关系,表示“组成 部分”关系(hasa/contains a):例如花瓣是花的一部分;(3)关联,表示某种语义上的依赖关 系(usea),相互关联的两个对象一般是平等的:例如,蜜蜂和花之间的关系。 1.一般特殊关系 ●继承(Inheritance) 继承是面向对象方法学中的一个十分重要的概念,继承是指能够直接获得已有的性质 或特征,不必重新定义。在面向对象的方法学中,其定义是:特殊类(或称子类、派生类) 的对象拥有其一般类(或称父类、基类)的全部属性与服务,称作特殊类对一般类的继承。 比如樱花是子类,花是基类。继承可以表示类与类、接口与接口之间的继承关系,或类与接 口之间的实现关系。继承分为单继承和多继承。当一个类只有一个父类时为单继承,有多个 父类时为多继承。 ●泛化(Generalization) 泛化与继承相反,是指从子类抽取共同的特征形成父类的过程。例如,从关山樱、菊 樱、郁金樱等不同种类樱花中,抽取樱花类。 2.整体-部分关系 ●聚合(Aggregation) 聚合表示整体类和部分类之间的关系为“包含”、“组成”的关系。例如花包含了樱花,桃 花,梅花等,当这些花不构成完整的花类时,也是单独存在的。 ●组合(Composition) 组合表示整体类拥有部分类,部分和整体具有相同的生存期,如果整体不存在了,部 分也随之消失。例如一朵花包含花冠、花萼、花托和花蕊四个部分,花不存在了,则花冠等 也没有意义。组合是一种特殊形式的强类型的聚合。 3.关联关系 ●关联(Association) 关联是体现了两个类之间语义级别的一种强依赖关系,一般是长期的且双方是平等的。 关联可以是单向的和双向的。 。依赖(Dependency) 依赖是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将 影响另外一个类,依赖关系具有偶然性、临时性,是脆弱的。 ●实现(Realization) 12
面向对象软件工程实践指南 12 1.4.5 类之间的关系 类之间存在三种基本的关系:(1)一般-特殊关系,表示“是一种”关系 (is a);例如, 樱花是一种花,花是一般的类,而樱花是一种特殊的子类;(2)整体-部分关系,表示“组成 部分”关系(has a / contains a);例如花瓣是花的一部分;(3)关联,表示某种语义上的依赖关 系 (use a),相互关联的两个对象一般是平等的:例如,蜜蜂和花之间的关系。 1. 一般-特殊关系 继承(Inheritance) 继承是面向对象方法学中的一个十分重要的概念,继承是指能够直接获得已有的性质 或特征,不必重新定义。在面向对象的方法学中,其定义是:特殊类(或称子类、派生类) 的对象拥有其一般类(或称父类、基类)的全部属性与服务,称作特殊类对一般类的继承。 比如樱花是子类,花是基类。继承可以表示类与类、接口与接口之间的继承关系,或类与接 口之间的实现关系。继承分为单继承和多继承。当一个类只有一个父类时为单继承,有多个 父类时为多继承。 泛化 (Generalization) 泛化与继承相反,是指从子类抽取共同的特征形成父类的过程。例如,从关山樱、菊 樱、郁金樱等不同种类樱花中,抽取樱花类。 2. 整体-部分关系 聚合 (Aggregation) 聚合表示整体类和部分类之间的关系为“包含”、“组成”的关系。例如花包含了樱花,桃 花,梅花等,当这些花不构成完整的花类时,也是单独存在的。 组合 (Composition) 组合表示整体类拥有部分类,部分和整体具有相同的生存期,如果整体不存在了,部 分也随之消失。例如一朵花包含花冠、花萼、花托和花蕊四个部分,花不存在了,则花冠等 也没有意义。组合是一种特殊形式的强类型的聚合。 3. 关联关系 关联 (Association) 关联是体现了两个类之间语义级别的一种强依赖关系,一般是长期的且双方是平等的。 关联可以是单向的和双向的。 依赖 (Dependency) 依赖是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将 影响另外一个类,依赖关系具有偶然性、临时性,是脆弱的。 实现 (Realization)
面向对象软件工程实践指南 指的是一个类实现接口(可以是多个)的功能:实现是类与接口之间最常见的关系。 1.4.6面向对象的优点 面向对象技术提供了更好的抽象能力和更多的软件开发方法和工具,能够使用各种不 同的设计模式来解决具体问题。而且,在软件实现层面上看,面向对象技术极大地提高了代 码复用,提高了代码的可扩展性,便于软件的维护。 面向对象技术中,对象是整个技术的核心。而整个软件系统,是真实世界的一种抽象。 这种抽象,是由描述状态的数据,以及描述动作的方法的整体封装。不同的对象之间可以相 互传递消息,类似于现实世界中不同事物之间的交流和联系。因为面向对象理念中,建立起 来的模型是对真实世界的反映,所以开发者可以更多地站在真实世界一一软件应用领域的角 度去看待问题,而不需要把应用领域的问题转化为计算机的角度来考虑。这样的思考方法无 疑更加接近于人的传统思维方式,对于问题的考虑也将更加完善。 传统的软件开发方法是“瀑布”模型的,强调自顶向下完成软件开发过程。然而事实 上,人们对于问题的认识是一个渐进的过程。通过不断地深化对问题的理解,人们的思维经 历了从特殊到一般的归纳,也经历了从一般到特殊的演绎,这都是在第一次分析问题时所难 以达到的。人们在认识复杂的问题时,运用最多的方式是抽象,即忽略不关注的方面,而重 点分析处理关注的方面,这与面向对象的思想是一致的。 通过面向对象技术建立起来的模型,可以随着开发者对于问题理解的深入而进行完善 和修改。由于类与类之间是相对独立的,因此不会出现牵一发而动全身的情况。当系统的功 能需求改变时,软件的结构不会出现大的变化,一般情况下只需要进行简单的修改和调整。 因为对象是对真实世界的反映,而真实世界的结构是相对稳定的,因而以面向对象技术构建 出的系统结构也是比较稳定的。 在传统的工业界,用己有的零件来装配新的产品是非常普遍的情况。实际上,新的产 品并不是全新的,仅仅是部分零件做了更新而己。软件开发同样是如此,一个新的软件并不 需要完全重写所有的代码。这种时候,代码复用就可以很大程度地提高生产效率。在传统的 软件工程中,代码的复用是利用标准函数库实现的。但是标准函数库很难适应不同的应用场 合和不同的需求,因而这种复用是很基本的。函数库仅仅能提供最为基础的功能,在一个软 件系统中,绝大多数函数都需由开发者重新编写。然而,面向对象的开发方法在构建软件系 统时,可以通过派生已有的类来实现代码的复用。子类不仅继承了父类的数据和方法,还可 以很方便地进行扩充和修改。可以这么说,在面向对象软件开发中,对象是一个个的细胞, 有自己独立的结构,功能和用途。开发大型软件的过程就是对小“细胞”进行组合的过程。 这样就把大型的软件系统拆分成了相对独立的小“模块”,从而大大降低了开发的难度和管 理的复杂度。 基于面向对象技术开发的软件由于稳定性比较好,当出现需求变更时软件也比较容易 修改,因而软件的维护难度也大大降低了。 传统的软件难于维护,一个重要的原因是整个系统难于理解。尤其是对于比较庞大的 系统,需要修改的部分经常比较分散,而人们又很难了解整个软件的全部内容。面向对象符 13
面向对象软件工程实践指南 13 指的是一个类实现接口(可以是多个)的功能;实现是类与接口之间最常见的关系。 1.4.6 面向对象的优点 面向对象技术提供了更好的抽象能力和更多的软件开发方法和工具,能够使用各种不 同的设计模式来解决具体问题。而且,在软件实现层面上看,面向对象技术极大地提高了代 码复用,提高了代码的可扩展性,便于软件的维护。 面向对象技术中,对象是整个技术的核心。而整个软件系统,是真实世界的一种抽象。 这种抽象,是由描述状态的数据,以及描述动作的方法的整体封装。不同的对象之间可以相 互传递消息,类似于现实世界中不同事物之间的交流和联系。因为面向对象理念中,建立起 来的模型是对真实世界的反映,所以开发者可以更多地站在真实世界——软件应用领域的角 度去看待问题,而不需要把应用领域的问题转化为计算机的角度来考虑。这样的思考方法无 疑更加接近于人的传统思维方式,对于问题的考虑也将更加完善。 传统的软件开发方法是“瀑布”模型的,强调自顶向下完成软件开发过程。然而事实 上,人们对于问题的认识是一个渐进的过程。通过不断地深化对问题的理解,人们的思维经 历了从特殊到一般的归纳,也经历了从一般到特殊的演绎,这都是在第一次分析问题时所难 以达到的。人们在认识复杂的问题时,运用最多的方式是抽象,即忽略不关注的方面,而重 点分析处理关注的方面,这与面向对象的思想是一致的。 通过面向对象技术建立起来的模型,可以随着开发者对于问题理解的深入而进行完善 和修改。由于类与类之间是相对独立的,因此不会出现牵一发而动全身的情况。当系统的功 能需求改变时,软件的结构不会出现大的变化,一般情况下只需要进行简单的修改和调整。 因为对象是对真实世界的反映,而真实世界的结构是相对稳定的,因而以面向对象技术构建 出的系统结构也是比较稳定的。 在传统的工业界,用已有的零件来装配新的产品是非常普遍的情况。实际上,新的产 品并不是全新的,仅仅是部分零件做了更新而已。软件开发同样是如此,一个新的软件并不 需要完全重写所有的代码。这种时候,代码复用就可以很大程度地提高生产效率。在传统的 软件工程中,代码的复用是利用标准函数库实现的。但是标准函数库很难适应不同的应用场 合和不同的需求,因而这种复用是很基本的。函数库仅仅能提供最为基础的功能,在一个软 件系统中,绝大多数函数都需由开发者重新编写。然而,面向对象的开发方法在构建软件系 统时,可以通过派生已有的类来实现代码的复用。子类不仅继承了父类的数据和方法,还可 以很方便地进行扩充和修改。可以这么说,在面向对象软件开发中,对象是一个个的细胞, 有自己独立的结构,功能和用途。开发大型软件的过程就是对小“细胞”进行组合的过程。 这样就把大型的软件系统拆分成了相对独立的小“模块”,从而大大降低了开发的难度和管 理的复杂度。 基于面向对象技术开发的软件由于稳定性比较好,当出现需求变更时软件也比较容易 修改,因而软件的维护难度也大大降低了。 传统的软件难于维护,一个重要的原因是整个系统难于理解。尤其是对于比较庞大的 系统,需要修改的部分经常比较分散,而人们又很难了解整个软件的全部内容。面向对象符
面向对象软件工程实践指南 合人类惯有的思维方式,在这种方式下建立起来的软件架构与真实世界基本相同,因而减小 了理解的难度,也降低了维护的难度。 由于面向对象开发的软件各个类之间的独立性比较好,在更改时,往往只需要修改类 的局部数据或操作,所以比较容易实现。继承和多态机制能够使得对软件修改和扩充时,需 要修改或增加的代码大量减少。除此之外,为了保证软件的质量,大量的测试是必须的。基 于面向对象技术的软件中,由于类是独立性很强的小模块,因此要完成对类的测试是简单的 一一创造类对象,进行各种功能的测试即可,调试难度也比较低,因此可维护性较强。 g
面向对象软件工程实践指南 14 合人类惯有的思维方式,在这种方式下建立起来的软件架构与真实世界基本相同,因而减小 了理解的难度,也降低了维护的难度。 由于面向对象开发的软件各个类之间的独立性比较好,在更改时,往往只需要修改类 的局部数据或操作,所以比较容易实现。继承和多态机制能够使得对软件修改和扩充时,需 要修改或增加的代码大量减少。除此之外,为了保证软件的质量,大量的测试是必须的。基 于面向对象技术的软件中,由于类是独立性很强的小模块,因此要完成对类的测试是简单的 ——创造类对象,进行各种功能的测试即可,调试难度也比较低,因此可维护性较强
面向对象软件工程实践指南 第2章面向对象软件过程 软件过程给出了为形成最终的软件所需要完成的任务的框架,它包括了整个过程中有 哪些任务,每个任务所需要的资源、角色,每个任务需要使用的工具、方法,任务的输入和 输出,任务之间的相互关系等。软件过程是影响软件开发的全局性因素,软件过程是否合理 将给软件开发带来全面的影响。 不同的软件工程方法学将渗透在软件过程中。软件过程模型是指导软件过程的模板。 按照软件过程模型,依据要开发的软件的特点,将形成具体的软件过程。随着软件开发实践 的不断积累和学术界的总结,目前出现了不同种类的软件过程模型。 面向对象首先作为一种开发思想而存在,然后面向对象思想与开发活动相结合,产生 了面向对象方法,面向对象方法贯穿软件过程的始终,形成了面向对象软件过程。在本章中, 我们将简要介绍面向对象方法的发展,并对面向对象分析、面向对象设计、面向对象实现、 面向对象测试进行介绍,最后介绍面向对象软件过程的整体流程。 2.1面向对象方法的发展 在面向对象方法发展的过程中,有几个方法具有较大的影响力,它们是Grady Booch 提出的面向对象开发方法OOAD、Ivar Jacobson的OOSE方法和James Rumbaugh的OMT 方法。 1.Grady Booch的面向对象方法OOAD 1986年,面向对象方法的最早倡导者之一Grady Booch提出了面向对象分析与设计方法 (Object--Oriented Analysis and Design,.OOAD)。Booch认为开发过程为螺旋上升模式,每一步 重复的步骤如下: (1)从应用的问题域发现类和对象: (2)分析类和对象的功能、行为,确定属性和操作: (3)找出类、对象之间的关系: (4)说明每个类和对象的实现。 Boo©h开发模型包含四种模型:逻辑模型、物理模型、静态模型和动态模型,逻辑模 型描述系统的类结构和对象结构,分别用类图和对象图表示:物理模型描述系统的模块结构 和进程结构,分别用模型图和进程图表示:静态模型描述系统的静态组成结构:动态模型描 述系统执行过程中的行为,用状态图和交互图表示。 2.var Jacobson的面向对象方法OOSE Jacobson的面向对象软件工程(Object-Oriented Software Engineering,OOSE)方法提出 了一种用例驱动的面向对象方法,并提供了相应的CA$E工具来建立系统分析模型和系统设 15
面向对象软件工程实践指南 15 第 2 章 面向对象软件过程 软件过程给出了为形成最终的软件所需要完成的任务的框架,它包括了整个过程中有 哪些任务,每个任务所需要的资源、角色,每个任务需要使用的工具、方法,任务的输入和 输出,任务之间的相互关系等。软件过程是影响软件开发的全局性因素,软件过程是否合理 将给软件开发带来全面的影响。 不同的软件工程方法学将渗透在软件过程中。软件过程模型是指导软件过程的模板。 按照软件过程模型,依据要开发的软件的特点,将形成具体的软件过程。随着软件开发实践 的不断积累和学术界的总结,目前出现了不同种类的软件过程模型。 面向对象首先作为一种开发思想而存在,然后面向对象思想与开发活动相结合,产生 了面向对象方法,面向对象方法贯穿软件过程的始终,形成了面向对象软件过程。在本章中, 我们将简要介绍面向对象方法的发展,并对面向对象分析、面向对象设计、面向对象实现、 面向对象测试进行介绍,最后介绍面向对象软件过程的整体流程。 2.1 面向对象方法的发展 在面向对象方法发展的过程中,有几个方法具有较大的影响力,它们是 Grady Booch 提出的面向对象开发方法 OOAD、Ivar Jacobson 的 OOSE 方法和 James Rumbaugh 的 OMT 方法。 1. Grady Booch 的面向对象方法 OOAD 1986 年,面向对象方法的最早倡导者之一 Grady Booch 提出了面向对象分析与设计方法 (Object-Oriented Analysis and Design, OOAD)。Booch 认为开发过程为螺旋上升模式,每一步 重复的步骤如下: (1) 从应用的问题域发现类和对象; (2) 分析类和对象的功能、行为,确定属性和操作; (3) 找出类、对象之间的关系; (4) 说明每个类和对象的实现。 Booch 开发模型包含四种模型:逻辑模型、物理模型、静态模型和动态模型,逻辑模 型描述系统的类结构和对象结构,分别用类图和对象图表示;物理模型描述系统的模块结构 和进程结构,分别用模型图和进程图表示;静态模型描述系统的静态组成结构;动态模型描 述系统执行过程中的行为,用状态图和交互图表示。 2. Ivar Jacobson 的面向对象方法 OOSE Jacobson 的面向对象软件工程(Object-Oriented Software Engineering, OOSE)方法提出 了一种用例驱动的面向对象方法,并提供了相应的 CASE 工具来建立系统分析模型和系统设
面向对象软件工程实践指南 计模型。OOSE方法建立面向对象分析模型包含两个步骤:建立用户需求模型和建立系统分 析模型:建立面向对象设计模型步骤为:创建模块作为主要的设计对象,创建显示消息传递 的交互图,组织模块成子系统和复审设计工作。 3.Jim Rumbaugh的面向对象方法OMT OMT(Object Mode Technology,OMT)方法是由Jim Rumbaugh等提出的。该技术采用 对象模型、动态模型和功能模型来描述系统。对象模型描述系统中对象的结构:动态模型描 述系统与时间和操作顺序有关的系统特征:功能模型描述与数值变化有关的系统特征。 三者对比,OOAD比较复杂,适合于面向对象的设计,而对分析的支持不够:OMT相 对简单,适合于分析,而对设计的支持不够:OOSE中提出了用例的方法,它适合于高层设 计。 这三种方法最后进行了融合,加之其它企业的加入,导致了统一建模语言(Unified Modeling Language,UML)的诞生。关于UML的具体介绍,我们将在第三章给出。 2.3面向对象分析、设计与实现 2.3.1面向对象分析 面向对象分析(Object Oriented Analysis,OOA)是运用面向对象的方法进行需求分析, 抽取和整理用户需求并建立应用领域的面向对象模型的过程。面向对象分析过程,首先是建 模,通常需要建立四种形式的模型:对象(静态)模型、用例(功能)模型、动态行为模型 和物理实现模型。这四种模型从不同的角度描述目标系统,相互补充,相互配合,使得人们 对系统的认识更加全面。根据所解决的问题类型不同,各模型重要性也不同,其中对象模型 是核心,是用例模型和动态行为模型的框架。 ●对象模型 对象模型是面向对象方法中最基础、最核心的模型。该模型主要考虑系统中对象的结构、 属性与操作,以及对象之间关系的映射。该模型是对客观世界的对象和对象关系的静态描述, 为建立用例模型和动态模型提供了实质性的框架。在UML中,对象模型常用类图和对象图 来描述。 ●用例模型 用例模型一般从用户需求的角度来描述系统,指明系统应该做什么,描述数据在系统中 的变换过程和系统的功能,是整个后续工作的基础,也是测试和验收的依据。在UML中, 用例模型用用例图来描述。 ●动态模型 16
面向对象软件工程实践指南 16 计模型。OOSE 方法建立面向对象分析模型包含两个步骤:建立用户需求模型和建立系统分 析模型;建立面向对象设计模型步骤为:创建模块作为主要的设计对象,创建显示消息传递 的交互图,组织模块成子系统和复审设计工作。 3. Jim Rumbaugh 的面向对象方法 OMT OMT(Object Mode Technology,OMT)方法是由 Jim Rumbaugh 等提出的。该技术采用 对象模型、动态模型和功能模型来描述系统。对象模型描述系统中对象的结构;动态模型描 述系统与时间和操作顺序有关的系统特征;功能模型描述与数值变化有关的系统特征。 三者对比,OOAD 比较复杂,适合于面向对象的设计,而对分析的支持不够;OMT 相 对简单,适合于分析,而对设计的支持不够;OOSE 中提出了用例的方法,它适合于高层设 计。 这三种方法最后进行了融合,加之其它企业的加入,导致了统一建模语言(Unified Modeling Language, UML)的诞生。关于 UML 的具体介绍,我们将在第三章给出。 2.3 面向对象分析、设计与实现 2.3.1 面向对象分析 面向对象分析(Object Oriented Analysis,OOA)是运用面向对象的方法进行需求分析, 抽取和整理用户需求并建立应用领域的面向对象模型的过程。面向对象分析过程,首先是建 模,通常需要建立四种形式的模型:对象(静态)模型、用例(功能)模型、动态行为模型 和物理实现模型。这四种模型从不同的角度描述目标系统,相互补充,相互配合,使得人们 对系统的认识更加全面。根据所解决的问题类型不同,各模型重要性也不同,其中对象模型 是核心,是用例模型和动态行为模型的框架。 对象模型 对象模型是面向对象方法中最基础、最核心的模型。该模型主要考虑系统中对象的结构、 属性与操作,以及对象之间关系的映射。该模型是对客观世界的对象和对象关系的静态描述, 为建立用例模型和动态模型提供了实质性的框架。在 UML 中,对象模型常用类图和对象图 来描述。 用例模型 用例模型一般从用户需求的角度来描述系统,指明系统应该做什么,描述数据在系统中 的变换过程和系统的功能,是整个后续工作的基础,也是测试和验收的依据。在 UML 中, 用例模型用用例图来描述。 动态模型