资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,2,章 面向对象方法学引论,1,本章概要,传统的软件工程方法学曾经给软件产业带来巨大进步,部分地缓解了软件危机,使用这种方法学开发的许多中、小规模软件项目都获得了成功。但是,人们也注意到当把这种方法学应用于大型软件产品的开发时,似乎很少取得成功。,在,20,世纪,60,年代后期出现的面向对象编程语言,Simula-67,中首次引入了类和对象的概念,自,20,世纪,80,年代中期起,人们开始注重面向对象分析和设计的研究,逐步形成了面向对象方法学。到了,20,世纪,90,年代,面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。,2,2.1,面向对象方法学概述,2.1.1,面向对象方法学导论,面向过程程序设计:,根据计算机的要求,围绕算法进行程序设计。开发软件的方法与过程不同于人类认识世界解决问题时习惯采用的方法与过程,因此使得描述问题的问题空间与实现解法的解空间在结构上明显不同。,3,人类习惯的解决问题的方法,让我们观察一个日常生活中常见的事例:,一位厨师的头发长了需要理发,他会走进理发馆,告诉理发师要理什么发式。也就是说,为了解决头发过长的问题,厨师只需向理发师提出要求,告诉他“做什么”(即,理什么发式),并不需要告诉理发师“怎样做”,理发师自己知道第一步做什么,第二步做什么。类似地,理发师肚子饿了,只需走进餐馆点好自己要吃的饭菜,厨师自己知道该怎样做,并不需要顾客告诉他做菜的具体步骤,事实上,顾客无需知道做菜的具体步骤。,4,面向对象程序设计方法模拟人类习惯的解题方法,用对象分解取代功能分解,也就是把程序分解成许多对象,不同对象之间通过发消息向对方提出服务要求,接受消息的对象主动完成指定功能,程序中的所有对象分工协作,共同完成整个程序的功能。,面向对象程序设计方法模拟人类习惯,5,2.1.2,面向对象方法概述,面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称求解域)在结构上尽可能一致。,6,面向对象方法具有下述,4,个要点:,认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。,把所有对象都划分成各种对象类(简称为类,,Class,),每个对象类都定义了一组数据和一组方法。,按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。,对象彼此之间仅能通过传递消息互相联系。,7,2.1.3,面向对象方法的主要优点,与人类习惯的思维方法比较一致,面向对象方法学的基本原则是按照人们习惯的思维方式建成立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。面向对象的软件系统中广泛使用的对象,是对客观世界中实体的抽象。,稳定性好,面向对象方法基于构造问题领域的对象模型,以对象为中心构造软件系统。它的基本作法是用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。因此,以对象为中心构造的软件系统也是比较稳定的。,8,大家有疑问的,可以询问和交流,可以互相讨论下,但要小声点,9,可重用性好,面向对象的软件技术在利用可重用的软件成分构造新的软件系统时,有很大的灵活性。其中,有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。,较易开发大型软件产品,可维护性好,面向对象还有如下突出优点:,面向对象软件稳定性比较好;,面向对象的软件比较容易修改;,面向对象的软件比较容易理解;,易于测试和调试。,10,2.1.4,喷泉模型,喷泉模型体现了面向对象方法所固有的迭代和无间隙的特征。,迭代是软件开发过程中普遍存在的一种内在属性。即,软件开发活动需多次重复,每次重复都从分析开始,依次进行设计、实现,逐渐细化,演化出最终系统。,11,图,2.1,喷泉模型,12,2.2,面向对象的概念,2.2.1,对象,在应用领域中有意义的,与所要解决 的问题有关系的任何事物都可以作为对象(,Object,),它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。例如,一名职工、一家公司、一个窗口、一座图书馆、一本图书、贷款、借款等等,都可以作为一个对象。,总之,对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统具有保存有关它的信息并且与它进行交互的能力。,13,面向对象方法学中的对象:,是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。,对象可以作的操作表示它的动态行为,通常称为服务或方法。,14,对象的形象表示(举例),一个对象很像一台录音机。当在软件中使用一个对象的时候,只能通过对象与外界的界面来操作它。对象与外界的界面也就是该对象向公众开放的操作,例如,,C+,语言中对象的公有的(,Public,)成员函数。一个对象好象是一个黑盒子,表示它内部状态的数据和实现各个操作的代码及局部数据,都被封装在这个黑盒子内部,在外面是看不见的,更不能从外面去访问或修改这些数据或代码。,15,对象的形象表示:,图,2.2,对象的形象表示,16,对象的定义,人们从不同角度给出对象的不同定义:,1,、定义,1,:对象是具有相同状态的一组操作的集合。,2,、定义,2,:对象是对属性值和操作的封装。,3,、定义,3,:对象,=,ID,,,MS,,,DS,,,MI,其中,,ID,是对象的标识或名字,,MS,是对象中的操作集合,,DS,是对象的数据结构,,MI,是对象受理的消息名集合(即对外接口),注意:这个定义是一个形式化的定义。,17,总之,对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体,这个封装体有可以唯一地标识它的名字,而且向外界提供一组服务(即公有的操作)。对象中的数据表示对象的状态,一个对象的状态只能由该对象本身的操作来改变。,18,对象的特点,以数据为中心,操作是为数据服务的。,对象是主动的,为了完成某个操作,不能从外部直接加工它的私有数据,而是必须通过它的公有接口向对象发消息,请求它执行它的某个操作,处理它的私有数据。(举例:厨师与理发匠)。,实现了数据封装。对象好像是一只黑盒子,它的私的数据完全被封装在盒子内部,对外是隐藏的、不可见的,对私有数据的访问或处理只能通过公有的操作进行。抽象数据类型的概念,无须知道数据的具体结构以及实现操作的算法。,19,本质上具有并行性。不同对象各自独立地处理自身的数据,彼此通过发消息传递信息完成通信。因此,对于不同的对象来说,本质上具有并行工作的属性。,模块独立性好。对象是面向对象的软件的基本模块。,20,2.2.2,其他概念,类,(class),“,类”,就是对具有相同数据和相同操作的一组相似对象的定义,也就是说,类是对具有相同属性和行为的一个或多个对象的描述。,例如:张三、李四、王五等,虽说每个人职业、性格、爱好、特长等等各有不同。但是,他们的基本特征是相似的,都是黄皮肤、黑头发、黑眼睛,于是人们把他们统称为“中国人”。,21,实例(,instance,),“实例”是由某个特定的类所描述的一个具体的对象。,“对象”这个术语,既可以指一个具体的对象,也可以泛指一般的对象,而“实例”这个术语,必然是指一个具体的对象。,C+,中,要定义一个对象或实例,必须先建立一个这类对象的类。,22,消息(,message,):,要求某个对象执行其中某个操作的规格的说明,一个消息由下述三部分组成:,接收消息的对象;,消息选择符(也称为消息名);,零个或多个变元。,例如:,MyCircle.Show(GREEN),;,其中:,MyCircle,是,Circle,类的对象,也是,Circle,类的一个实例。,Show,是消息选择符(即消息名);,GREEN,是消息的变元。,23,方法(,method,),方法,就是对象所能执行的操作,也就是类中所定义的服务。,在,C+,语言中把方法称为成员函数。通常,一个函数对应一个操作,实现一个功能。,例如:为了,MYCircle,这个对象能够显示一个圆,在,Circle,类中必须定义成员函数,Show(int color),。,24,属性(,attribute,),属性,就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。,例如:,Circle,类中定义代表圆心坐标、半径、颜色等属性。,在,C+,语言中把属性称为数据成员。,25,封装性(,encapsulation,),从字面上理解,所谓封装就是把某个事物包起来,使外界不知道该事物的具体内容把数据和实现操作的代码集中起来放在对象内部。使用一个对象的时候,只需知道它向外界提供的接口形式而无须知道它的数据结构细节和实现操作的算法。,实现封装的条件:,有一个清楚的边界。,有确定的接口(这些接口就是对象可以接受的消息,用户只能通过向对象发送消息来使用它)。,受保护的内部实现。,26,继承(,inheritance,),继承是指能够直接获得已有的性质和特征,而不必重复定义它们。子类自动地共享基类中定义的数据和方法的机制。(举例:父与子),继承具有传递性,如果类,C,继承类,B,,类,B,继承类,A,,则类,C,继承类,A,。一个类除了具有该类所描述的性质外,还具有类等级中该类上层全部基类描述的一切性质。,27,继承机制的原理,图,2.4,实现继承机制的原理,28,多态性,(polymorphism),多态性是指子类对象可以像父类对象那样使用。同样的消息既可以发送给父类对象也可以发送给子类对象。,在类等级的不同层次中,相同的消息,被不同的类(属同一簇)的对象接收,产生了不同的行为。,在,C+,语言中,多态性是通过虚函数来实现的。虚函数机制使得程序员能在一个类等级中使用相同函数的多个不同版本,在运行时刻才根据接收消息的对象所属于的类,决定到底执行哪个特定的版本,这称为动态联编,也叫滞后联编。,29,重载(,overloading,),(,有两种重载,),函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;,运算符重载是指同一个运算符可以施加于不同类型的操作数上面。,在,C+,语言中函数重载是通过静态联编实现的,也就是在编译时根据函数变元的个数和类型,决定到底使用函数的哪个实现代码;对于重载的运算符,同样是在编译时根据被操作数的类型,决定使用该算符的哪种语义。,如,:cout“2”;,表示向屏幕输出字符串,2,x2;,表示将,x,中的二进制左移,2,位,30,熟悉并使用类,C+,标准库提供了,string,类,,string,类的属性是一个字符串,str,,同名函数,string,是用来初始化符串,另外,3,个成员函数用来对属性,str,进行操作。,当定义了一个对象后,这 个对象可以通过这些成员函数展现自身的特性。,31,使用,string,类的例子,#include,#include,using namespace std;,void main(),string str1(We are here!);,string str2;,coutstr10str111,str1endl;,coutstr2;/输入 一个单词给对象str2,coutlength of str2 isstr2.size()endl;,string newstr=str2.substr(3,1);/从 str2的第3位开始截取1个字符,coutnewstr=newstrendl;,int i=str1.find(“are”,0);/从字符串str1的位置0开始检索are,couti=iendl;,注意:,C+,规定符串的计数是从零开始的,32,2.3,面向对象建模,所谓模型,由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。模型是一种思考工具,利用这种工具可以把知识规范地表示出来。,为了开发复杂的软件系统,系统分析员应该抽象出目标系统的特性,使用精确的表示方法构造系统的模型,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现模型。,33,用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是:,描述系统数据结构的对象模型,(,基本、核心,),描述系统控制结构的动态模型,描述系统功能的功能模型,一个典型的软件系统组合了上述三方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。,34,2.4,对象模型,对象模型是上述三种模型中最重要、最基本、最核心的模型,是表示静态的、结构化的系统的“数据”性质。,它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。面向对象方法强调围绕对象而不是围绕功能来构造系统。对象模型为建立动态模型和功能模型,提供了实质性的框架。,35,2.4.1,类图的基本符号,定义类,UML,中类的图形符号为长方形,用两条横线把长方形分成上、中、下,3,个区域(下面两个区域可省略),,3,个区域分别放类的名字、属性和服务。,36,2.4.1,类图的基本符号,类命名时应遵守以下几条准则:,使用标准术语。,使用具有确切含义的名词。,必要时用名词短语作名字。,总之,名字应该是富于描述性的、简洁的而且无二义,性的。,37,2.4.1,类图的基本符号,定义属性,UML,描述属性的语法格式如下:,可见性 属性名,:,类型名,=,初值,性质串,属性的可见性(即可访问性)通常有下述,3,种:,公有的(,public,)用加号,(+),表示,私有的(,private,)用减号,(,),表示,和保护的(,protected,)用井号,(,),表示,如果未声明可见性,则表示该属性的可见性尚未定义。,例如:“学生”类的属性“学号”,可以这样描述:,学号:,String=“020010”,38,2.4.1,类图的基本符号,定义服务,服务也就是操作,,UML,描述操作的语法格式如下:,可见性 操作名,(,参数表,):,返回值类型,性质串,操作可见性的定义方法与属性相同。,参数表是用逗号分隔的形式参数的序列。,描述一个参数的语法如下:,参数名,:,类型名,=,默认值,39,2.4.2,表示关系的符号,关联,关联表示两个类的对象之间存在某种语义上的联系。,普通关联,普通关联是最常见的关联关系,只要在类与类之间存在连,接关系就可以用普通关联表示。普通关联的图示符号是连接两,个类之间的直线。,图,2.6,普通关系示例,40,2.4.2,表示关系的符号,关联的角色,例如:一个人与另一个人结婚,必然一个人扮演丈夫,的角色,另一个人扮演妻子的角色。,图,2.7,关联的角色,41,2.4.2,表示关系的符号,限定关联,限定关联通常用在一对多或多对多的关联关系中,可,以把模型中的重数从一对多变成一对一,或从多对多简化,成多对一。,例如,某操作系统中一个目录下有许多文件,一个文件仅属于一,个目录,在一个目录内文件名确定了惟一一个文件。,图,2.8,一个受限的关联,42,2.4.2,表示关系的符号,关联类,为了说明关联的性质可能需要一些附加信息。可以引,入一个关联类来记录这些信息。,例如,图,2.9,是一个电梯系统的类模型,队列就是电梯控制器类与,电梯类的关联关系上的关联类。,图,2.9,关联类示例,43,2.4.2,表示关系的符号,聚集,聚集也称为聚合,是关联的特例。聚集表示类与类之,间的关系是整体与部分的关系。,共享聚集,如图,2.10,所示。一般聚集和共享聚集的图示符号,都,是在表示关联关系的直线末端紧挨着整体类的地方画一个,空心菱形。,图,2.10,共享聚集示例,44,2.4.2,表示关系的符号,组合聚集,图,2,.,11,是窗口的组成,从图上可以看出组成关系用实心棱形,表示。,图,2.11,组合聚集示例,45,2.4.2,表示关系的符号,泛化,UML,中的泛化关系就是通常所说的继承关系,,它是通用元素和具体元素之间的分类关系。,泛化可进一步划分成普通泛化和受限泛化。,46,2.4.2,表示关系的符号,图,2.12,抽象类示例,普通泛化,47,2.4.2,表示关系的符号,图,2.13,复杂类图示例,48,2.4.2,表示关系的符号,图,2.14,多重继承示例,受限泛化,49,2.4.2,表示关系的符号,依赖和细化,依赖关系,依赖关系描述两个模型元素(类、用例等)之间的语,义连接关系。,图,2.15,友元依赖关系,50,2.4.2,表示关系的符号,细化关系,当对同一个事物在不同抽象层次上描述时,这些描述,之间具有细化关系。,图,2.16,细化关系示例,51,2.5,动态模型,动态模型表示瞬时的、行为化的系统的,“控制”性质,它规定了对象模型中的对象的合,法变化序列。,52,2.5.1,状态,状态是任何可以被观察到的系统行为模,式,一个状态代表系统的一种行为模式。,53,2.5.2,事件,事件是在某个特定时刻发生的事情,它是,对引起系统做动作或(和)从一个状态转换到,另一个状态的外界事件的抽象。,54,2.5.3,符号,在状态图中,初态用实心圆表示,终态用,一对同心圆(内圆为实心圆)表示。,活动表的语法格式如下:,事件名,(,参数表,)/,动作表达式,事件表达式的语法如下:,事件说明,守卫条件,/,动作表达式,其中,事件说明的语法为:事件名,(,参数表,),55,2.5.3,符号,图,2.17,状态图中使用的主要符号,56,图,2.18,学生选毕设课题的状态图,57,2.6,功能模型,功能模型表示变化的系统的“功能”性质,,它指明了系统应该“做什么”,因此更直接地反,映了用户对目标系统的需求。,58,2.6.1,用例图,系统,系统被看作一个提供用例的黑盒子,内部如何工作对于建立用例模型都不重要。,59,2.6.1,用例图,用例,用例具有下述特征,:,用例代表某些用户可见的功能,实现一个具,体的用户目标;,用例总是被行为者启动的,并向行为者提供,可识别的值;,用例必须是完整的。,60,2.6.1,用例图,行为者,行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。,图,2.19,自动售货机系统用例图,61,图,2.20,含扩展和使用关系的用例图,用例之间的关系,扩展关系,使用关系,62,2.6.2,用例建模,寻找行为者,寻找用例,注意,:,最后这两个问题并不意味着没有行为者也可,以有用例,只是在获取用例时还不知道行为者是,谁。事实上,一个用例必须至少与一个行为者相,关联。,63,2.7,三种模型之间的关系,针对每个类建立的动态模型,描述了类实例的生命周期或,运行周期。,状态转换驱使行为发生,这些行为在用例图中被映射成用,例,它们同时与类图中的服务相对应。,功能模型中的处理(或用例)对应于对象模型中的类所提,供的服务。通常,复杂的处理(或用例)对应于复杂对象提,供的服务,简单的处理(或用例)对应于更基本的对象提供,服务。有时一个处理(或用例)对应多个服务,也有一个服,务时应多个处理(或用例)的时候。,用例图中的行为者,可能是对象模型中的对象。,功能模型中的处理(或用例)可能产生动态模型中的事件。,64,
展开阅读全文