【文档说明】软件工程电子教案第九十二章面向对象课件.ppt,共(73)页,605.500 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-50489.html
以下为本文档部分文字说明:
第九~十二章面向对象开发技术传统的软件工程方法学曾经给软件产业带来巨大进步,部分地缓解了软件危机,使用这种方法学开发的许多中、小规模软件项目都获得了成功。但是,人们也注意到当把这种方法学应用于大型软件产品的开发时,似乎很少取得成功。在20世纪60年代后期
出现的面向对象编程语言Simula-67中首次引入了类和对象的概念,自20世纪80年代中期起,人们开始注重面向对象分析和设计的研究,逐步形成了面向对象方法学。到了20世纪90年代,面向对象方法学已经成为
人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。第1页,共73页。–面向对象是当面计算机界的关心的重点,它是90年代软件开发方法的主流,面向对象的概念和应用已超过了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用
结构、应用平台、网络管理结构、人工智能领域,它是软件开发的一种新方法,新技术。9.2面向对象的概念–定义:面向对象=对象+类+继承+通信。OO=objects+classes+inheritance+communicationwithmessages–如果一个软件系统
是使用这样4个概念设计和实现的,则可以认为这个软件系统是面向对象的。第2页,共73页。9.2.1对象(object)面向对象开发模式认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某
种方式组合而成。按照这种观点,可以认为整个世界就是一个最复杂的对象。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。由此可见,面向对象方法用对象分解取代了传统方法的功能分解。对象是面向对象开发模式的基本成分是人们要进行研究的人和事物。第3
页,共73页。一、对象的主要类型:1)有型实体:如计算机、机房、工件(某些零件)等。2)作用:指人或组织起的作用,如:医生、教师、学生、公司、部门等。3)事件:如:飞行、演出、开会等。4)性能说明:如产品名字、型号、各种性能指标等。以上类型可以看出,对象不仅能表
示结构化数据,而且能表示描象的事件规律,复杂的工程实体等。因此对象具有很强的表达能力和描述功能。第4页,共73页。二、对象的状态和行为对象具有状态,一个对象用数值来描述它的状态,如某个具体的学生张三,他的姓名、年龄、性别等,用具体数据值来表示着个具体的学生的情况。对象还有操作,
用于改变对象的状态,对象及其操作就是对象的行为,例某个工人经过“增加工资”的操作后,他的工资额这个状态就放生了变化。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。第5页,共73页。9.2.2其他概念一、类的定义具有相同或相
似性质的对象的抽象就是类。类的具体化,也就是类的实例是对象。类具有属性:类的属性是对象的状态的抽象,用数据结构来描述类的属性。类具有操作:它是对象的行为的抽象,用操作名和实现操作的方法来描述。第6页,共73页。例:工人就是一个类
,每一个具体的工人就是对象:第7页,共73页。二、类的结构类通常有两种主要结构。一般——具体结构称为分类结构,或者说是“isa”关系。例:汽车和交通工具都是类,但它们之间的关系是:汽车是(isa)一种
交通工具,通常越上层的类,越具有一般性和共性,越下层的类越具体越细化。整体——部分结构称为组装结构,或者是“hasa”关系,例汽车和发动机都是类,它们之间的关系是“汽车(hasa)有一个发动机。在类的层次结构中,通常上层类称
为父类,下层类称为子类。第8页,共73页。三、实例(instance)实例就是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象,类在现实世界中并不能真正存在。实际上类是建立对象时使用的“样板”,
按照这个样板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。当使用“对象”这个术语时,既可以指一个具体的对象,也可以泛指一般的对象,但是,当使用“实例”这个术语时,必然是指一个具体的对象。第9页,共73页。四、继承(Inheritanle)•继承是
类之间的一种关系,是子类自动共享父类数据结构和方法的机制,是面向对象设计语言的最主要的特点。•在类层次中,子类只继承一个父类的数据结构和方法,称为单重继承。•在类层次中,子类只继承多个父类的数据结构和方法,称为多重继承。第10页,共73页。五、封装(encapsulation)从字面上理解,所谓
封装就是把某个事物包起来,使外界不知道该事物的具体内容。在面向对象的程序中,把数据和实现操作的代码集中起来放在对象内部。一个对象好像是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码与局部数据,都被封
装在黑盒子里面,从外面是看不见的,更不能从外面直接访问或修改这些数据和代码。使用一个对象的时候,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。第11页,共73页。综上所述,对象具有封装性的条件如下:(1)有一个清晰的边界。所有私有数据和实现操作的代
码都被封装在这个边界内,从外面看不见更不能直接访问。(2)有确定的接口(即协议)。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。(3)受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。封装也就是信息隐藏,通过封装对外界隐藏了对象
的实现细节。对象类实质上是抽象数据类型。类把数据说明和操作说明与数据表达和操作实现分离开了,使用者只需知道它的说明(值域及可对数据施加的操作),就可以使用它。第12页,共73页。六、多态性多态性指相同的操作、函数、过程可作用于多种类型的对象上,并获得不同结果。即不同的对象,收到同一消息可以产生不
同的结果。例:MOVE操作,可以是窗口某一图标的移动操作,也可以是象棋棋子移动的操作。图标移动为了使窗口更清晰,棋子移动为赢这盘棋。同样的函数作用不同对象效果不同。例:函数x、3+x、与3-x结果是完全不同的。多态性允许每个对象以适合自身的方式
去响应共同的信息,用户不必为相同的功能操作但作用于不同类型的对象而费心去识别,增强了软件的重用性和可扩充性。第13页,共73页。9.3面向对象的开发方法•当今面向对象开发方法有Coad方法、Booch方法、OMT方法和O
OSE方法等。这几种方法是早期产品,课堂上不介绍了。现简单介绍UML语音即统一建模语言(UnifiedModelinglanguage)•1997年11月,国际对象管理组织OMG批准把UML1.1作为基于面向对象技术的标准建模语言。UML是97年软件工程领域,最重要的成果之一,是面对象技术领域内占
主导地位的标准建模语言,UML不仅统一了Booch、OMT、OOSE的表示方法并对其作了进一步的发展,最终统一为大众所接受的标准建模语言。第14页,共73页。第十章面向对象分析和高层设计•面向对象的分析是软件开发过程中最重要的一步,也是使用面向对象的概念、原理、
分析解决问题、求解问题的重要阶段。•面向对象的分析从概念上分为两个层次:•第一层:问题分析:主要任务是收集并确认用户的需求信息,对实际问题进行功能分析和过程分析。•第二层:应用分析:主要任务是动态描述系统中,对象的合法状态序列,即建立正确的模型。第15页,共73页。为了更好地理解问题,人们常常
采用建立问题模型的方法。所谓模型,就是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。更进一步讲,
模型是一种思考工具,利用这种工具可以把知识规范地表示出来。对于那些因过分复杂而不能直接理解的系统,特别需要建立模型,建模的目的主要是为了减少复杂性。模型可以帮助我们思考问题、定义术语、在选择术语时作出适当的假
设,并且可以帮助我们保持定义和假设的一致性。第16页,共73页。面向对象方法最基本的原则,是按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。用面向对象方法开发软件,通常需要建立3种形式的模型,它们分别是描述系统数据结构的对象
模型,描述系统控制结构的动态模型和描述系统功能的功能模型。这3种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这3种模型从3个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。一个典型的
软件系统组合了上述3方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。第17页,共73页。10.3建立对象模型面向对象的模型最基本的有三个它们分别是:对象模型、动态模型、功能模型。从客观世界实体及实体间相互关系抽象出极有价值的对象模型;表示
了静态的、结构化的系统数据性质,表述了系统的静态结构。(描述系统数据结构),表现了对象关系。该模型主要关心系统中的:①对象的结构;②属性;③操作和方法;④关联和链;⑤类的层次。对象模型是三个模型的核心也是其它两个模型的框架。第18页,共73页。10.3.1对象和类•对象是基本
成分,使人们在研究问题时,把问题分解为若干对象,(对象可以是有形实体,也可以是作用、事件、性能说明等等)对象是一个具体的有很强的表达能力和描述功能的独立体。•对象的符号:•将对象抽象成类,类的表示法,图中的属性和操
作可写可不写,取决于详细程度。(类名)属性值第19页,共73页。对象和类的表示方法示例类实例(具体对象)类名属性名操作名(类名)属性值正方形边长位置边界颜色内部颜色画图擦图移动第20页,共73页。10.3.4属性解绍类时曾讲过,类具有属性。类的
属性:是对象状态的抽象,用数据结构来描述类的属性。也就是说:类的属性是类的对象所具有的性质,不同的对象同一属性可以具有相同或不同的属性质。但一个类中的属性名是唯一的。例:正方形类中有“边界颜色”这一属性,正方形1的边界颜色为红色,正方形2的边界颜色为绿色,同一属性不同的对象不同的属性质,但
一个类中的属性名是唯一的。第21页,共73页。10.3.3操作和方法操作:是对象的行为的抽象(类中介绍),即操作是类中对象所使用的一种功能或变换。方法:是类中操作的实现过程,即实现步骤。例:文件这个类,可以有打印这种操作;实现打印需设计不同的方法,即要写不
同的程序代码段来实现:ASCⅡ文件的打印和数字图像文件的打印方法是不同的,但所有的方法多是实现一个操作,即打印文件。第22页,共73页。10.3.2关联和链•关联是建立类之间关系的一种手段,链是建立对象之间关系的一种手段,正如对象与类的关系一样,链是关联的实例,关联是链
的抽象。两个类之间的关联称为二元的关联,三个类之间的关联称为三元关联。•例:三元关联链第23页,共73页。关联的多重性指类中有多少个对象与关联的类的一个对象有关。例:—1个、空心园○0个或1个、实心圆●多个。第24页,共73页。类的层次结构1、聚集关系:是一种整体---部分关系,是ha
sa(类的结构中介绍了两种结构)。•在这种关系中有整体类和部分关系之分,符号只是在关联的整体类端多了一个菱形框。•例:第25页,共73页。聚集可以有不同的层次,可以组成一个聚集树。•例:第26页,共73页。2、泛化关系是一般——具体关系称为
分类关系。是在保留对象差异的同时,共享对象相似性的一种高度抽象方法,即isa一般—具体关系。符号是联线加一个小三角例:汽车、火车是交通工具。汽车火车第27页,共73页。10.3.5建立对象模型的过程:
1、确定类:标出来自问题域的相关对象类。2、准备数据字典准备一个数据字典,准确描述各个类的精确含义。第28页,共73页。3、确定关联两个或多个类之间的相互依赖关系就是关联。4、确定属性对象的状态的抽象,
为类的属性,属性通常用形容词或名词词组来表示。先列出属性,再删除不必要和不正确的属性。5、使用继承来细化类有两种方法:1)自底向上,把现有类的共同性质一般化成一个父类,如:月报表、日报表、组成一个大类报表。2)自上向下,把现有类再细化成更小的类,例:菜单细化成固定菜单、顶部菜单、弹出菜单、下拉菜单
等。第29页,共73页。6、完善对象模型对象建模不可能一次就保证模型是完整正确的,面向对象开发的整个过程,就是不断完善的过程,有些细化和完善工作是在设计阶段才开始,即在设计和实现过程中发现问题再回来细化和完善。第30页,
共73页。10.4建立动态模型当问题涉及交互作用和时序时(例如,用户界面及过程控制等),动态模型是重要的。这个模型描述了系统的控制结构,它关心的是系统的控制,操作的执行顺序,它从对象的时间和状态的角度出发,表现了对象的相互行为。它涉及到事
件、状态、操作、状态图等概念。第31页,共73页。一、名词解释⑴事件事件是指定时刻发生的某种事情,它是某种事发生的信息没有持续时间的一种相对性快速事件,如:按下启动按钮,火箭发射,某种时间你把信用卡放入
ATM机里准备取款。事件可以看成是信息从一个对象到另一个对象的单向传送,各事件将信息从一个对象传到另一个对象中去,因此要确定各事件的发送对象和接收对象。事件跟踪图用来表示事件,事件的接受对象和发送对象,各事件用水平箭头线表示。箭头方向是
从发送对象指向接受方向,时间从上到下递增。例上图打电话的事件跟踪图。第32页,共73页。⑵状态状态是对象属性值的抽象,状态指明了对象输入事件的响应。事件和状态是孪生的,一事件分成两种状态,(行、不行),一个状态分成两个事件(能
做、不能做)。说明一个状态可以采用以下描述内容:状态名;状态目的的描述;产生该状态的事件序列;表示状态特征的事件;在状态中接受的条件。⑶状态图状态图反映了状态与事件的关系。当接收一事件时,下一状态就取决于当
前状态和所接受的该事件,由该事件引起的状态变化称为转换。利用状态图可能会发现一些遗漏的情况。第33页,共73页。状态图表示方法:状态用圆圈表示,圆圈内有状态名;用箭头连线(弧)表示状态的转换,上面标记事件名,箭头表示转换方向。示意图:初始状态;⊙最终状
态。进入最终状态隐含着对象消失。例:象棋比赛中的单程状态图:一般将事件追踪图转换成状态图。第34页,共73页。二、建立动态模型的过程:1、准备脚本编写脚本的过程,实质上就是分析用户对系统交互行为的要求的过
程。在编写脚本的过程中,需要与用户充分交换意见,编写后还应该经过他们审查与修改。动态分析寻找事件的开始,然后确定各对象的可能事件的顺序。例:要建一个自动取款机的动态模型,就要找出取款事件、存款事件、查询
事件。第35页,共73页。2、确定事件确定所有事件、条件和外部事件,事件包括所有来自用户和设备的输入信息和发行出去给用户和设备的输出信息。不要有遗漏、异常事件和条件。3、准备事件跟踪表列出一个事件排序表。下一页打电话事件排序表4、构造状态图将事件表变
成反映状态与事件的关系状态图。利用状态图发现是否有遗漏的情况。第36页,共73页。打电话者电话线接电话者拿起受话机电话忙音开始拨号(8)电话忙音结束拨号(2)拨号(2)铃声电话振铃响应电话停止振铃停止振铃通话通话挂断电话
电话切断电话切断挂断电话第37页,共73页。10.5建立功能模型功能模型描述了系统的所有计算,即系统内部数据的传送和处理,功能模型定义“做什么”,动态模型定义“什么时间做”做的顺序,对象模型定义“对谁做”。功能模型不考虑计算的次序,它由多张数据流图组成。数据流图中
包含处理、数据流、动作对象和数据存储对象。其中的处理功能可以用IPO图(或表)、伪码等多种方式进一步描述。1、处理:数据流图中的处理用来改变数据值,椭圆表示处理,其中含有对处理的描述,各处理均有输入流和输出流。第38页,共73页。2、数据流:数据流将对象的输出与处理;处理与对象的输入;处
理与处理联系起来。3、动作对象:为数据流的输入流的产生对象和输出流的接收对象。如果动作对象位于数据流图的边界,既是输入流的源点和输出流的终点,动作对象用长方形表示。控制流数据流数据存储区产生对象1过程1过程2接收对象2第39页,共73页。4、数据存储对象它与动作对象
不一样,其本身不产生任何操作,它只响应存储和访问数据的要求,存储可以用文件来实现,而动作对象也可用外部设备来体现。5、建立功能模块的过程:1、确定输入值、输出值。2、建立数据流图第40页,共73页。小结•面向对象的分析过程:•面向对象的分析和高层设计,就是在了解业务和用户的需求基
础上建立出这三个模型(对象、动态、功能)。第41页,共73页。第十一章面向对象的设计面向对象的分析缩写为OOA,面向对象的设计缩写为OOD。一、什么是面向对象的设计①面向对象的设计是把分析阶段得到的需求,(即三个模型)转变到
计算机系统要实现方案的过程中;②面向对象分析到面向对象设计是一个逐步扩充模型的过程;③尽管面向对象的分析和设计的定义有明显区别,但在实际的软件开发过程中二者的界限是模糊的,许多分析可以直接映射成设计结果,而设计过程中又往往会加深和补充对系统需求的理解,从而进一步完善分析结果。第42页,共73页。因
此分析和设计活动是一个多次反复迭代的过程,面向对象方法学在概念和表现方法上的一致性,保证了在各项开发活动之间的平滑(无缝)过度,领域专家和开发人员能够比较容易地跟踪整个系统开发过程,这是面向对象方法与传统比起来具有的一大优势。二、相对结构化设计方法的
总体设计和详细设计,面向对象设计也可大致分成系统设计和对象设计。第43页,共73页。11.1面向对象设计的准则模块化设计的几条基本原理,在面向对象设计时仍适用,但增加了一些新的特点。面向对象设计的准则:1、模块化支持把系统分成模块的设计原理:对象就是模块,它是把数据结构和操作这些数据的方法紧密
地结合在一起所构成的模块。2、抽象面向对象的方法不仅支持工程抽象而且支持数据抽象,类实际上是一种规格说明抽象。第44页,共73页。3、信息隐蔽在面向对象的方法中,信息隐蔽通过对象的封装性来实现。对类的用户来说,
属性的表示方法和操作的实现算法都应该是隐蔽的。4、低耦合在面向对象方法中,对象是最基本的模块,因此耦合主要指不同对象之间相互关联的紧密程度,低耦合是设计的一个重要标准。第45页,共73页。5、高内聚面向对象设计存在下述三种内聚:1)操作内聚:一个
操作只能完成一个功能。2)类内聚:一个类应该只有一个用途,它的属性和操作是高内聚的,不包含无用的属性和操作,如果某个类有多个用途,通常应该把它分解成多个专用类。3)一般——具体内聚:设计类的一般——具体结构应该符合多数人的概念,准确地说:这种结构应该是对象应用领域知识的正确
抽取。第46页,共73页。11.2面向对象设计的启发规则•虽然面向对象开发软件的历史不长,但人的也积累了一些经验,这经验能帮助软件开发人员提高开发软件的质量,这些经验称启发规则:1、设计结果应清晰易懂,(用词一致,避免模糊定义,使用已有的协
议等)。2、一般——具体结构的深度应适当,(中等规模系统100类左右,类结构层次数应保持为5至9)。第47页,共73页。3、设计简单的类(设计的类不要包括太多的属性和操作)4、使用简单的协议(消息中的参数
不要超过3个,这不是绝对的)。5、使用简单的操作(类的操作一般,只有3~5行源程序语句)。6、把设计变动减到最小通常设计的质量越高,设计得修改范围就越小,开始改动大,方案越成熟改动也越小。第48页,共73页。11.3软件重用11.3.1概述1.重用重用也叫
再用或复用,是指同一事物不作修改或稍加改动就多次重复使用。广义地说,软件重用可分为以下3个层次:(1)知识重用(例如,软件工程知识的重用)。(2)方法和标准的重用(例如,面向对象方法或国家制定的软件开发规范的重用)。(3)软件成分的重用。前两个重用层次属于知识工程研究的范畴,本节仅
讨论软件成分重用问题。第49页,共73页。2.软件成分的重用级别软件成分的重用可以进一步划分成以下3个级别:(1)代码重用通常把它理解为调用库中的模块。实际上,代码重用也可以采用下列几种形式中的任何一种:1
)源代码剪贴:这是最原始的重用形式。这种重用方式的缺点是,复制或修改原有代码时可能出错,更糟糕的是,存在严重的配置管理问题,人们几乎无法跟踪原始代码块多次修改重用的过程。第50页,共73页。继承:利用继承机制重用类库中的类时,无须修改已有的代码,就可以扩充或具体化在库中找出
的类,因此,基本上不存在配置管理问题。(2)设计结果重用设计结果重用指的是,重用某个软件系统的设计模型(即求解域模型)。这个级别的重用有助于把一个应用系统移植到完全不同的软硬件平台上。(3)分析结果重用这是一种更高级别的重用,即重用某个系统的分析模型。这种重用特别适用于用户需求未改变,但系统体系结
构发生了根本变化的场合。第51页,共73页。3.典型的可重用软件成分更具体地说,可能被重用的软件成分主要有以下10种:(1)项目计划。软件项目计划的基本结构和许多内容(例如,软件质量保证计划)都是可以跨项目重用的
。这样做减少了用于制定计划的时间,也降低了与建立进度表和进行风险分析等活动相关联的不确定性。(2)成本估计。因为在不同项目中经常含有类似的功能,所以有可能在只做极少修改或根本不做修改的情况下,重用对该功能的成本估计结果
。(3)体系结构。即使在考虑不同的应用领域时,也很少有截然不同的程序和数据体系结构。因此,有可能创建一组类属的体系结构模板(例如,事务处理体系结构),并把那些模板作为可重用的设计框架。通常把类属的体系结构模板称为领域体系结构。第52页,共73页。(4)需求模型和规格说明
。类和对象的模型及规格说明是明显的重用的候选者,此外,用传统软件工程方法开发的分析模型(例如,数据流图),也是可重用的。(5)设计。用传统方法开发的体系结构、数据、接口和过程设计结果,是重用的候选者,更常见的是,系统和对象设计是可重用的。(6)源代码。用兼容的程序设计语
言书写的、经过验证的程序构件,是重用的候选者。(7)用户文档和技术文档。即使针对的应用是不同的,也经常有可能重用用户文档和技术文档的大部分。第53页,共73页。(8)用户界面。这可能是最广泛被重用的软件成分,GUI(图形用户界面)软件经常被重用。因为它可占到一个应用程序的60%代
码量,因此,重用的效果非常显著。(9)数据。在大多数经常被重用的软件成分中,被重用的数据包括:内部表、列表和记录结构,以及文件和完整的数据库。(10)测试用例。一旦设计或代码构件将被重用,相关的测试用例应该“附属于”它们也被重用。第54页,共73页。11.3.2类构件利用面向对象技术
,可以更方便更有效地实现软件重用。面向对象技术中的“类”,是比较理想的可重用软构件,不妨称之为类构件。类构件有3种重用方式,分别是实例重用、继承重用和多态重用。下面进一步讲述与类构件有关的内容。1.可重用软构件应具备的特点为使软构件也像硬件集成电路那
样,能在构造各种各样的软件系统时方便地重复使用,就必须使它们满足下列要求。(1)模块独立性强。具有单一、完整的功能,且经过反复测试被确认是正确的。它应该是一个不受或很少受外界干扰的封装体,其内部实现在外面是不可见的。第55页,共73页。(2)具有高度可塑性。
软构件的应用环境比集成电路更广阔、更复杂。显然,要求一个软构件能满足任何一个系统的设计需求是不现实的。因此,可重用的软构件必须具有高度可裁剪性,也就是说,必须提供为适应特定需求而扩充或修改已有构件的机制,而且所提供的机制必须使用起来非
常简单方便。(3)接口清晰、简明、可靠。软构件应该提供清晰、简明、可靠的对外接口,而且还应该有详尽的文档说明,以方便用户使用。精心设计的“类”基本上能满足上述要求,可以认为它是可重用软构件的雏形。第56页,共73页。2.类构件的重用方式(1)实例重用由于类的封装性,使用者无须了解实现细节就可以
使用适当的构造函数,按照需要创建类的实例。然后向所创建的实例发送适当的消息,启动相应的服务,完成需要完成的工作。这是最基本的重用方式。此外,还可以用几个简单的对象作为类的成员创建出一个更复杂的类,这是实例重用的另一种形式。虽然实例重用是最基本的重用方式,但是,设计出一个理想的
类构件并不是一件容易的事情。第57页,共73页。(2)继承重用面向对象方法特有的继承性提供了一种对已有的类构件进行裁剪的机制。为提高继承重用的效果,关键是设计一个合理的、具有一定深度的类构件继承层次结构。这样做有下述两
个好处:1)每个子类在继承父类的属性和服务的基础上,只加入少量新属性和新服务,这就不仅降低了每个类构件的接口复杂度,表现出一个清晰的进化过程,提高了每个子类的可理解性,而且为软件开发人员提供了更多可重用的类构件。因此,在软件开发过程中,应该时刻注意提取这种潜在的可重用构件,必要时应在领域专家帮助
下,建立符合领域知识的继承层次。2)为多态重用奠定了良好基础。第58页,共73页。(3)多态重用利用多态性还提供了一种简便可靠的软构件组合机制。系统运行时,根据接收消息的对象类型,由多态性机制启动正确的方法,去响应一个一般化的消息,从而简化了消息界面和软构件连接过程。为充分实现多态重用,在设计类
构件时,应该把注意力集中在下列一些可能影响重用性的操作上:与表示方法有关的操作。例如,不同实例的比较、显示、擦除等等。与数据结构、数据大小等有关的操作。与外部设备有关的操作。例如,设备控制。实现算法在将来可能会改进(或改变)的核心操作。如果
不预先采取适当措施,上述这些操作会妨碍类构件的重用。第59页,共73页。11.3.3软件重用的效益1.质量理想情况下,为了重用而开发的软件构件已被证明是正确的,且没有缺陷。事实上,由于不能定期进行形式化验证,错误可能而且也确实存在。但是,随着
每一次重用,都会有一些错误被发现并被清除,构件的质量也会随之改善。随着时间的推移,构件将变成实质上无错误的。第60页,共73页。2.生产率当把可重用的软件成分应用于软件开发的全过程时,创建计划、模型、文档、代码和数据所需花费的时
间将减少,从而将用较少的投入给客户提供相同级别的产品,因此,生产率得到了提高。由于应用领域、问题复杂程度、项目组的结构和大小、项目期限、可应用的技术等许多因素都对项目组的生产率有影响,因此,不同开发组织对软件重用带来生产率提高的数字的报告并不
相同,但基本上30%~50%的重用大约可以导致生产率提高25%~40%。第61页,共73页。3.成本软件重用带来的净成本节省可以用下式估算:C=Cs-Cr-Cd其中,Cs是项目从头开发(没有重用)时所需要
的成本;Cr是与重用相关联的成本;Cd是交付给客户的软件的实际成本。可以使用本书第13章讲述的技术来估算Cs,而与重用相关联的成本Cr主要包括下述成本:领域分析与建模的成本;设计领域体系结构的成本;为便于重用而增加的文档的成本;第62页,共73页。维护和完善
可重用的软件成分的成本;为从外部获取构件所付出的版税和许可证费;创建(或购买)及运行重用库的费用;对设计和实现可重用构件的人员的培训费用。虽然和领域分析及运行重用库相关联的成本可能相当高,但是它们可以由许多项目分摊。上面列出的很
多其他成本所解决的问题,实际上是良好软件工程实践的一部分,不管是否优先考虑重用,这些问题都应该解决。第63页,共73页。11.4面向对象设计的过程设计过程也可大体分成两个部分:一、系统设计,具体步骤:1、系统分解。将系统分解子系统,最低层的子系统,称为模块,
它不是一个功能(而是类、关联、操作事件和约束的集合)。2、确定并发性,确定有些必须是同时动作的对象,哪些不是。3、处理器及任务分配,(硬件和子系统的分配)。第64页,共73页。4、数据存储管理。数据存储管理是系统存储或检索对象的基本设施,它建立在某种数据存储管理系
统之上,并隔离了数据存储管理模式(文件、关系数据库或面向对象数据库)的影响。不同数据存储管理模式有不同特点,设计时要注意。5、人机交互接口对系统的人——机交互接口进行详细设计,确定细节其中包括指定窗口和报表形式,设计命令层次等项内容。第65页,共73页。二
、对象设计要确定实现用到的类,关联的完整定义,接口的形式以及实现操作方法的算法,可以增加实现必需的内部对象,对数据结构和算法进行优化。具体步骤:①获得类和对象的操作;②确定操作的目标对象,找出数据流图的中间值或子操作的
目标对象;③算法设计;④优化设计;⑤控制的实现;⑥调整继承;⑦关联的设计。第66页,共73页。第十二章面向对象的实现面向对象的实现主要包括两项工作:1)把面向对象设计结果翻译成用某种程序设计语言书写的面向对象程序;2)测试并调试面向对象的程
序。面向对象程序的质量基本上由设计的质量决定,但是所用的程序语言的特点和程序设计风格也将对程序的可靠性,可重用性及可维护性产生深远影响,第67页,共73页。12.1程序设计语言选择面向对象语言,应考虑以下实际因素:①选择采用
将来占主导地位的语言编程。②优先选用能够最完整,最准确地表达问题域语义的语言。③其它因素:对用户学习所能提供的培训操作,提供给开发员的开发工具、开发平台、对机器性能和内存的要求等。第68页,共73页。12.2程序设计风格在结构化设计中介绍的程序设计风格准则,
对面向对象的程序设计同样适用,但它特有的概念,还必须遵循一些新准则。1、提高重用性:面向对象的一个主要目标就是提高软件的重用性。2、提高可扩充性:①实现封装策略;②不要用一个方法遍历多条关联链;③避免使用多分支语句;④精
心确定公有方法。第69页,共73页。3、提高健壮性:①预防用户的操作错误;②检查参数的合法性;③不要预先确定限制条件;④先测试后优化。4、类的实现•类的实现是核心问题,在面向对象风格所写的系统中,所有数据都被封装在类的实例中,而整个程序被封装在一个更高级的类中。在设计好类后,可以只花费适量
的时间和工作量就能建立所需要的软件。•类的实现有多种方案,因课时关系不多介绍。第70页,共73页。12.3面向对象的测试策略面向对象的测试有一些与传统软件测试不同的特点:测试过程,其测试过程分为以下四个层次:1、算法层:测试类中定义的方法(基本相当于单
元测试)2、类层:测试统一类中所有的方法与属性之间的作用(相当于单元测试中的模块测试)3、模板层:测试一组协同工作的类之间的相互作用(相当于集成测试)。4、系统层:把各自系统组装成一个完整的系统,在组装过程中同
时进行测试。第71页,共73页。12.4测试方法:•以前讲的白盒、黑盒、逻辑覆盖、等价类划分,边界值分析等方法都同样实用。但面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点,增加了测试和调试难度。第72页,共73页。面
向对象方法学小结•面向对象方法学比较自然地模拟了人类认识客观世界的思维方式,它所追求的目标和遵循的基本原则,就是使描述问题的方式和在计算机解决问题的方式,在结构上尽可能一致。•用面向对象观点建立系统的模型,能够促进和加深对系统的理解,有利于开发出更容易理解,更容易维护的
软件。通常人们从三个互不相同,然而,密切相关的角度建立三种不同的模型。他们分别使描述系统静态结构的对象模型。描述系统控制结构的动态模型,以及描述系统计算结构的功能模型,其中对象模型是最基本、最核心、最重要的。第73页,共73页。