1、第九章 面向对象方法学,西安电子科技大学计算机学院课程,第九章 面向对象方法学,9.1 软件开发面临的普遍性问题9.1.1 软件开发面临的普遍性问题1、CPU速度的提高近十年来一直服从摩尔定律;2、存储密度以每年100%的速度增长;3、网络带宽持续增长,接入方式多样化;4、移动通信、蓝牙(Blue tooth)技术扩大了应用领域;5、主流硬件始终没有突破冯诺曼体系结构。,第九章 面向对象方法学,Moore 定律单位平方英寸芯片的晶体管数目每过18月到24个月就增加一倍,第九章 面向对象方法学,9.1.2 应用的普及和深入对软件能力提出了更高要求软件能力(software capabilitie
2、s):软件开发过程中所采用的软件技术、软件工具和抽象层次等因素对开发目标所起的作用。软件能力是一种相对概念:产品的规模和(或)复杂程度改变时,同样的软件技术(工具、抽象层次)就呈现出不同的作用;产品特征不变时,不同的软件技术(工具、抽象层次)也将呈现出不同的作用。,第九章 面向对象方法学,1、采用更复杂的数据结构 表示复杂的实体 表示非结构化数据 非指针的关联数据结构 大量、不同种类数据结构的组织与使用 2、采用更复杂的体系结构 广泛采用分布式或客户/服务器结构 广泛采用多进程、多线程的并发结构 几乎没有不使用数据库的应用系统 基于多种操作系统 基于异构网络平台,第十一章 面向对象方法学,3、
3、提供用户定制及二次开发支持 用户可定制的I/O 基于可视化语言、Script或准自然语言的应用逻辑表示 系统配置与管理工具 易用的、多种语言的API 4、具有更高的安全性与可靠性 防范黑客和内部人员的非法侵入与恶意攻击 数据传输和存储的加密 持续的可靠运行 不间断运行的扩充与升级 灾难备份与恢复,第九章 面向对象方法学,5、生命期明显缩短 需求的不确定性与变更 互通、互操作范围的扩大 硬件与通信产品的发展 体系结构的进化 互联网应用的竞争压力 遗产(Legacy)系统的继承,9.1.3 残酷的市场竞争对软件企业提出了更高要求满足用户对工期与质量的近乎于苛刻的要求;持续提供系列化产品和优质服务;
4、面对技术人员的不稳定性与产品开发持续性的矛盾;面对技术创新的必要性、风险与代价;面对市场热点跟进与避免泡沫破裂的矛盾。,第九章 面向对象方法学,9.1.4 软件相对于硬件固有的弱势地位 硬件的平均重复度 软件的平均重复度; 硬件具有可见的空间表现,易于检测和评估; 硬件具有坚实的理论基础和工业化基础; 直接面向应用是软件的“天职”,而硬件以不变应多变; 硬件的质量衰减规律与软件恰巧相反,在软硬件之间确定质量问题的责任存在着困难。,第九章 面向对象方法学,9.1.5 软件开发技术落后的现实缺乏起指导作用的公理体系和基本原理,在实现之前不能准确地估计目标产品的特性; 成本集中于设计,而产品的制造与
5、销毁基本上没有成本,导致了惯用手法是尝试与纠错; 成功与失败的经验是质量保证的主要因素; 除了重用以外还没有更有效的提高生产率的手段。,第九章 面向对象方法学,9.2 面向对象技术对软件开发观念的影响9.2.1 确定可行的软件工业化目标 传统软件工程以软件的工程化开发为目标,强调方法论、工具与环境、质量保证体系、项目管理、配置管理,但基本理念是基于具体需求、从零开始的开发; 软件形式化开发以软件的自动化生产为目标,强调形式化需求描述、将需求自动转换为设计、程序自动生成与验证,但形式化描述的建立是高耗时、高成本的; 面向对象(OO)以软件的组装式生产为目标,强调各种软件重用、接口与表示和实现分离
6、、统一对象模型,继承和发展了传统软件工程,但目前缺少基础理论的支撑,因此从理念到实施可能失控和发散。,第九章 面向对象方法学,9.2.2 采用以状态保持与转换为特征的计算模型 OO技术将计算看成是一个系统的演变过程,系统由对象组成,经历一连串的状态变化以完成计算任务。 对象具有状态保持能力和自主计算能力。 OO设计和实现的重点是多个对象的网状组织结构和协同计算,而不是过程调用的层次结构。 本质上适应了并发、分布系统和互联网的计算特征。 9.2.3 减少软件开发阶段之间的模型差异 OO技术强调需求确定、逻辑设计、物理设计、程序设计、系统扩充与维护等各阶段的模型一致性,避免转换不同模型而引起的信息
7、损失。 不同阶段的模型差异在于详细与精确程度,支持不同阶段之间的回归。,第九章 面向对象方法学,9. 3. 1 面向对象方法简介面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。客观世界的问题都是由客观世界中的实体及实体相互间的关系构成的。我们把客观世界中的实体抽象为问题域中的对象(Object)。因为所要解决的问题具有特殊性,因此,对象是不固定的,由所要解决的问题决定。,第九章 面向对象方法学,从动态观点看,对对象施
8、加的操作就是该对象的行为。在问题空间中,对象的行为是极其丰富多彩的,然而解空间中的对象的行为却是非常简单呆板的。因此,只有借助于十分复杂的算法,才能操纵解空间对象从而得到解。这就是人们常说的“语义断层”,也是长期以来程序设计始终是一门学问的原因。通常,客观世界中的实体既具有静态的属性又具有动态的行为。然而传统语言提供的解空间对象实质上却仅是描述实体属性的数据,必须在程序中从外部对它施加操作,才能模拟它的行为。,第九章 面向对象方法学,面向对象方法是一种以数据或信息为主线,把数据和处理相结合的方法。面向对象方法把对象作为由数据及可以施加在这些数据上的操作所构成的统一体。概括地说,面向对象方法具有
9、下述四个要点:(1) 认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点,可以认为整个世界就是一个最复杂的对象。,第九章 面向对象方法学,(2) 把所有对象都划分成各种对象类(简称为类,Class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。例如:荧光屏上不同位置显示的半径不同的几个圆,虽然都是Circle类的对象,但是,各自都有自己专用的数据,以便记录各自的圆心位置、半径等等。类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,第九章
10、面向对象方法学,(3)按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(Inheritance)。但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。,第九章 面向对象方法学,(4) 对象彼此之间仅能通过传递消息互相联系。对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外
11、界直接对它的私有数据进行操作。综上所述,面向对象的方法学可用下列方程来概括:OO=Objects + Classes + Inheritance +Communication with messages也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。,第九章 面向对象方法学,9.3.2 面向对象方法的主要优点(1)与人类习惯的思维方法一致传统的程序设计技术是面向过程的设计方法,这种方法以算法为核心,把数据和过程作为相互独立的部分,数据代表问题空间中的客体,程序代码则用于处理这些数据。忽略了数据和操作之间的内在联系,用这种方法所设计出来的软件系统其
12、解空间与问题空间并不一致,令人感到难于理解。,第九章 面向对象方法学,面向对象的设计方法与传统的面向过程的方法有本质不同,这种方法的基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决。它强调模拟现实世界中的概念而不强调算法,它鼓励开发者在软件开发的绝大部分过程中都用应用领域的概念去思考 。 面向对象的软件开发过程从始至终都围绕着建立问题领域的对象模型来进行:对问题领域进行自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。,第九章 面向对象方法学,传统的软件开发方法可以用“瀑布”模型来描述
13、,这种方法强调自顶向下按部就班地完成软件开发工作。事实上,人们认识客观世界解决现实问题的过程,是一个渐进的过程,人的认识需要在继承以前的有关知识的基础上,经过多次反复才能逐步深化。面向对象方法学的出发点和基本原则,就是分析、设计和实现一个软件系统的方法和过程,尽可能接近人们认识世界解决问题的方法和过程,也就是使描述问题的问题空间和描述解法的解空间在结构上尽可能一致。也可以说,面向对象方法学的基本原则,是按照人们习惯的思维方式建立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。,第九章 面向对象方法学,(2) 稳定性好传统的软件开发方法以算法为核心,开发过程基于功能分析和功能分解。
14、用传统方法所建立起来的软件系统的结构紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。事实上,用户需求变化大部分是针对功能的,因此,这样的软件系统是不稳定的。面向对象方法基于构造问题领域的对象模型,以对象为中心构造软件系统。它的基本作法是用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。因为面向对象的软件系统的结构是根据问题领域的模型建立起来的,而不是基于对系统应完成的功能的分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。,第九章 面向对象方法学,(3)可重用性好用已有的零部件装配新的产品,是典型的重用技术,例
15、如,可以用已有的预制件建筑一幢结构和外形都不同于从前的新大楼。重用是提高生产率的最主要的方法。传统的软件重用技术是利用标准函数库,也就是试图用标准函数库中的函数作为“预制件”来建造新的软件系统。但是,标准函数缺乏必要的“柔性”,不能适应不同应用场合的不同需要,并不是理想的可重用的软件成分。实际的库函数往往仅提供最基本、最常用的功能,在开发一个新的软件系统时,通常多数函数是开发者自己编写的,甚至绝大多数函数都是新编的。,第九章 面向对象方法学,面向对象的软件技术有希望比较好地解决软件重用问题。对象所固有的封装性和信息隐藏等机理,使得对象内部的实现与外界隔离,具有较强的独立性。因此,对象类提供了比
16、较理想的模块化机制和比较理想的可重用的软件成分。面向对象的软件技术在利用可重用的软件成分构造新的软件系统时,它有很大的灵活性。有两种方法可以重复使用一个对象类;一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以重用其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地修改和扩充,这种修改并不影响对原有类的使用。由于可以像使用集成电路(IC)构造计算机硬件那样,比较方便地重用对象类来构造软件系统,因此,有人把此类称为“软件IC”。,第九章 面向对象方法学,(4)可维护性好用传统方法和面向过程语言开发出来的软件很难维护,是长期困
17、扰人们的一个严重问题,是软件危机的突出表现。由于下述因素的存在,使得用面向对象方法所开发的软件可维护性好:面向对象的软件稳定性比较好。当对软件的功能或性能的要求发生变化时,通常不会引起软件的整体变化,往往只需对局部作一些修改。由于对软件所需做的改动较小且限于局部,自然比较容易实现。,第九章 面向对象方法学,面向对象的软件比较容易修改。类是理想的模块机制,它的独立性好,修改一个类通常很少会牵扯到其他类。如果仅修改一个类的内部实现部分(私有数据成员或成员函数的算法),而不修改该类的对外接口,则可以完全不影响软件的基本部分。 面向对象的软件比较容易理解。在维护已有软件的时候,首先需要对原有软件与此个
18、性有关的部分有深入理解,才能正确地完成维护工作。传统软件之所以难于维护,在很大程度上是因为修改所涉及的部分分散在软件各个地方,需要了解的面很广,内容很多,而且传统软件的解空间与问题空间的结构很不一致,更增加了理解原有软件的难度和工作量。,第九章 面向对象方法学,面向对象的软件技术符合人们习惯的思维方式,用这种方法所建立的软件系统的结构与问题空间的结构基本一致。因此,面向对象的软件系统比较容易理解。对面向对象软件系统所做的修改和扩充,通常通过在原有类的基础上派生出一些新的类来实现。由于对象类有很强的独立性,当派生新类的时候通常不需要详细了解基类中操作的实现算法。因此,了解原有系统的工作量可以大幅
19、度下降。,第九章 面向对象方法学,易于测试和调试 对面向对象的软件进行维护,主要通过从已有类派生出一些新类来实现。因此,维护后的测试和调试工作也主要围绕这些新派生出来的类进行。类是独立性很强的模块,向类的实例发消息既可运行它,观察它是否能正确地完成要求它做的工作,对类的测试通常比较容易实现,如果发现错误也往往集中在类的内部,比较容易调试。总之,面向对象技术的优点并不是减少了开发时间,相反,初次使用这种技术开发软件,可能比用传统方法所需时间还稍微长一点。开发人员必须花很大精力去分析对象是什么,每个对象应该承担什么责任,所有这些对象怎样很好地合作以完成预定的目标。这样做换来的好处是,提高了目标系统
20、的可重用性,减少了生命周期后续阶段的工作量和可能犯的错误,提高了软件的可维护性。,第九章 面向对象方法学,9.3.3 两种新途径的结合为克服传统的生命周期方法学的缺点,人们在实践中创造出软件工程的许多新途径,前面扼要地介绍了其中两种主要的途径。事实上,这两种途径并不是相互排斥的,相反,它们是相互促进相互补充的,很容易把这两种途径结合起来以获得更好的效果。为快速建立原型,需要有适当的软件工具,目前可视化的第四代语言是比较流行的、支持原型法的软件工具。实际上,许多第四代语言都是面向对象的或基于对象的。,第九章 面向对象方法学,显然,面向对象方法所带来的稳定性、可重用性和可维护性等优点,对于用快速原
21、型法成功地开发软件来说,是至关重要的。不论采用何种技术方法开发软件,都必须完成一系列性质各异的工作。这些必须完成的工作要素是:确定“做什么”,确定“怎样做”,“实现”和“完善”。,第九章 面向对象方法学,9 .4.3 面向对象建模 为了更好地理解问题,人们常常采用建立问题模型的方法。所谓模型,就是为了理解事物面对事物作出的一种抽象,是对事物的一种无歧义的书面描述。通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。更进一步讲,模型是一种思考工具,利用这种工具可以把知识规范地表示出来。模型可以帮助我们思考问题、定义术语、在选择术语时作出适当的假设,并且可以
22、帮助我们保持定义和假设的一致性。,第九章 面向对象方法学,在对目标系统进行分析的初始阶段,面对大量模糊的、涉及众多专业领域的、错综复杂的信息,系统分析员往往感到无从下手。模型提供了组织大量信息的一种有效机制。一旦建立起模型之后,这个模型就要经受用户和各个领域专家的严格审查。由于模型的规范化和系统化,因此比较容易暴露出系统分析员对目标系统认识的片面性和不一致性。通过审查,往往会发现许多错误,发现错误是正常现象,这些错误可以在成为目标系统中的错误之前,就被预先清除掉。,第九章 面向对象方法学,用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是描述系统数据结构的对象模型,描述系统控制结构
23、的动态模型和描述系统功能的功能模型。这三种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这三种模型从三个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。一个典型的软件系统组合了上述三方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。,第九章 面向对象方法学,9.5 对象模型对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。面向对象方法强调围绕对象而不是围绕功能来构造系统。对象模型
24、为建立动态模型和功能模型,提供了实质性的框架。在建立对象模型时,我们的目标是从客观世界中提炼出对具体应用有价值的概念。为了建立对象模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则。对面向对象方法学的建立和发展作出过重大贡献的著名专家,如Grady Booch,Peter Coad & Ed Yourdon,James Rumbaugh合作研究,提出了统一建模语言UML。,第九章 面向对象方法学,与结构分析和结构设计方法不同,用面向对象方法开发软件时,没有必要在不同开发阶段使用不同的表示方法。现有的用于建立对象模型的表示方法,都包含下列符号: 表示类的符号(应该既能表示属
25、性又能表示服务); 表示对象(类实例)的符号; 表示继承关系的符号; 表示类和(或)对象间其他关系的符号。目前,还没有统一的、标准的表示方法。事实上,面向对象的概念是非常重要的,用于表示面向对象概念的符号的具体形式并不太重要。,第九章 面向对象方法学,9.5.1 表示类&对象的图形符号1.类&对象“类&对象”是一个专用术语,它的含义是“一个类及属于该类的对象”。类&对象符号由类符号外面再加一个虚线框组成,虚线框代表属于该类的对象。当不需要详细描述一个类内定义了哪些属性和服务时,可以仅在一个矩形框内写上类名代表该类;当不需要列出一个类所提供的服务时,可以仅用一条横线把代表该类的矩形框分成两半,上
26、半部分写上该类的名字,下半部分列出该类内定义的属性。,第九章 面向对象方法学,2.命名类名是一类对象的名字。命名是否恰当对系统的可理解性影响相当大,因此,命名时应该遵守以下几条准则:(1) 使用标准术语应该使用在应用领域中人们习惯的标准术语作为类名,不要随意创造名字。例如,“交通信号灯”比“信号单元”这个名字好,“传送带”比“零件传送设备”好。,第九章 面向对象方法学,(2) 使用具有确切含义的名词尽量使用能表示类&对象的含义的日常用语作名字,不要使用空洞的或含义模糊的词作名字。例如,“库房”比“房屋”或“存物场所”更确切。(3) 必要时用名词短语作名字为使名字的含义更准确,必要时用形容词加名
27、词或其他形式的名词短语作名字。例如,“最小的单元”、“储藏室”、“公司员工”等都是比较恰当的名字。,第九章 面向对象方法学,课程注册管理系统的类图,第九章 面向对象方法学,9.6 动态模型动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。一旦建立起对象模型之后,就需要考察对象的动态行为。通常,用状态图来描绘对象的状态、触发状态转换的事件、以及对象的行为(对事件的响应)。每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型。也就是说,动态模型是基于事件共享而互相关联的一组状态图的集合。,第九章 面向对象方法学,9.6
28、.1 术语1.事件事件是某个特定时刻所发生的事情,它是对引起对象从一种状态转换到另一种状态的现实世界中的事件的抽象。事件没有持续时间,是瞬间完成的。事件也就是信息从一个对象到另一个对象的单向传送。受此事件触发的第二个对象,可以发送答复事件也可以不发送答复事件,即使发送答复事件,它也是受第二个对象控制的一个独立事件。简而言之,事件就是引起对象状态转换的控制信息。,第九章 面向对象方法学,2. 状态状态就是对象在其生命周期中的某个特定阶段所处的某种情形,它是对影响对象行为的属性值的一种抽象。状态规定了对象对输入事件的响应方式。对象对事件的响应,既可以是作一个(或一系列)动作,也可以是仅仅改变对象本
29、身的状态。状态有持续性,它占用一段时间间隔。状态与事件密不可分,一个事件分开两个状态,一个状态隔开两个事件。事件表示时刻,状态代表时间间隔。在定义状态的时候,应该忽略那些不影响对象行为的属性。,第九章 面向对象方法学,3. 行为所谓行为,是指对象达到某种状态时所做的一系列处理操作。这些操作是需要耗费时间的。 9.6.2 表示方法下图给出了状态图中使用的主要表示符号。状态用圆形框或椭圆框表示,框内可标上状态名也可以不给状态起名字,行为在框内用关键字do(后接冒号)标明。从一个状态到另一个状态的转换用箭头线表示,线上标以事件名。在状态图中,初始状态用实心圆表示,最终状态用一对同心圆(内圆为实心圆)
30、表示。,第九章 面向对象方法学,“课程设置”对象的状态图(每个“课程设置”最多只能容纳50个选课学生),第九章 面向对象方法学,9 .7 功能模型功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。 9 .7.1 表示方法通常,功能模型由一组数据流图组成。在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。一般说来,与对象模型和动态模型比较起来,功能模型并没有增加新的信息,但是,建立功能模型有助于软件开发人员更深入地理解问题域,改进和完善自己的设计。因此,不能完全忽视功能模型的作用。,第九章 面向对象方法学,UML提供的用例图
31、也是进行需求分析和建立功能模型的强有力工具。用例图建立起来的系统模型称为用例模型,描述的是外部行为者所理解的系统功能。课程注册管理系统的用例图如下:,第九章 面向对象方法学,9 .7.2 三种模型之间的关系面向对象建模技术所建立的三种模型,分别从三个不同侧面描述了所要开发的系统。这三种模型相互补充、相互配合,使得我们对系统的认识更加全面: 功能模型指明了系统应该“做什么”; 动态模型明确规定了什么时候(即在何种状态下接受了什么事件的触发)做; 对象模型则定义了做事情的实体。,第九章 面向对象方法学,在面向对象方法学中,对象模型是最基本最重要的,它为其他两种模型奠定了基础,我们依靠对象模型完成三
32、种模型的集成。下面扼要地叙述三种模型之间的关系:1.针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。2.状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时与类图中的服务相对应。,第九章 面向对象方法学,3.功能模型中的处理,对应于对象模型中类&对象所提供的服务。有时一个处理对应多个服务,也有一个服务对应多个处理的时候。 4.数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的对象。 5.数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个对象。 6.用例图中的行为者,可能是对象模型中的对象。 7.功能模型中的处理(或用例)可
33、能产生动态模型中的事件。 8.对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点结构。,第九章 面向对象方法学,UML图分类 1、用例图:从外部用户的角度描述系统的功能,并指出功能的执行者。 2、静态图:描述系统的静态结构。.类图.对象图.包图 3、行为图:刻画系统的动态行为。.交互图(顺序图与合作图).状态图.活动图 4、实现图:描述软件实现系统的组成和分布状况。.构件图.部署图,本章结束!,面向对象补充部分,在20世纪,软件开发引入了面向对象方法。 从80年代中期起,人们开始注重面向对象分析和设计技术的研究,逐步形成了面向对象方法学。 进入90年代后,面向对象方法学已经成为人们在
34、开发软件时最重要的范型之一。,面向对象方法学,面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类解决问题的方法与过程,使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。,面向对象方法学,面向对象方法学,客观世界的问题都是由客观世界中的实体及实体间的关系构成。 从动态观点看,对对象施加的操作就是该对象的行为。 客观世界中的实体既具有静态的属性又具有动态的行为。因此,面向对象方法把对象作为由数据及可施加在这些数据上的操作所构成的统一体。,对象不仅能被动地等待外界对它进行操作,而且也可以主动处理相关事件的请求
35、。 面向对象方法学中的“对象”,是解空间中的对象,软件系统就是由一系列离散的解空间对象构成的集合。我们应该使得解空间中的对象与问题空间中的对象尽可能一致。这些解空间中的对象,是通过发送消息而相互作用,从而得出问题的解。,面向对象方法学,面向对象方法学的优点,与人类习惯的思维方法一致; 稳定性好; 可重用性好; 较易开发大型软件产品; 所开发出的软件可维护性好; 面向对象软件比较容易修改; 面向对象软件比较容易理解; 面向对象软件易于测试和调试。,面向对象的概念,对象的概念 我们认为,在应用领域中有意义的、与所要解决的问题有关系的任何事物,都可以作为对象, 它既可以是具体概念,也可以是人为的概念
36、,还可以是任何具有明确边界和意义的事务。,客观世界中的对象,既具有静态的属性,又具有动态的行为。 面向对象方法学中的对象既描述了该对象属性数据,也描述了对这些数据施加的操作(也称为服务或方法),属性和对属性的操作封装在一起,即对象是对属性值和操作的封装。,对象的特点,对象以数据为中心,操作围绕着数据来设置; 对象是主动的; 对象实现了数据封装,一个对象类型可看作是一种抽象数据类型; 对象具有并行性; 对象独立性好。,类及其它关系概念,1. 类(class) 在现实世界中,存在着彼此相似的客观事物,人们通常习惯于把这些具有相似特征的事物归为一类,这就是分类思想。 在面向对象中,“类”就是对具有相
37、同数据和相同操作的一组相似对象的定义,在定义中通常也给出了对怎样创建该类的新对象的说明。,类图用来描述系统的结构。类图描述类及类与类之间的静态关系。 类图是一种静态模型,它是创建其它图的基础。 一个系统可以由多张类图来描述,一个类也可以出现在几张类图中。 类是一组具有相同结构和行为的对象抽象。对象是类的实例,对象在系统执行过程中可创建、修改和取消。一个对象具有包括其属性值在内的状态,以及与其它对象的链接。,类及其它关系概念,为类命名时应该遵守的准则,使用标准术语。 使用具有确切含义的名词。 必要时使用名词短语。 总之,名字应该是富于描述性的、简洁的而且无二义性的。,类之间的关系,类之间的关系通
38、常有关联、泛化(继承)、依赖和细化等4种关系。 (1)关联 关联表示两个类的对象之间存在某种语义上的联系。 关联分为普通关联、限定关联和关联类。,普通关联是最常见的关联关系,只要类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线。 关联一般是双向的,在一个方向上为关联起一个名字,在另一个方向上为关联起另一个名字,如果关联清晰的话,也可不起名字。为避免混淆,在名字前面(或后面)加一个指示关联方向的黑三角。,关联,在表示关联的直线两端可以写上重数(multiplicity),重数表示该类有多少个对象与对方的一个对象相连接。重数的表示方法通常有: 01: 表示0到1
39、个对象; 0*或*: 表示0到多个对象; 1+或1*:表示1到多个对象; 115: 表示1到15个对象; 3: 表示3个对象。,关联,如果图中未明确标出关联的重数,则默认重数是1。,关联,在任何关联中,都会涉及到关联对象所扮演的角色(即起的作用),显式标明角色名有助于理解类图。 如果没有显式标出角色名,则意味着用类名同时作为角色名。,关联,限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或将多对多简化成多对一。 在类图中把限定词放在关联关系末端的一个小方框内。,关联,为了说明关联的性质,我们还可以增加一些附加信息。这样可以引入关联类来记录这些信息。 关联中的每
40、个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。,关联,(2)聚集,聚集是关联的特例。聚集所表示的类之间的关系是整体与部分的关系。 在需求陈述中,我们常常会使用的“包含”、“组成”、“分为部分”等字句,这往往意味着存在聚集关系。,如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集(Aggregation)。 聚集和共享聚集的图示符号是在表示关联关系的直线末端紧挨着整体类的地方画一个空心菱形。,如果部分类完全隶属于整体类,部分类需要与整体类共存,一旦整体类不存在了,则部分类也会随之消失,或失去存在价值,则称该聚集称为组合聚集(compositi
41、on),简称为“组成”。,(3)泛化(generalization),泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息。 用一端为空心三角形的连线表示泛化关系,三角形的顶角紧挨着通用元素。 泛化可分成普通泛化和受限泛化两类。,没有具体对象的类称为抽象类。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。,抽象类通常都具有抽象操作。抽象操作仅用来指定该抽象类的所有子类应具有哪些行为。 与抽象类相反的类是具体类,具体类有自己的对象,并且该类的操作都有具体的实现方法。,对泛化关系,我们可以增加约束条件,以进
42、一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。 预定义的约束有4种: 多重、不相交、完全和不完全。这些约束都是语义约束。 多重继承指的是,一个子类可同时多次继承同一个上层基类. 与多重继承相反的是单继承,即一个子类不能多次继承同一个基类。一般的继承都是单继承。,完全继承是父类的所有子类都已在类图中穷举出来了。 不完全继承则相反,父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护,这为日后系统的扩充和维护带来很大方便。不完全继承是一般情况下默认的继承关系。,(4)依赖和细化,依赖关系描述两个模型元素(类、用例等)之间的语义连接关系:其中一个模型元素是独立的,
43、另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。 下图表示一个友元依赖关系,该关系使得B类的操作可以使用A类中私有的或保护的成员。,当对不同抽象层次上的同一个事物进行描述时,这些层次描述之间具有细化关系。 假设两个模型元素A和B描述同一个事物,它们分属不同的抽象层,如果B在A的基础上进行了更详细的描述,则称B细化了A。,细化用来协调不同阶段模型之间的关系,表示各个开发阶段不同抽象层次的模型之间的相关性,细化常常用于跟踪模型的演变。,实例(instance),实例就是由某个特定类所描述的一个具体对象。对象是类的实际例子,通常称为实例。 当使用
44、“对象”这个术语时,既可指一个具体的对象,也泛指一般的对象,但是,当使用“实例”这个术语时,必然是指一个具体的对象。,消息(message):消息是一个对象与另一个对象之间交互的手段,它要求某个对象执行类中定义的某个操作的规格说明。 方法(method) :方法是对象所能执行的操作,即类中所定义的服务或操作。方法描述了对象执行操作的算法,以及响应消息的方法。,属性(attribute),属性是类中定义的数据,它是对客观世界实体所具有性质的抽象。类的每个实例都有自己特有的属性值。 一致描述属性的语法格式如下: 可见性 属性名: 类型名=初值性质串,属性的可见性(即可访问性)通常有下述3种:公有的
45、(public)、私有的(private)和保护的(protected),分别用加号(+)、减号(-)和井号(#)表示。如果未声明可见性,则表示该属性的可见性尚未定义。 属性名和类型名之间用冒号(:)分隔。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。,在创建类的实例时应给其属性赋值,如果给某个属性定义了初值,则该初值可作为创建实例时这个属性的默认值。类型名和初值之间用等号(=)隔开。 括起来的性质串明确地列出该属性所有可能的取值。,继承(inheritance),继承是指能够直接获得已有事务的性质和特征,而不必重复定义它们。 在面向对象的软件技术中,继承是子类自
46、动地共享基类中所定义数据和方法的机制。 继承性使得对象可以共享程序代码和数据结构,大大减少了程序中的冗余信息。,继承具有传递性。因此,一个类实际上继承了它所在的类等级中在它上层的全部基类的所有描述。 当一个类只允许有一个父类时,类的继承是单继承。当允许一个类有多个父类时,类的继承是多重继承。,Polygon,Triangle,Quadrilateral,Rectangle,封装(encapsulation),封装(encapsulation) :封装就是信息隐藏,通过封装对外界隐藏了对象的实现细节。这样,使用一个对象时,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。
47、,多态性(polymorphism),多态性(polymorphism) :多态性是指同样的消息既可以发送给父类对象也可以发送给子类对象,即在类等级的不同层次中可以共享一个方法的名字,不同层次中的每个类按自己的需要来实现这个行为。在C+语言中,多态性是通过虚函数来实现的。,重载(overloading),重载分为函数重载和运算符重载。 函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。 运算符重载是指同一个运算符可以施加于不同类型的操作数上面。重 载进一步提高了面向对象系统的灵活性和可读性。,Polygon,referencePoint Vertices,Draw(
48、) move(x, y) contains?(aPoint),Quadrilateral,referencePoint Vertices,Draw( ) move(x, y) contains?(aPoint),Polygon类,Polygon类的子类 Quadrilateral,面向对象建模中的记号,模型是为了理解事物而对该事物做出的一种抽象,是对事物的一种无歧义的书面描述。由于模型忽略了事务的非本质东西,因此模型比原始事务更容易操纵。 建模的目的就是将一个系统或者子系统的本质抽象出来。建模过程是处理各类复杂性系统的手段。,建模过程意味着要构造一个抽象系统,该抽象系统表达了建模者对系统感兴趣
49、的方面,同时建模者忽略掉了无关的细节。 通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。,在模型建立之后,该模型就要经受用户和各个领域专家的严格审查。 模型审查的一种有效技术是建立该模型的原型,用户和领域专家通过亲身体验该原型,从而对系统模型进行更有效的审查。,使用面向对象方法开发软件,通常需要描述系统数据结构的对象模型、描述系统控制结构的动态模型和描述系统功能的功能模型。 这些模型描述了系统的数据结构(对象模型),执行操作(动态模型),数据值的变化(功能模型)。这些内容综合起来则全面地反映了对目标系统的需求。,在软件开发中,对象模型是最重要、最基本
50、、最核心的。 对象模型表示静态的、结构化的系统性质,描述了系统的静态结构,包括对象的标识、对象之间的关系、属性和操作。,在建立对象模型时,我们的目标是从客观世界中提炼出对具体应用有价值的概念。 为了建立各类模型,我们希望定义一组图形记号系统并定义使用记号系统的规则(语法、语义和语用)。,UML,由Booch、Rumbaugh和Jacobson等人建立的工业标准,即统一建模语言UML是一类最重要的图形记号系统之一。 在UML中使用类图表示对象模型,使用对象、属性、关联和操作来描述系统的结构。 在UML中使用用例图表示功能模型,以从用户观点上描述系统功能。 在UML中使用交互图、状态图和活动图表示动态模型,以描述系统的内部行为。,