面向对象的程序设计原理与技术.ppt
1,首都师范大学教育技术系方海光2007年9月,面向对象的程序设计原理与技术,2,http:/课件存放位置,3,第一章 面向过程与面向对象的程序设计,本章的主要目的是理解面向过程的程序设计和面向对象的程序设计在本质上有什么不同。主要从以下几个方面来讲解:计算机的工作过程面向过程的程序设计面向对象的程序设计,4,计算机的工作过程,例:计算圆面积。s=3.14*r*r,5,输入设备,程序原始数据,内存储器,原始数据,运算器,结果,结果,输出设备,外存储器,控制器,计算机的工作过程基本结构图,程序,6,计算机的工作过程,计算机在程序的控制下解题程序设计语言的发展经历了五代(前三代语言编写的程序本质上是相同的,都是按照机器的工作过程来编写,只不过程序的描述语句越来越接近人的思维,通用性越来越强)第一代为机器语言第二代为汇编语言第三代语言为高级语言第四代语言为面向对象的计算机语言第五代语言是按人工智能原理设计的语言,7,面向过程的程序设计,下面用面向过程的语言解题,标准C语言源程序,#include void main()float r,s;printf(Input r:);scanf(%f,8,例11 Page2例12 Page3,9,面向过程的程序设计,人模拟计算机思维来解题(输入-运算-输出)程序设计工作主要围绕解题过程的设计程序功能隐含在程序代码中理解困难维护(修改)困难,10,面向过程的程序设计,在长期的软件开发实践中,人们总结出了一些设计原理和系统化的方法,包括:模块化:如函数抽象:忽略事物间的差异,集中和概括共性的方面,例如复杂问题抽象为用较自然的语句来表示;自顶向下的程序设计方法就是一个从抽象到具体的过程。,11,面向过程的程序设计,信息隐藏:如局部变量模块独立:高内聚和松耦合 内聚:内部元素间结合的紧密程度;耦合:模块间互相依赖的紧密程度。结构程序设计:自顶向下逐步求精的设计方法、单入口单出口的控制结构一句话:功能分解或算法分解,12,面向对象的程序设计,人类习惯的解决问题的方法:“顾客-服务员”的工作模式。例:去理发馆理发面向对象的方法模拟人类习惯的解题方法,用对象分解取代功能分解,程序中的所有对象分工协作,共同完成整个程序的功能。,13,面向对象的程序设计,面向对象方法的四个要点:(1)面向对象的软件系统由对象组成;(2)所有的对象划分为对象类,每个类由数据和方法组成;(3)若干个类按照子类(派生类)与父类(基类)的关系组成了层次结构;-继承,如汽车与交通工具;(4)对象之间通过传递消息互相联系。OO=对象+类+继承+消息,14,面向对象的程序设计,面向对象方法的优点(1)与人的思维习惯一致(2)稳定性好(3)可重用性好(4)可维护性好,15,例13 Page6,16,1 对 象,对象相当于现实世界中的实体对象=属性+方法,数据,操作,内部操作1,内部操作2,数据,公有操作1,公有操作2,17,对象的定义 对象是一个封装体,封装了数据结构及可以施加在这些数据结构上的操作。对象有对象名;对象中的数据表示对象的状态,一个对象的状态只能由该对象本身的操作来改变。对象向外界提供一组服务(即公有的操作),称为与外界的接口。,对 象,18,对象的特点:,以数据为中心对象是主动的实现了数据封装本质上具有并行性模块独立性好,对 象,19,2 其他面向对象的概念,类(Class)是对具有相同数据属性和相同操作的一个或一组(集合)相似对象的描述,是一个抽象的概念。类与函数的不同:类 封装了函数与数据 是对问题的抽象描述 函数 封装了语句与数据 完成特定的功能例:大小不同、位置不一和颜色不同的圆,可以定义为一个Circle类。例:中国人,20,实例(Instance)是由某个特定的类所描述的一个具体的对象。“对象”这个术语,既可以指一个具体的对象,也可以泛指一般的对象,“实例”这个术语,必然是指一个具体的对象。C+中,要定义一个对象或实例,必须先建立一个这类对象的类。,基本概念,21,属性(Attribute)类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。例:圆类(半径、位置、颜色)在C+语言中把属性称为数据成员。,基本概念,22,方法(Method)对象所能执行的操作,它应用于类或被类中对象使用。在C+中称为成员函数。通常,一个函数对应一个操作,实现一个功能。例:圆对象响应显示圆的消息 在Circle类中必须定义能够显示这个圆的方法,即编写成员函数Show(int color)。,基本概念,23,消息(Message)对象之间相互请求相互协作的途径 一个消息由下述三部分组成:(1)接收消息的对象;(2)消息选择符(也称为消息名);(3)零个或多个变元。例如:MyCircle.Show(GREEN);其中:MyCircle是接收消息的对象的名字 Show是消息选择符(即消息名)GREEN是消息的变元。,基本概念,24,封装性(Encapsulation)封装即把数据和实现操作的代码集中起来放在对象内部,外界通过对象提供的接口来使用它,不需知道内部数据结构细节和实现操作的算法。实现封装的条件:(1)有一个清楚的边界(2)有确定的接口(用于接受用户发送的消息)(3)受保护的内部实现 封装的好处就是实现了信息隐藏,把对象的实现细节对外界隐藏起来了,提高安全性。在C+中,通过定义类来实现封装。,基本概念,25,继承(Inheritance)指能够直接获得已有的性质和特征,而不必重复定义它们。是子类自动地共享基类中定义的数据和方法的机制。例:家族关系 继承具有传递性,如果类C继承类B,类B继承类A,则类C继承类A。一个类除了具有该类所描述的性质外,还具有该类上层全部基类描述的一切性质。,基本概念,26,多态性(Polymorphism)在类等级的不同层次中,相同的消息,被不同类的对象接收,产生了不同的行为。例:“打”好处:增加软件系统的灵活性,减少了信息冗余,提高了软件的可重用性和可扩充性。在C+语言中,多态性是通过虚函数来实现的。(动态联编),基本概念,27,重载(Overloading)有两种重载:函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;例:运算符重载是指同一个运算符可以施加于不同类型的操作数上面。例:cout“2”;表示向屏幕输出字符串2 x2;表示将x中的二进制左移2位,基本概念,28,在C+语言中函数重载是通过静态联编实现的,也就是在编译时根据函数变元的个数和类型,决定到底使用函数的哪个实现代码;对于重载的运算符,在编译时根据被操作数的类型,决定使用该算符的哪种语义。,基本概念,29,3 面向对象建模,什么是模型使用模型的好处三种模型模型的表示,30,面向对象建模,为什么要建模?完全、彻底地理解问题什么是模型?对事物的一种抽象,由一组图示符号和组织这些符号的规则组成。目的:理解事物。如下图:,31,面向对象建模,32,面向对象建模,用面向对象方法开发软件,通常要建立三种形式的模型:对象模型:描述系统数据结构 动态模型:描述系统控制结构 功能模型:描述系统功能,33,4 对象模型,对象模型表示系统的静态结构,描述了对象、对象间的关系。建立对象模型用到的图形符号:(1)表示类的符号(包括属性和服务)(2)表示类实例的符号(3)表示类间关系的符号,34,4.1 表示类&对象的图形符号(p12),类&对象:含义是“一个类及属于该类的对象”,35,例:计算圆的面积。,表示类&对象的图形符号,36,类的命名规则 类名应富有描述性、简洁且无二义性,命名时应该遵守以下几条准则:(1)使用标准术语(2)使用具有确切含义的名词(3)必要时用名词短语作名字:如公司员工,表示类&对象的图形符号,37,4.2 表示类间关系的符号,类间、对象间的关系可以概括为泛化关系、组合关系及关联关系三种关系 1.泛化关系:“是一种”(ISA)“一般特殊”关系,反映了一个类与若干个互不相容的子类之间的分类关系。高层类(即基类或超类)说明一般(公共)的属性,低层类(即派生类或子类)说明特殊属性。,38,半圆形表明泛化关系的方向:从半圆弧中点引出的直线指到一般化的类。,表示归纳关系的图形符号,39,例:,表示泛化关系的图形符号,40,2.组合关系 组合关系就是“整体部分”关系,它反映了对象之间的构成关系。组合关系也称为聚集关系。在C+语言中,通常是在一个类中包含另一个类的对象成员来实现这种关系。,类间关系,41,上部:整体对象 下部:部分对象 标值:该端对象的数量(省略为1)三角形:组合关系的方向(从三角形顶角引出的线指向整体对象,从三角形底边中点画出的线连到部分对象),表示组合关系的图形符号,42,例:,表示组合关系的图形符号,1,n,43,3.关联关系 关联关系反映对象之间相互依赖、相互作用的关系。通常把两类对象之间的二元关系再细分为一对一(1:1)、一对多(1:M)和多对多(M:N)等三种基本类型。,类间关系,44,二元关联的5个要素:,连线:连线端点所在的位置表明,这是对象(而不是类)之间的映射关系。,类间关系-关联关系,教师,书,1+,45,阶 参与关联的对象的个数。阶用标在连线端点的单个数字或数值区间表示。例如,“1+”(一个或多个),“3,5”(3至5)等。,表示类间关系的图形符号,46,链属性 链属性就是关联链的性质。例如,计算机中每个用户对不同文件拥有不同的访问权限,访问权限就是文件与用户之间的关联链的属性。,表示类间关系的图形符号,47,限定 一个受限的关联由两个对象及一个限定词组成。可以把限定词看作是一种特殊的链属性。,表示类间关系的图形符号,48,消息连接 反映了一个对象对另一个对象的处理依赖性。,表示类间关系的图形符号,49,例1:一家公司的对象模型。该公司有许多部门,每个部门由一名经理管理,也有的经理不管理任何部门,每个部门生产多种产品,每种产品仅由一个部门生产。公司有许多员工为之工作,员工分为工人和经理,每名工人可参加多个项目,每个项目需要多个工人参与,每位经理可主持多个项目,每个项目由一位经理主持。,4.3 对象模型例子,50,对象模型例子,51,5 面向对象分析(OOA),什么是面向对象分析?抽取和整理用户需求并建立问题域精确模型的过程。面向对象分析工作大体上按照下列顺序进行:(1)寻找类&对象(2)识别结构(3)定义属性(4)定义服务,52,OOA第一步:确定类&对象,1、找出候选的类&对象有两种方法:(1)找出问题域中的五类事物作为候选类&对象可感知的物理实体,如书、汽车人或组织的角色,如教师、雇员应该记忆的事件,如演出、访问两个或多个对象的相互作用,通常具有交易或接触的性质,如购买,结婚需要说明的概念,如政策(2)将需求分析中的名词或名词短语作为候选者,53,例1:各剧院的演出售票预订系统按第一种方法,得到候选的类-&-对象为:剧院、演出、票、预订、系统例2:按第二种方法,得到候选的类-&-对象为:公司、部门、经理、产品、员工、工人、项目,面向对象分析,54,2、筛选出正确的类&对象从候选的类&对象中去掉不正确或不必要的类&对象,主要遵循下列原则:冗余的:两个类名表示了相同的信息无关的:笼统的(模糊的):用精确的代替属性:去掉无关的属性操作:动词定义的操作是否作为类?如拨号实现:分析阶段少或不考虑怎样实现目标系统,面向对象分析OOA,55,OOA第二步:确定关联,两个或多个对象之间的相互依赖、相互作用的关系就是关联。关联关系的确定(1)抽取需求陈述中使用的描述性动词或动词词组(2)找到隐含的关联关系(3)补充一些必要的关联关系(4)去掉不正确或不必要的关联,56,例:例2得到类间的关系为:动词 相关类 关系 有 公司和部门间 组合/受限关联 管理 部门和经理 0/1:1 生产 部门和产品 1:N 为之工作 公司和员工 1:N 分为 员工和工人 ISA(泛化)员工和经理 ISA(泛化)参加 工人和项目 N:N 主持 经理和项目 1:N,面向对象分析OOA,57,OOA第三步:确定属性,属性是对象的特性属性的确定 分析:需求陈述中的名词词组表示属性,形容词作为确定属性的线索,如画一个红色的圆;选择:删去不正确和不必要的属性,58,OOA第四步:识别继承关系,一般说来,可以使用两种方式建立继承关系:(1)自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维过程。(2)自顶向下:把现有类细化成更具体的子类,这模似了人类的演绎思维过程。如:头与眼、鼻、耳、嘴之间是组合关系 人、男人、男孩是继承关系,59,OOA第五步:确定操作,对象=数据+操作 在确定类中应该有的服务时,既要考虑该类实体的常规行为,又要考虑为完成本系统功能所需要提供的操作。,60,6 面向对象设计(OOD),把分析阶段得到的需求转变成符合成本和质量要求的、抽象的程序实现方案的过程。是一个逐渐扩充模型的过程。在实际的软件开发过程中分析和设计的界限是模糊的,许多分析结果可以直接映射成设计结果,而在设计过程中又往往会加深和补充对系统需求的理解,从而进一步完善分析结果。,61,面向对象设计(OOD),OOD主要完成下述工作:1.建立类等级 面向对象程序的一个突出优点来源于继承性。应该尽量抽取出相似类的公共属性和公共服务,以建立这些相似类的父类,并在类等级的适当层次中正确地定义各个属性和服务。,62,面向对象设计(OOD),定义属性 所谓定义属性就是要确定每个属性的数据类型和数据结构,同时还要确定每个属性的访问权限(通常被定义在保护部分或私有部分)。3定义操作,63,面向对象的设计原则,模块化:对象就是模块。抽象:类是一种抽象数据类型信息隐藏:信息隐藏通过对象的封装性实现弱耦合强内聚可重用,64,耦合:一个软件结构内不同模块之间互连的紧密程度。弱耦合是优秀设计的一个重要标准。在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。对象之间的耦合可分为两大类:交互耦合、继承耦合。,面向对象的设计原则-弱耦合,65,交互耦合即对象之间的耦合通过消息连接来实现,交互耦合应尽量松散。遵循的原则:(1)尽量降低消息连接的复杂程度(参数个数和参数的复杂度)(2)减少对象发送或接收的消息数继承耦合是一般化类与特殊类之间耦合的一种形式。越紧密越好。,面向对象的设计原则-弱耦合,66,面向对象的设计原则-强内聚,内聚衡量一个模块内各个元素彼此结合的紧密程度。在设计时应该力求做到高内聚。在面向对象设计中存在下述3种内聚:(1)服务内聚(2)类内聚(3)一般特殊内聚,67,面向对象的设计原则-可重用,软件重用是提高软件开发生产率和目标系统质量的重要途径。重用有两方面的含义:(1)一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类)(2)二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。,68,7 面向对象实现,面向对象实现主要包括下述两项工作:1.把面向对象设计的结果翻译成用某种面 向对象程序语言书写的面向对象程序。2.测试和调试编写出的面向对象程序。面向对象的语言:C+、Java等注:程序的质量主要由设计的质量决定,但是所选用的程序语言的特点对程序质量也有重要影响。(应该将大量的时间花在系统分析与设计上),69,本章小结,本章分析了面向过程的程序设计和面向对象的程序设计的不同,强调了面向对象程序设计的特点和优点,面向对象的一些基本概念和简单的分析和设计。,70,思 考,思考题:试比较面向过程的程序设计方法和面向对象程序设计方法的不同。为什么说面向对象方法更接近人类习惯的思维方法?类与函数的不同点?封装和继承的含义。,