Hore为代表的数学观,以Bertrand Meyer为代表的工程观,以var Jacobson为代表的建模观 等。而在现实生活中,许多程序员还认为软件开发是个手工艺活,还有一些人甚至把软件开发 看作是一门“艺术”一不同的人发挥自己的创造力写出迥然不同的代码。因而,要使得软件 开发逐步成熟,要大力传播软件工程的思想,同时软件工程自身还需要不断发展完善。 1.2 软件工程基本思想 无论是传统软件工程还是面向对象软件工程,它们都体现了一些共同的思想,这些思想主 要有:抽象,分解,分类,复用。 1.2.1抽象 抽象,是人类解决复杂问题的通用方法。抽象是从众多的事物中抽取出共同的、本质性的 特征,而舍弃其非本质的特征。通过硬件基础上运行的软件来解决实际问题时,软件中的概念 和实际问题中的概念是有区别的,因此必须采用抽象来实现实际问题在软件世界中的映射。 在传统软件工程中,问题被映射成函数、数据结构、算法等软件概念,而在面向对象软件工程 中,问题被映射成对象、类以及它们之间的关系,由于对象、类模拟了现实世界,这种抽象更容 易理解。为了实现从问题领域到软件领域的映射,软件工程把软件开发分成了多个阶段,每一 个阶段中提供了多种模型来完成任务,而模型本身就是一种抽象表达。 1.2.2分解 分解,也是人类解决复杂问题的通用方法。所谓分解,就是把复杂的系统变成小的系统, 采用“各个击破”的原则逐一解决。由于软件本身比较复杂,作为一个整体开发存在一定困难, 因此,把软件系统分解成一个个小系统,这样就可以大大降低开发难度。传统的软件工程在分 解时,从功能角度出发,各个子系统都对应了一部分功能;而面向对象的软件工程中,把系统分 解为一个个对象,通过定义对象间的交互来完成所有的功能。分解也促进了软件重用,由于每 一个小的单元(子系统、模块、类、函数)具备一定的功能,在未来的软件开发中可以再次使用, 那些具有一定通用性的软件,甚至可以构成一个可重用软件库。 1.2.3复用 复用,就是利用已有的代码,或者已有的知识、经验编写代码,以进行新的软件开发。复用 可以节省很大一部分时间和精力,从而提高开发效率。复用的软件大多经过很长时间的检验, 这样可以减少开发过程中可能出现的错误。小部分的创新加上大部分的已有成果来完成新项 目,因此利用复用可以高效而又高质量地完成软件开发工作。 复用的形式有多种多样,主要的形式为程序库、类库、软件服务、应用框架、设计模式等。 (1)程序库是代码复用最直接的例子。有很多的函数或者模块在软件之间都是通用的, 比如说对一个数组的排序函数,文件的读、写函数等。将这些函数、模块封装在一个程序库中, 后续进行开发工作的程序员只需要简单地进行调用就可以了。程序库的好处是显而易见的: 程序员通过调用相应函数或模块,可以提高开发的效率;同时,程序库中的操作一定是经过充 006
006 Hore为代表的数学观,以BertrandMeyer为代表的工程观,以IvarJacobson为代表的建模观 等。而在现实生活中,许多程序员还认为软件开发是个手工艺活,还有一些人甚至把软件开发 看作是一门“艺术”———不同的人发挥自己的创造力写出迥然不同的代码。因而,要使得软件 开发逐步成熟,要大力传播软件工程的思想,同时软件工程自身还需要不断发展完善。 1.2 软件工程基本思想 无论是传统软件工程还是面向对象软件工程,它们都体现了一些共同的思想,这些思想主 要有:抽象,分解,分类,复用。 1.2.1 抽象 抽象,是人类解决复杂问题的通用方法。抽象是从众多的事物中抽取出共同的、本质性的 特征,而舍弃其非本质的特征。通过硬件基础上运行的软件来解决实际问题时,软件中的概念 和实际问题中的概念是有区别的,因此必须采用抽象来实现实际问题在软件世界中的映射。 在传统软件工程中,问题被映射成函数、数据结构、算法等软件概念,而在面向对象软件工程 中,问题被映射成对象、类以及它们之间的关系,由于对象、类模拟了现实世界,这种抽象更容 易理解。为了实现从问题领域到软件领域的映射,软件工程把软件开发分成了多个阶段,每一 个阶段中提供了多种模型来完成任务,而模型本身就是一种抽象表达。 1.2.2 分解 分解,也是人类解决复杂问题的通用方法。所谓分解,就是把复杂的系统变成小的系统, 采用“各个击破”的原则逐一解决。由于软件本身比较复杂,作为一个整体开发存在一定困难, 因此,把软件系统分解成一个个小系统,这样就可以大大降低开发难度。传统的软件工程在分 解时,从功能角度出发,各个子系统都对应了一部分功能;而面向对象的软件工程中,把系统分 解为一个个对象,通过定义对象间的交互来完成所有的功能。分解也促进了软件重用,由于每 一个小的单元(子系统、模块、类、函数)具备一定的功能,在未来的软件开发中可以再次使用, 那些具有一定通用性的软件,甚至可以构成一个可重用软件库。 1.2.3 复用 复用,就是利用已有的代码,或者已有的知识、经验编写代码,以进行新的软件开发。复用 可以节省很大一部分时间和精力,从而提高开发效率。复用的软件大多经过很长时间的检验, 这样可以减少开发过程中可能出现的错误。小部分的创新加上大部分的已有成果来完成新项 目,因此利用复用可以高效而又高质量地完成软件开发工作。 复用的形式有多种多样,主要的形式为程序库、类库、软件服务、应用框架、设计模式等。 (1)程序库是代码复用最直接的例子。有很多的函数或者模块在软件之间都是通用的, 比如说对一个数组的排序函数,文件的读、写函数等。将这些函数、模块封装在一个程序库中, 后续进行开发工作的程序员只需要简单地进行调用就可以了。程序库的好处是显而易见的: 程序员通过调用相应函数或模块,可以提高开发的效率;同时,程序库中的操作一定是经过充
分测试后正确的代码,减少了出错的可能。 (2)类库是面向对象软件开发时实现复用的有效方式。将普遍需要的类放入类库,在软 件开发时可以直接使用这些类来创建对象,或者通过继承这些类并加以修改和扩充产生所需 要的子类。 (3)软件服务:随着互联网、Wb服务、Web API、云计算等技术的发展,在开发过程中可 以直接利用由服务提供商提供的服务或者API来构建系统,而无须了解实现服务的具体代码 和服务运行的具体方式。 (4)软件开发者可以采用第三方的应用程序或应用框架实现代码的复用。这种代码复用 往往范围比较大,可以在很大程度上提高开发效率。 (5)设计模式是许多年软件开发经验的结晶,它对各类问题提供了一些具有普遍借鉴意 义的解决方法。因而设计模式的重用实际上代表了一种知识的重用。 1.3传统软件工程 目前使用得最广泛的软件工程方法学,分别是传统软件工程和现代软件工程。传统软件 工程,主要指的是生命周期方法下的软件工程,是20世纪60年代为摆脱“软件危机”出现的工 程学。它采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件工程环 境来支持结构化技术的运用。该方法把软件生命周期的全过程依次划分为需求分析、总体设 计与详细设计、编码、测试、维护等几个主要阶段,然后顺序地完成每个阶段的任务。每个阶段 的开始和结束都有严格的标准,必须经过正式严格的技术审查和管理审查,前一阶段的结束标 准就是后一个阶段的开始标准。其中,审查最主要的标准就是每个阶段都应该提交“最新的” 高质量的文档。 1)需求分析 该阶段的主要工作是对待开发软件提出的需求进行分析并给出详细的定义。该阶段的输 出为软件需求说明书及初步的系统用户手册。 2)总体设计 以需求分析为结果,设计出总体的系统构架。包括模块的划分、数据传送与共享等内容。 该阶段的输出为概要设计说明书。 3)详细设计 在总体设计的基础上,设计模块内部的结构,包括界面设计、算法设计、数据库的设计等。 该阶段的输出为详细设计说明书。 4)编码 将设计模型映射为代码,用代码来实现设计的功能。利用编程语言,将人类的思想转变为 能被计算机理解和执行的程序,该阶段的输出为程序代码。 5)测试 在设计或编码的过程中,会出现一些纰漏或者错误。测试的作用是不断验证已有系统的 功能,排除错误,完善系统。该阶段的具体任务包括单元测试、集成测试、验收测试等,输出为 测试报告。 1007
007 分测试后正确的代码,减少了出错的可能。 (2)类库是面向对象软件开发时实现复用的有效方式。将普遍需要的类放入类库,在软 件开发时可以直接使用这些类来创建对象,或者通过继承这些类并加以修改和扩充产生所需 要的子类。 (3)软件服务:随着互联网、Web服务、WebAPI、云计算等技术的发展,在开发过程中可 以直接利用由服务提供商提供的服务或者API来构建系统,而无须了解实现服务的具体代码 和服务运行的具体方式。 (4)软件开发者可以采用第三方的应用程序或应用框架实现代码的复用。这种代码复用 往往范围比较大,可以在很大程度上提高开发效率。 (5)设计模式是许多年软件开发经验的结晶,它对各类问题提供了一些具有普遍借鉴意 义的解决方法。因而设计模式的重用实际上代表了一种知识的重用。 1.3 传统软件工程 目前使用得最广泛的软件工程方法学,分别是传统软件工程和现代软件工程。传统软件 工程,主要指的是生命周期方法下的软件工程,是20世纪60年代为摆脱“软件危机”出现的工 程学。它采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件工程环 境来支持结构化技术的运用。该方法把软件生命周期的全过程依次划分为需求分析、总体设 计与详细设计、编码、测试、维护等几个主要阶段,然后顺序地完成每个阶段的任务。每个阶段 的开始和结束都有严格的标准,必须经过正式严格的技术审查和管理审查,前一阶段的结束标 准就是后一个阶段的开始标准。其中,审查最主要的标准就是每个阶段都应该提交“最新的” 高质量的文档。 1)需求分析 该阶段的主要工作是对待开发软件提出的需求进行分析并给出详细的定义。该阶段的输 出为软件需求说明书及初步的系统用户手册。 2)总体设计 以需求分析为结果,设计出总体的系统构架。包括模块的划分、数据传送与共享等内容。 该阶段的输出为概要设计说明书。 3)详细设计 在总体设计的基础上,设计模块内部的结构,包括界面设计、算法设计、数据库的设计等。 该阶段的输出为详细设计说明书。 4)编码 将设计模型映射为代码,用代码来实现设计的功能。利用编程语言,将人类的思想转变为 能被计算机理解和执行的程序,该阶段的输出为程序代码。 5)测试 在设计或编码的过程中,会出现一些纰漏或者错误。测试的作用是不断验证已有系统的 功能,排除错误,完善系统。该阶段的具体任务包括单元测试、集成测试、验收测试等,输出为 测试报告。
6)维护 在使用中对发现的错误进行修改或者针对变化的需求对软件进行修改。具体包括三种类 型的维护:改正性维护、适应性维护和完善性维护。其中,改正性维护主要对运行中发现的软 件错误进行修正,适应性维护主要为了适应变化了的软件工作环境而进行适当的变更,完善性 维护则主要针对软件需求的变化而做变更。 传统的软件工程学是符合工程学原理的一套体系。传统软件工程学的出现,很大程度上 解决了“软件危机”中的一些问题。其优点主要有两个方面:一是将软件的生命周期划分为若 干个独立的阶段,便于不同人员分工协作:二是在每个阶段结束前都进行严格的审查,可有效 地保证软件的质量。 然而,传统软件工程最主要的问题是缺乏灵活性,它要求必须在项目开始前说明全部需 求,但这恰恰是非常困难的。当软件规模比较大,并且软件的需求是模糊的或者随时间变化而 变化时,传统软件工程就会存在很多问题。同时,传统的软件工程采用了结构化的技术来完成 软件开发的各项任务,比较明显的问题是开发效率比较低下,软件中代码的复用率低,软件维 护比较困难。由于传统软件工程强调更多的是模块化,各个小模块组成了系统的功能。随着 用户需求的改变和技术的发展,模块经常需要改变。而这是传统软件工程很难处理的情况,因 为局部功能模块的修改甚至可能带来整个系统的改变。低下的开发效率和代码复用率成为了 传统软件工程继续发展的瓶颈。 1.4面向对象方法学 现代软件工程主要指的是面向对象的软件工程。所谓面向对象,就是针对现实中客观存 在的事物进行软件开发。这是类似于人的直观思维方式的。 众所周知,客观世界是由许多不同的具有自己的运动规律和内部状态的对象构成。不同 的对象之间相互作用和交互形成了完整的客观世界。因此,从思维模式的角度,面向对象与客 观世界相对应,对象概念就是现实世界中对象的模型化。从人类认知过程的角度来看,面向对 象的方法既提供了从一般到特殊的演绎手段(如继承),又提供了从特殊到一般的归纳形式(如 类目)。面向对象方法学是遵循一般认知方法学的 现实问题空间 面向对象解空间 基本概念而建立起来的完整理论和方法体系。因 此,面向对象方法学也是一种认知方法学。 从软件技术角度来讲,面向对象方法起源于信 物质 对象 息隐蔽和抽象数据类型概念,它以对象作为基本单 位,把系统中所有资源,如数据、模块以及系统都看 I 成对象,每个对象把一组数据和一组过程封装在一 起。面向对象方法是面向对象技术在软件工程的全 意识 面应用。如图1一3所示,面向对象方法从现实世界 中的问题域直接抽象,确定对象,根据对象的特性抽 象,用类来描述相同属性的对象,而类又分成不同的 图1-3从现实问题到对象解空间映射 抽象层次,类成为面向对象设计的最基本模块,它封 008
008 6)维护 在使用中对发现的错误进行修改或者针对变化的需求对软件进行修改。具体包括三种类 型的维护:改正性维护、适应性维护和完善性维护。其中,改正性维护主要对运行中发现的软 件错误进行修正,适应性维护主要为了适应变化了的软件工作环境而进行适当的变更,完善性 维护则主要针对软件需求的变化而做变更。 传统的软件工程学是符合工程学原理的一套体系。传统软件工程学的出现,很大程度上 解决了“软件危机”中的一些问题。其优点主要有两个方面:一是将软件的生命周期划分为若 干个独立的阶段,便于不同人员分工协作;二是在每个阶段结束前都进行严格的审查,可有效 地保证软件的质量。 然而,传统软件工程最主要的问题是缺乏灵活性,它要求必须在项目开始前说明全部需 求,但这恰恰是非常困难的。当软件规模比较大,并且软件的需求是模糊的或者随时间变化而 变化时,传统软件工程就会存在很多问题。同时,传统的软件工程采用了结构化的技术来完成 软件开发的各项任务,比较明显的问题是开发效率比较低下,软件中代码的复用率低,软件维 护比较困难。由于传统软件工程强调更多的是模块化,各个小模块组成了系统的功能。随着 用户需求的改变和技术的发展,模块经常需要改变。而这是传统软件工程很难处理的情况,因 为局部功能模块的修改甚至可能带来整个系统的改变。低下的开发效率和代码复用率成为了 传统软件工程继续发展的瓶颈。 1.4 面向对象方法学 现代软件工程主要指的是面向对象的软件工程。所谓面向对象,就是针对现实中客观存 在的事物进行软件开发。这是类似于人的直观思维方式的。 众所周知,客观世界是由许多不同的具有自己的运动规律和内部状态的对象构成。不同 的对象之间相互作用和交互形成了完整的客观世界。因此,从思维模式的角度,面向对象与客 观世界相对应,对象概念就是现实世界中对象的模型化。从人类认知过程的角度来看,面向对 象的方法既提供了从一般到特殊的演绎手段(如继承),又提供了从特殊到一般的归纳形式(如 图1 3 从现实问题到对象解空间映射 类目)。面向对象方法学是遵循一般认知方法学的 基本概念而建立起来的完整理论和方法体系。因 此,面向对象方法学也是一种认知方法学。 从软件技术角度来讲,面向对象方法起源于信 息隐蔽和抽象数据类型概念,它以对象作为基本单 位,把系统中所有资源,如数据、模块以及系统都看 成对象,每个对象把一组数据和一组过程封装在一 起。面向对象方法是面向对象技术在软件工程的全 面应用。如图1 3所示,面向对象方法从现实世界 中的问题域直接抽象,确定对象,根据对象的特性抽 象,用类来描述相同属性的对象,而类又分成不同的 抽象层次,类成为面向对象设计的最基本模块,它封
装了描述该类的数据和操作,数据描述了对象具体的状态,而操作确定了对象的行为。 1.4.1面向对象方法学的起源 面向对象方法学的发展历史大致可以划分为四个阶段。 1)萌芽阶段(20世纪50年代) 在20世纪50年代初,面向对象方法中的“对象”“属性”等概念第一次出现在关于人工智 能的著作中。到50年代后期,随着面向对象的编程语言(object-oriented programming language,.OOPL)的出现,面向对象的思想开始真正的蓬勃发展。为了避免变量名在不同部 分发生冲突,ALGOL语言的设计者在ALGOL60中采用了以“Begin..End”为标识的程序 块,使得块内变量名是局部的,从而避免它们与程序中块外的同名变量相冲突。这是编程语言 中首次提供封装的尝试。此后程序块结构广泛用于高级语言如Pascal、.Ada、C之中。 2)初期阶段(20世纪60年代) 20世纪60年代中期,由挪威计算中心和奥斯陆大学共同研制的Simula语言,在ALGOL 基础上,首次引入了类、继承和对象等概念,成为面向对象方法学在软件工程领域的起源标志。 在Simula67影响下,70年代Xerox PARC研究所发明了以类为核心概念的Smalltalk编程语 言。在Smalltalk中,对象和消息广泛地应用在了基础的运算中,而且相比Simula67, Smalltalk中的对象是动态的,而并非Simula中的静态对象。在Smalltalk之后,在l980年, Xerox研究中心又推出Smalltalk-80系统,其强调了对象概念的统一,并引入了方法、实例等 概念和术语,应用了单重继承机制和动态链接。它从界面、环境、工具、语言以及软件可重用等 方面对软件开发工作提供了较为全面的支持,使得面向对象程序设计趋于完善,掀起了面向对 象研究的高潮。 3)发展阶段(20世纪80年代中期到90年代) 该阶段,受到Smalltalk-80的影响,大批面向对象编程语言相继涌出,如Object-C、 Eiffel、.C++、Java、Object-Pascal等。 20世纪80年代中期,C语言扩展到面向对象的领域上,于是C十十在80年代应运而生。 C十十保留了C语言的原有特性,同时增加了面向对象的支持。因此,C十十是一种既支持面 向过程编程,又支持面向对象编程的混合式编程语言。 在C十十之后,Java和C#是最为广泛应用的面向对象编程语言。它们都引入了虚拟机 的概念,且语法上都与C和C十十相近。这两种语言是更为纯粹的面向对象语言。近些年来 动态语言如Python、Ruby的流行,又推动了面向对象技术的发展。 1989年,Object Management Group(OMG)公司建立。OMG的使命是建立工业标准,细 化对象管理描述和应用开发的通用框架。统一建模语言(unified modeling language,UML) 就是由OMG维护的众所周知的描述之一。UML是为软件系统的制品进行描述、可视化、构 造、归档化的一种语言。它同样适用于商业模块和其他非软件系统。 4)成熟阶段(20世纪90年代之后) 自l990年,面向对象分析(object oriented analysis,OOA)和面向对象设计(object oriented design,OOD)被广泛研究,许多专家都在尝试不同的方法进行面向对象分析和设计。 其中比较著名的方法有Grady Booch方法、Jocobson的OOSE方法、Rumbaugh的OMT方法 等,这些方法各有所长。这段时期,面向对象分析和设计技术逐渐走向实用,最终形成了从分 |009
009 装了描述该类的数据和操作,数据描述了对象具体的状态,而操作确定了对象的行为。 1.4.1 面向对象方法学的起源 面向对象方法学的发展历史大致可以划分为四个阶段。 1)萌芽阶段(20世纪50年代) 在20世纪50年代初,面向对象方法中的“对象”“属性”等概念第一次出现在关于人工智 能的著作中。到50年代后期,随着面向对象的编程语言(objectorientedprogramming language,OOPL)的出现,面向对象的思想开始真正的蓬勃发展。为了避免变量名在不同部 分发生冲突,ALGOL语言的设计者在ALGOL60中采用了以“Begin...End”为标识的程序 块,使得块内变量名是局部的,从而避免它们与程序中块外的同名变量相冲突。这是编程语言 中首次提供封装的尝试。此后程序块结构广泛用于高级语言如Pascal、Ada、C之中。 2)初期阶段(20世纪60年代) 20世纪60年代中期,由挪威计算中心和奥斯陆大学共同研制的Simula语言,在ALGOL 基础上,首次引入了类、继承和对象等概念,成为面向对象方法学在软件工程领域的起源标志。 在Simula67影响下,70年代XeroxPARC研究所发明了以类为核心概念的Smalltalk编程语 言。在Smalltalk中,对象和消息广泛地应用在了基础的运算中,而且相比 Simula67, Smalltalk中的对象是动态的,而并非Simula中的静态对象。在Smalltalk之后,在1980年, Xerox研究中心又推出Smalltalk 80系统,其强调了对象概念的统一,并引入了方法、实例等 概念和术语,应用了单重继承机制和动态链接。它从界面、环境、工具、语言以及软件可重用等 方面对软件开发工作提供了较为全面的支持,使得面向对象程序设计趋于完善,掀起了面向对 象研究的高潮。 3)发展阶段(20世纪80年代中期到90年代) 该阶段,受到Smalltalk 80的影响,大批面向对象编程语言相继涌出,如 Object C、 Eiffel、C++、Java、Object Pascal等。 20世纪80年代中期,C语言扩展到面向对象的领域上,于是C++在80年代应运而生。 C++保留了C语言的原有特性,同时增加了面向对象的支持。因此,C++是一种既支持面 向过程编程,又支持面向对象编程的混合式编程语言。 在C++之后,Java和C#是最为广泛应用的面向对象编程语言。它们都引入了虚拟机 的概念,且语法上都与C和C++相近。这两种语言是更为纯粹的面向对象语言。近些年来 动态语言如Python、Ruby的流行,又推动了面向对象技术的发展。 1989年,ObjectManagementGroup(OMG)公司建立。OMG的使命是建立工业标准,细 化对象管理描述和应用开发的通用框架。统一建模语言(unifiedmodelinglanguage,UML) 就是由OMG维护的众所周知的描述之一。UML是为软件系统的制品进行描述、可视化、构 造、归档化的一种语言。它同样适用于商业模块和其他非软件系统。 4)成熟阶段(20世纪90年代之后) 自1990年,面向对象分析(objectorientedanalysis,OOA)和面向对象设计(object orienteddesign,OOD)被广泛研究,许多专家都在尝试不同的方法进行面向对象分析和设计。 其中比较著名的方法有GradyBooch方法、Jocobson的OOSE方法、Rumbaugh的OMT方法 等,这些方法各有所长。这段时期,面向对象分析和设计技术逐渐走向实用,最终形成了从分
析、设计、编程、测试到维护的一整套软件开发体系。其中在支持面向对象建模的方法学的竞 技中,统一建模语言UML最终成为建模领域的标准。 1.4.2面向对象方法学的核心概念 面向对象方法学可以用下式表述: 面向对象方法学=对象十类十继承十基于消息的通信 即面向对象使用了对象、类和继承的机制,同时对象之间只能通过传递消息来实现相互通信。 1)对象(object):一切都是对象 自然界存在的一切事物都可以称作对象。例如学生是对象,老师是对象,教室是对象,一 个学校也是一个对象。对象是其自身所具有的状态特征和作用于这些状态特征的操作集合一 起构成的独立实体。对象包含两个要素:描述对象静态特征的属性和描述对象动态特征的操 作。对象是面向对象方法学的基本单位,是构成和支持整个面向对象方法学的基石。 2)类(class):物以类聚 类是对具有相同属性、特征和服务的一个或一组对象的抽象定义。类与对象是抽象描述 与具体实例的关系,一个具体的对象称作类的一个实例(instance)。例如学生是对所有种类的 学生的抽象,某个学生小张可以看作是学生类型的一个实例。 3)继承(inheritance.):世界的相似性与多样性 世界万物既有相似性,又有多样性。通过继承机制,可以达到相似性与多样性的统一。一 方面子类继承父类定义的属性和操作,另一方面,子类又可以添加自己的属性和操作,或者通 过多态机制使得父类中定义的操作有自己的实现。 4)基于消息的通信(communication with message):消息,合作之道 消息(message)是面向对象软件中对象之间交互的途径,是对象之间建立的一种通信机 制。通常是指向其他对象发出服务请求或者参与处理其他对象发来的请求。一条消息的必备 信息有:消息名、消息请求者、消息响应者、消息所要求的具体服务和参数等。 消息通信(communication with messages)也是面向对象方法学中的一条重要原则,它与 对象的封装原则密不可分。封装使对象成为一些各司其职、互不干扰的独立单位:消息通信则 为它们提供了唯一合法的动态联系途径,使它们的行为能够互相配合,构成一个有机的系统。 1.4.3面向对象的特性 1)抽象(abstraction) 抽象是指强调实体的本质、内在的属性和行为,而忽略一些无关的属性和行为。抽象描述 了一个对象的内涵,可以将对象与所有其他类型的对象区分开来。对于给定的问题域决定一 组正确的抽象是面向对象设计的核心问题。 2)封装(encapsulation) 封装是指把对象的属性和操作结合成一个独立的系统单位,并尽可能的隐藏对象的内部 细节。封装是对象和类的一个基本特性,又称信息隐藏。通过对象的封装性,用户只能看到对 象封装界面上的信息,对象内部对用户是透明的,从而有效地实现了模块化功能。封装可以使 对象形成接口和实现两个部分,将功能和实现分离,避免错误操作。 010
010 析、设计、编程、测试到维护的一整套软件开发体系。其中在支持面向对象建模的方法学的竞 技中,统一建模语言UML最终成为建模领域的标准。 1.4.2 面向对象方法学的核心概念 面向对象方法学可以用下式表述: 面向对象方法学=对象+类+继承+基于消息的通信 即面向对象使用了对象、类和继承的机制,同时对象之间只能通过传递消息来实现相互通信。 1)对象(object):一切都是对象 自然界存在的一切事物都可以称作对象。例如学生是对象,老师是对象,教室是对象,一 个学校也是一个对象。对象是其自身所具有的状态特征和作用于这些状态特征的操作集合一 起构成的独立实体。对象包含两个要素:描述对象静态特征的属性和描述对象动态特征的操 作。对象是面向对象方法学的基本单位,是构成和支持整个面向对象方法学的基石。 2)类(class):物以类聚 类是对具有相同属性、特征和服务的一个或一组对象的抽象定义。类与对象是抽象描述 与具体实例的关系,一个具体的对象称作类的一个实例(instance)。例如学生是对所有种类的 学生的抽象,某个学生小张可以看作是学生类型的一个实例。 3)继承(inheritance):世界的相似性与多样性 世界万物既有相似性,又有多样性。通过继承机制,可以达到相似性与多样性的统一。一 方面子类继承父类定义的属性和操作,另一方面,子类又可以添加自己的属性和操作,或者通 过多态机制使得父类中定义的操作有自己的实现。 4)基于消息的通信(communicationwithmessage):消息,合作之道 消息(message)是面向对象软件中对象之间交互的途径,是对象之间建立的一种通信机 制。通常是指向其他对象发出服务请求或者参与处理其他对象发来的请求。一条消息的必备 信息有:消息名、消息请求者、消息响应者、消息所要求的具体服务和参数等。 消息通信(communicationwithmessages)也是面向对象方法学中的一条重要原则,它与 对象的封装原则密不可分。封装使对象成为一些各司其职、互不干扰的独立单位;消息通信则 为它们提供了唯一合法的动态联系途径,使它们的行为能够互相配合,构成一个有机的系统。 1.4.3 面向对象的特性 1)抽象(abstraction) 抽象是指强调实体的本质、内在的属性和行为,而忽略一些无关的属性和行为。抽象描述 了一个对象的内涵,可以将对象与所有其他类型的对象区分开来。对于给定的问题域决定一 组正确的抽象是面向对象设计的核心问题。 2)封装(encapsulation) 封装是指把对象的属性和操作结合成一个独立的系统单位,并尽可能的隐藏对象的内部 细节。封装是对象和类的一个基本特性,又称信息隐藏。通过对象的封装性,用户只能看到对 象封装界面上的信息,对象内部对用户是透明的,从而有效地实现了模块化功能。封装可以使 对象形成接口和实现两个部分,将功能和实现分离,避免错误操作。