版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9章数据抽象与面向对象程序设计鲍玉斌东北大学信息学院计算机软件与理论研究所2023/7/221Outline1.大型程序设计概述2.数据抽象和抽象数据类型3.抽象数据类型的形式规范描述4.面向对象技术的优势5.面向对象基本概念6.面向对象的设计过程7.面向对象vs
传统的设计方法8.面向对象设计的基本原则2023/7/222鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.1大型程序设计概述内容提要:大型程序的基本特点与小型程序设计的差别大型程序设计方法模块分解准则
2023/7/223鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.1大型程序设计概述一、大型程序的特点大型程序是相对程序的复杂性而言,复杂性来自两个方面:由多个人合作完成,形成大型程序的设计管理时的复杂性:任务划分、估计、资源分配、每个程序员进度的掌握、控制,检查每个阶段的设计标准等。来自于大量的系统状态。正确处理每个状态、组织系统的程序逻辑、验证系统的正确性非常困难正确性仍然是程序设计的首要目标。健壮性、易维护性、可靠性、可重用性2023/7/224鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.1大型程序设计概述二、大型程序设计大型程序设计必然用模块化设计思想.自顶向下、分而治之是对付系统复杂性的重要手段。分解和抽象是设计大型程序的重要方法。大型程序设计就是如何将一个大型的程序系统分解为易于管理的模块、如何定义模块的界面、如何把这些模块组织成一个程序系统的过程。实质是用模块进行程序设计重点在于模块的连接和相互作用。大型程序的设计=大型程序设计+小型程序设计另一个很重要的方面是软件开发环境和开发工具的选择.2023/7/225鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.1大型程序设计概述三、模块分解的原则模块化方法通过减少任意时刻所必须考虑的细节(即抽象的方法)来控制系统的复杂性.不同的模块分解方法对系统的效率和复杂性的控制有很大的影响.四、模块分解的两种方法:基于功能抽象的模块分解方法.数据作为模块的界面,成为横向模块化设计.基于数据抽象的模块分解方法.以“信息隐蔽”为模块分解原则.数据上的操作作为模块的界面,称为纵向模块化设计,大型软件系统的设计一般是横向和纵向模块化设计的综合2023/7/226鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.2数据抽象和抽象数据类型数据和对数据的处理是整个程序设计的核心数据表示的复杂性决定其上操作实现的复杂性:Algorithm+DataStructure=Program有效地控制数据的表示,是控制程序复杂性的关键.基于功能分解的模块化设计方法不能用于控制大型软件系统的复杂性。数据抽象是一种新的设计方法,它把一组数据对象及其作用其上的操作组成一个程序实体,使得外部只知道它做什么,而不知道它怎么做,也不知道其数据对象是如何表示的。数据抽象的背景与动机2023/7/227鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.2数据抽象和抽象数据类型控制大型程序的复杂性要解决的问题:更新程序设计语言中的类型定义的设施,使得类型的内部表示细节对外界不可见,使得用户程序不依赖于数据的某一具体的表示。寻求连接模块的新方法,尽可能缩小模块的界面。解决途径:在程序设计语言中更新模块的概念,寻求访问类型对象的新途径。Simula67语言引入类(class)的概念。一个逻辑模块在其中可以表示为过程、函数、或类设计具有下面特征的语言,如并行Pascal、Ada等:数据抽象的背景与动机2023/7/228鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.2数据抽象和抽象数据类型类型不在是单纯的一组值集,而是一组值集和一组操作的二元合成。为用户提供自定义类型的设施,如并发Pascal中的进程,管程,过程,Ada中的Package。使得类型表示细节、操作的实现对外不可见,故称为抽象数据类型。用户自定义类型设施正是语言中的基本程序模块,从而将模块和数据类型等同起来;一个模块是由数据和作用在其上的操作构成的实体。这时,模块不在是一个功能抽象单位,而是一个数据抽象单位。模块间的界面不再是复杂的数据,而是作用在数据上的具有形式说明的操作数据抽象的背景与动机2023/7/229鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.2数据抽象和抽象数据类型总之:数据抽象是程序设计方法学的一个极为重要的方法,是70年代程序设计方法学的主要成就之一。把数据抽象和结构化程序设计一起誉为程序设计方法学发展史上的两个里程碑。2023/7/2210鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.3抽象数据类型的形式规范描述为什么:程序员如何来定义数据抽象模块?模块的用户怎样才能在不知道细节的情况下,正确地使用语言数据抽象模块?2023/7/2211鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.3.1抽象数据类型的规范描述1.抽象数据类型的规范描述:程序员在划分模块时,必须给出模块语义的注释—规范描述:说明模块将做什么;使得设计者能够以此作为模块设计的目标;确保编写的模块满足规范描述的要求,保证模块实现的正确性;模块的使用者以此作为使用的依据,保证用户正确理解模块和正确使用模块便于证明模块实现的正确性;为使用模块的应用程序的正确性证明提供条件2023/7/2212鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.3.1抽象数据类型的规范描述2.ADT规范描述方法ADT的形式规范有许多方法,可归为两类:操作规范定义规范操作规范:不是描述抽象类型的性质,而是给出构造它的方法,即用某种底层语言为这个类型建立模型。特点:它容易被培训过的程序员构造。对于包含少量中等运算的抽象类型,操作规范提供了充分的清晰度当被描述的运算变得复杂时,操作规范势必变得冗长2023/7/2213鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.3.1抽象数据类型的规范描述定义规范:给出抽象类型的目标及其运算必备的性质特点:倾向于一般的定义类型,不过多涉及多余的细节,因而能增加规范的清晰度方法:Hoare公理规范方法:应用广泛数学语义的格理论方法:特点对论述的定义域限制更少;可以对实现者提供引导2023/7/2214鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedHoare公理化方法例:Modulesmallintset:给出了在域1-100的整数集合的抽象。运算包括:insert,remove,has。当类型smallintset的变量被声明时,它被初始化为空集。该集合将由100个元素的布尔数组S描述,即:
s:array1..100ofboolean其中,s(i)=TRUE表示i属于该集合。2023/7/2215鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedModulesmallintset该抽象类型的规范如下:Typesmallintset=pretruemodulesmallsetabstractinvarianttrueconcreteinvarianttrueexports(insert,remove,has,:=)
vara:array1..100ofboolean(Con’t)2023/7/2216鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedModulesmallintset(Con’t)procedureinsert(i:integer)=pre1<=i<=100andsmallset=smallset’postsmallset=smallset’union{i}begins(i):=trueendinsertProcedureremove(i:integer)=pre1<=i<=100andsmallset=smallset’postsmallset=smallset’-{i}begins(i):=falseendremove2023/7/2217鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedModulesmallintset(Con’t)Functionhas(i:integer)returnhasresult:boolean=pre1<=i<=100posthasresult=(ismallset)begin
hasresult:=s(i)endhasInitiallypostsmallset={}beginforjins.indextypeloops(j):=falseendloopendinitially2023/7/2218鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedModulesmallintset(Con’t)Abstractionfunctionsetvaluereturnsresult=import(s)begin
resultset={j|s(j)and1<=j<=100}endinvarianttrueEndsmallintset该模型提供了不同层次的信息:模型的用户仅看到与模型子程序相联系的Pre/Post条件,以及与模型本身相联系的Pre/Post条件。模型实现者还会看到模型子程序的体和模型中说明的标识符2023/7/2219鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved代数方法抽象类型的代数规范由三部分组成:语法规范:该规范提供了语法和类型检查信息,即与类型相联系的运算的名字、定义域和值域。语义规范:一组公理集合,这些公理使用确定运算之间的关系定义运算。约束规范:约束规范涉及前置条件和执行条件。例:2023/7/2220鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved类型BAG的代数规范语法规范:Empty-bag:bagInsert:bagxintegerbagDelete:bagxintegerbagMember-of:bagxintegerboolean2023/7/2221鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved类型BAG的代数规范(Con’t)语义规范Declareb:bag;i,i’:integerMember-of?(empty-bag,i)=falseMember-of?(insert(b,i),i’)=if?=?(i,i’)thentrueelsemember-of?(b,i’)Delete(empty-bag,i)=empty-bagDelete(insert(b,i),i’)=if?=?(i,i’)thenbelseinsert(delete(b,i’),i)2023/7/2222鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved例2:类型SET的代数规范语法规范Empty-set:setInsert:setxintegersetDelete:setxintegersetMember-of?:setxintegerboolean2023/7/2223鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved例2:类型SET的代数规范语义规范Declares:set;i,i’:integer;Member-of?(empty-set,i)=falseMember-of?(insert(s,i),i’)=if?=?(i,i’)thentrueelsemember-of?(s,i’)Delete(empty-set,i’)=empty-setDelete(insert(s,i),i’)=if?=?(i,i’)thendelete(s,i’)elseinsert(delete(s,i’),i)Bag与Set的区别2023/7/2224鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势稳定:较小的需求变化不会导致系统结构大的改变举例:某公司的销售处理系统定单合同出费2023/7/2225鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势稳定:数据和功能都打包在一起,从而改善软件的再重用性软件重用能提高质量,减少由于编制新的系统代码而产生的成本File
MgrMacro
EditorMath
UtilitiesText
EditorPrint
UtilitiesFormat
EditorMenusString
UtilitiesSpreadsheetWordProcessorReusable-ComponentRepository2023/7/2226鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势面向对象的模型更加贴切地反映了现实世界更加准确地描述公共数据和过程易于理解,尤其对于使用者现实世界LaserPrinterExternalDriveComputer对象图2023/7/2227鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势面向对象的方法支持大规模开发可以严格定义各个组件之间的交互减少内部的依赖关系减少集成的问题支持并行开发2023/7/2228鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势帮助开发多层结构
EquipmentandCustomerspecificCodeProcessesandotherapplicationcodeMajorabstractions,classes,etc.MechanismsH/Wspecificcode,O/Sspecificcodegeneral-purposecode12345ApplicationSpecificApplicationIndependentLessReuseMoreReuse2023/7/2229鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势对系统的一部分进行再工程,保护前期软件应用的投资ExistingSoftwareReengineeredSoftware2023/7/2230鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.4面向对象技术的优势(小结)需求改变时系统稳定高水准的软件Reusability更准确的模型,更易于理解严格定义大规模开发的交互界限对象的封装有利于client-server应用的开发再工程保护前期投资OOD增加细节和设计决策开发人员的角度OOA开发需求模型用户的角度OOP实现和测试2023/7/2231鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.5面向对象的基本概念对象、类、消息封装性、继承性和多态性概念内涵的区别OOM=Object+Class+Inheritance+Communicationwithmessages2023/7/2232鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved1.对象Object化学过程连接显示一个对象代表了一个现实的或虚构的实体自然实体概念实体软件实体2023/7/2233鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved对象在OO中,所谓对象,是一个属性(数据)集及其操作(行为)的封装体。对象=数据+功能作为计算机模拟真实世界的抽象,一个对象就是一个实际问题论域、一个物理的实体或逻辑的实体。在计算机程序中,可视为一个“基本程序模块”,因为它包含了数据结构和所提供的相关操作功能。2023/7/2234鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved对象的属性对象是应用中具有明显边界和含义的概念、抽象或事物一个对象有三个重要属性:状态行为标识术语“实例”是“对象”的同义词2023/7/2235鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved对象的状态一个对象的状态是它反映于现实世界的一系列属性:参数的数值(也就是,与对象有关系的数据)它与其它对象的关系任一时刻的历史状态包括那些属性取决于视点可能的状态(运营角度)
停泊运营
着陆
终止班机747可能的状态(维修角度)
发动机型号线路规范…2023/7/2236鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved对象的行为定义当其它对象发出请求时,该对象如何反应由为对象定义的一系列操作决定班机747核对出发时间(返回9:27)机票代理2023/7/2237鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved对象的标识OID每一个对象都有一个唯一的标识,即使其状态有可能与其它对象一样班机747on11/10班机747on11/11班机747on11/122023/7/2238鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved2.什么是类(Class)
类是一组具有相同结构和行为的对象的集合共同的结构通过属性表现出来(i.e.数据)共同的行为通过操作表现出来(i.e.功能)班机747结构班机号日期分配的班机起点终点状态行为装载设备起飞延迟取消终止2023/7/2239鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved3.消息(Message)消息(Message)是面向对象系统中实现对象间的通信和请求任务的操作。消息传递是系统构成的基本元素,是程序运行的基本处理活动。Message:=object_ID.method_ID(parameter(s));一个对象所能接受的消息及其所带参数,构成该对象的外部接口。一个对象可以同时向多个对象发送消息,也可以接受多个对象发来的消息,消息只反映发送者的请求,由于消息的识别、解释取决于接受者,因而同样的消息在不同对象中可解释成相应的行为。2023/7/2240鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved4.封装性(Encapsulation)封装的目的是有效实现信息隐藏原则。这是软件设计模块化、软件复用和软件维护的一个基础。封装是一种机制,它将某些代码和数据链接起来,形成一个自包含的黑盒子(即一个对象)。封装的定义为:一个清楚的边界,封装的基本单位是对象;一个接口,描述该对象与其它对象之间的相互作用;受保护的内部实现,提供对象的相应的软件功能细节,且实现细节不能在定义该对象的类之外DirLocSet-in-griddisplayFacingWallTurn-left/rightAdvanceLocation2023/7/2241鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved5.继承性(Inheritance)继承性体现了现实世界中对象之间的独特关系。既然类是对具体对象的抽象,那么就可以有不同级别的抽象,就会形成类的层次关系。FlyingThingAnimalAirplaneHelicopterBirdWolfHorse2023/7/2242鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved继承继承表示子类从父类继承时抽象的层次单继承:子类只从一个父类继承多继承:子类从多于一个的父类继承继承通常被称为“is-a”或“kind-of”
一个子类的实例也“isa”父类的实例一个子类的实例是“kind-of”父类继承的内容:属性、操作、关系、约束2023/7/2243鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved多重继承在建模中直观、准确地反映现实世界在实现中有可能带来困难名字冲突:两个或更多的子类定义了同样的属性和操作重复继承:两个或更多的同级父类有同一个子类每一个编程语言/环境都有解决的方法并不是所有面向对象编程语言都直接支持多重继承VehicleGroundVehicleAirVehicleCarTruckAmphibiousVehicleSailboat2023/7/2244鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved继承的益处增加软件重用的机会降低开发和维护费用开发一个更贴近现实的模型系统更加灵活所有的子类自动继承父类的改变可以通过增加一个子类来处理需求的改变保证类之间的一致性父类可以为所有子类定制规则;(许多OOP语言必须指定这类规则)继承界面和实现过程支持多态2023/7/2245鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved继承vs.聚合容易混淆继承是“is-a”或“kind-of”的关系聚合是“has-a”的关系替代法则:测试继承关系替代法则如果子类D的一个对象被替换为父类B的一个对象,在类B中定义的所有程序的行为应保持不变。2023/7/2246鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved6.多态性(Polymorphism)多态性原意是指一种具有多种形态的事物,这里是指同一消息为不同的对象所接受时,可导致不同的行为。多态性支持“同一接口,多种方法”,使高层代码(算法)只写一次而在低层可多次复用,面向对象的多种多态性方法的使用,如动态绑定(dynamicbinding)、重载(overload)等,提高了程序设计的灵活性和效率。在C++中,利用多态性概念,使用函数名和参数类别来实现功能重载.PolygonareaRECTANGLEareaTRIANGLEareaHEXAGONarea2023/7/2247鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserveddoubleavg(constdoublea[],intsize);doubleavg(constinta[],intsize);doubleavg(constdoublea[],intsize);{doublesum=0.0;for(inti=0;i<size;++i)sum+=a[i];return(sum/size);}doubleavg(constinta[],intsize);{intsum=0;for(inti=0;i<size;++i)sum+=a[i];return((double)sum/size);}main(){intk[3]={1,2,3};doublex[3]={1.1,2.2,3.3};
cout<<avg(k,3)<<“intaverage\n”;
cout<<avg(x,3)<<“doubleaverage\n”;}⑴Function(orparameter)overloading:不同函数共用一个名字,而调用参数的特征不同。例:7Overloading2023/7/2248鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved⑵Operatoroverloading:同一运算符(operator)作用于不同类型的操作数(operand)上面。在编译(compile)阶段就决定了使用类型及执行代码,故亦称为静态联编
(staticbinding)或先前联编
(earlybinding)。7Overloading多态和重载的区别:多态允许不同的类所定义的方法具有相同的名字重载允许同名的方法在同一个类中定义多次。2023/7/2249鲍玉斌东大信息学院软件所程序设计方法学AllRightsReserved9.6面向对象设计的过程“面向对象”是一个认识论和方法学的基本原则。人对客观世界的认识和判断常常是采用由一般到特殊(演译法)和由特殊到一般(归纳法)的两种方法,这实际上是对认识判断的问题论域对象进行分解和归类的过程。OOD增加细节和设计决策开发人员的角度OOA开发需求模型用户的角度OOP实现和测试描述一个解所
需要的对象问题空间中
的对象实现一个解所
需要的对象解空间中
的对象类库中所拥有
的对象由面向对象语
言实现的对象OOAOODOOP2023/7/2250鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedOOA的任务采用面向对象方法,把对问题论域和系统的认识理解,正确地抽象为规范的对象(包括类、继承层次)和消息传递联系,形成面向对象模型,为后续的OOD和OOP提供指导。而且,OOA与OOD能够自然地过渡和结合也是面向对象方法值得称道的一个优点。2023/7/2251鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedOOA步骤面向对象分析的关键是对问题域中事物的识别和它们之间相互关系的判定。根据设计进程和分析问题的繁简程度,把系统或问题分解成为一些对象,并以消息的形式在各对象间建立联系。分析步骤如下:2023/7/2252鲍玉斌东大信息学院软件所程序设计方法学AllRightsReservedOOA步骤分析步骤如下(6步):1.分析确定并标识构成系统的各个组成部分(即对象),并进行抽象分类;划分主题及类,是从大的单元来理解系统的方法,主题是一组类与对象。主题的大小应合适地选择。2.分析确定每一组成部分(即对象)的结构。具体的分析原则:按照一般-特殊结构,确定标识类间的继承关系;按照整体-部分结构,确定一个对象怎样由其它对象组成,或者是如何将一些对象组合成大对象。2023/7/2253鲍玉斌东大信息学院软件所程序设计方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年事业单位联考公共基础知识必考点
- 描写一件我最珍爱的物品6篇
- 智能硬件产品开发流程详解与质量控制策略
- 信息安全规范与操作指南
- 高端艺术品可靠性承诺函范文7篇
- 船舶理货员诚信品质水平考核试卷含答案
- 信用管理师安全生产知识竞赛考核试卷含答案
- 企业培训计划与实施方案模板提高员工能力
- 农机服务经纪人安全宣教模拟考核试卷含答案
- 铋冶炼工变革管理模拟考核试卷含答案
- (2026版)《医疗保障基金使用监督管理条例实施细则》深度解读
- 世界知识产权日宣传课件
- 2026苏教版小学数学二年级下册期中综合测试卷及答案(共3套)
- 学校内部控制风险评估结果报告-学校工作总结
- 探索叙述者:理论、形态与功能的多维解析
- 2026年浙江长征职业技术学院单招综合素质考试题库有答案详细解析
- 病理科建设与管理指南(试行)
- (2026年)临床护理文书书写规范
- 2026年吉林铁道职业技术学院单招职业倾向性考试题库附答案详解(完整版)
- 2025年辽宁省考公安岗面试题库及答案
- 老年静脉治疗相关课件
评论
0/150
提交评论