程序设计方法学_第1页
程序设计方法学_第2页
程序设计方法学_第3页
程序设计方法学_第4页
程序设计方法学_第5页
已阅读5页,还剩388页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计方法学叶枫

yefeng1022@河海大学计算机及信息工程学院程序设计方法学全文共393页,当前为第1页。课程内容(Contents)程序设计概述

1程序设计语言与环境

2结构化程序设计方法

3面向对象程序设计方法4程序设计方法学全文共393页,当前为第2页。课程内容(Contents)OO设计的基本原则

5设计模式

6程序设计优化

7开发实例解析8程序设计方法学全文共393页,当前为第3页。Chapter1

程序设计概述

1.1程序与程序设计

程序为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。程序设计程序设计是指在计算机上使用可执行的程序代码来有效描述解决特定问题算法的过程。程序是人类思维火花的实现定格,呈现出静态特征;而作为产生程序的过程,程序设计却是动态的,它反映了人类思维的规律和模式。

程序设计方法学全文共393页,当前为第4页。软件软件是计算机程序、所要求的文档资料和在计算机上运行时所必需的数据的总和。软件经历的3个主要阶段:(1)程序设计时期(2)软件=程序+说明时期(3)软件=程序+文档+数据时期程序是软件的重要组成部分

程序设计方法学全文共393页,当前为第5页。程序编写,是软件开发工程中的一个关键阶段。软件的质量主要是通过程序的质量来体现的,因此程序设计在软件开发过程中占有十分重要的地位。

但是,最初的程序设计全凭设计者个人经验和技艺独立进行,是一种典型的手工艺智力劳动。

软件危机softwarecrisis

程序设计方法学全文共393页,当前为第6页。软件的开发必须以工程化的思想为指导,运用标准和规范的方法来进行。

程序设计方法学全文共393页,当前为第7页。程序设计人员既需要有严密的思维能力,又需要有创意甚至是一定的艺术修养。成为一个优秀的程序设计者需要经过艰苦的努力。学习程序设计方法是必须的!程序设计方法学全文共393页,当前为第8页。程序设计的内涵不同的文化产生不同的思维和行为模式,也影响程序设计的发展。从文化内涵来看,以逻辑为核心的西方刚性文化与以思辨为核心的东方柔性文化有着截然不同的内涵,西方思维的基本特征是演绎思维,而东方思维的基本特征是归纳思维。

前者强调整体概念框架,由此演绎各种具体技术;后者则强调认识,通过各种技术归纳或建立整体的概念。程序设计方法学全文共393页,当前为第9页。计算机诞生于西方。自然地,程序设计以及由此衍生的各种软件工具等,都明显地带有西方文化的痕迹,体现其思维特征,其蕴含的思想实质也是西方的思维方式。创新离不开演绎思维程序设计方法学全文共393页,当前为第10页。程序设计的本质在于对两种文化及其思维框架的认识,从认识论的高度去理解程序设计。正确理解两种文化及其思想框架,以及由此诞生的各种技术和工具,并注重捕捉设计活动中的经验规律和应用模式,这是掌握程序设计精髓的关键。程序设计方法学全文共393页,当前为第11页。程序设计方法的发展(1)面向计算机的程序设计(2)面向过程的程序设计(3)面向对象的程序设计(4)后面向对象方法1)面向方面程序设计2)面向Agent程序设计3)泛型程序设计4)面向构件程序设计5)敏捷方法程序设计方法学全文共393页,当前为第12页。面向计算面向过程面向对象……程序设计方法学全文共393页,当前为第13页。(1)面向计算机的程序设计最早的编程语言是由计算机可以直接识别的二进制指令组成的机器语言。设计人员关注的重心是使程序尽可能地被计算机接受并按指令正确地执行,至于计算机的程序能否让人理解并不重要。程序设计方法学全文共393页,当前为第14页。随后出现了汇编语言,它将机器指令映射为一些能读懂的助记符。由于汇编语言的抽象层次太低,程序员需要考虑大量的机器细节。面向计算机的程序设计的基本思想可归纳为:注重机器、逐一执行。程序设计方法学全文共393页,当前为第15页。(2)面向过程的程序设计

结构化程序设计的思想是:自顶向下、逐步求精。其程序结构是按功能划分为若干个基本模块(基本程序),这些模块形成一个树状结构,各模块之间的关系尽可能简单,在功能上相对独立:每一个模块内部均是由顺序、条件、循环三种基本结构组成,其模块化实现的具体方法是使用子程序。程序设计方法学全文共393页,当前为第16页。结构化程序设计由于采用了模块分化与功能分解,自顶向下、分而治之的方法。因而可将一个较复杂的问题分解为若干个子问题,各子问题分别由不同的人员解决,从而提高了速度,并且便于程序的调试,有利于软件的开发和维护。程序设计方法学全文共393页,当前为第17页。结构化程序设计思想的核心是功能的分解。结构化程序设计的自顶向下、逐步求精的思想可用中的树状结构表示(其中P表示程序,P1、P2、P3等表示子程序,以此类推,P311、P312等表示基本程序)程序设计方法学全文共393页,当前为第18页。(3)面向对象的程序设计

面向对象的程序设计思想的提出:面向过程的程序设计中,由于数据与操作的分离,使程序的可重用性差,维护代价高,不便于程序的更新换代。面向对象的程序设计思想是:注重对象、抽象成类。在程序系统中,将客观世界中的事物看成对象,对象是由数据及对数据的操作构成的一个不可分离的整体。程序设计方法学全文共393页,当前为第19页。面向对象的程序设计由于数据与操作封装在对象这个统一体中,使编程人员在编程过程中能够将数据与操作联系在一起,便于程序的修改和调试。并且由于类的继承性使得编程人员可以在可视化的环境中进行组件化的编程,从而使设计人员能够从单调、重复的编程过程中解放出来,去进行创造性的总体设计工作。程序设计方法学全文共393页,当前为第20页。(4-1)面向方面编程经过多年的实践摸索,人们逐渐发现面向对象方法也有其不足,如许多软件系统都不完全能按系统的功能来划分,仍然有许多重要的需求和设计决策,比如安全、日志等,它们具有一种“贯穿特性”(CrosscuttingConcerns),无论是采用面向对象语言还是过程型语言,都难以用清晰的、模块化的代码实现。实现这些设计决策等的代码分布贯穿于整个系统的基本功能代码中,形成了常见的“代码散布”(CodeScattering)和“代码交织”(CodeTangling)现象。程序设计方法学全文共393页,当前为第21页。面向方面程序设计面向方面程序设计(Aspect-OrientedProgramming,AOP)方法由GregorKicgales等人在1997年的欧洲面向对象编程大会(ECOOP97)上提出的。所谓的Aspect,就是AOP提供的一种程序设计单元,它可以将那些在传统程序设计方法学中难于清晰地封装并模块化实现的设计决策,封装实现为独立的模块。程序设计方法学全文共393页,当前为第22页。(4-2)面向Agent的编程随着软件系统服务能力要求的不断提高,在系统中引入智能因素已经成为必然。Agent作为人工智能研究重要而先进的分支,引起了科学、工程、技术界的高度重视。Agent的特性:代理性自治性主动性反应性社会性智能性移动性面向Agent的编程程序设计方法学全文共393页,当前为第23页。面向Agent的程序设计(Agent-OrientedProgramming)方法与面向对象程序设计方法的最基本区别在于Agent的社会性。面向Agent程序设计的主要思想是:根据Agent理论所提出的代表Agent特性的、精神的和有意识的概念直接设计Agent。这后面的动机是人们运用意愿姿态作为一个代表复杂系统的抽象机制。程序设计方法学全文共393页,当前为第24页。(4-3)面向组件的程序设计随着计算机网络的飞速发展。软件的应用环境变得更加广阔。与此同时,软件的设计难度也在提高。对应于软件的跨语言、跨平台和互操作性,传统的面向对象程序设计方法难以适应现代分布式软件应用,给开发商和客户带来了很多的问题。

组件:软件组件是一个明确定义了接口和相关环境的可组合的单元,它可以独立地发行并供第三方进行组装。(定义体现两个重要特征)程序设计方法学全文共393页,当前为第25页。组件接口:组件接口描述了组件对外提供的服务,组件和组件之间、组件和客户之间同时通过接口进行交互。组件发布后只能通过预定义的接口来提供合理的、一致的服务,因此组件的接口应具有稳定性,不依赖于具体的实现。组件的接口必须严格地标准化,这是组件技术成熟的标志之一。组件间的接口通过一种与平台无关的语言IDL(InterfaceDefineLanguage)来定义,而且是二进制兼容的,使用者可以直接调用执行模块来获得对象提供的服务。程序设计方法学全文共393页,当前为第26页。组件化程序设计的基本思想

该思想将单独的、庞大而复杂的应用程序划分成多个模块,但这里每一个模块不再是一个简单的代码集,而是一个自给自足的组件,每个组件保持一定的功能独立性,在协同工作时,通过相互之间的接口完成实际的任务;这些组件可以单独开发,单独编译,甚至单独调试和测试,当所有的组件开发完成后,把它们组合在一起就得到了完整的应用系统。程序设计方法学全文共393页,当前为第27页。/

上海构件库程序设计方法学全文共393页,当前为第28页。程序设计方法的极限?程序设计方法学全文共393页,当前为第29页。程序设计的表示方法程序设计的表示方法可以分为:(1)图形(程序流程图、盒图、问题分析图)(2)表格(判定表)(3)语言(过程设计语言)。不论是哪种工具,对它们的基本要求都是:能提供对设计的无歧义的描述,也就是应该能指明控制流程、处理功能、数据组织以及其他方面的实现细节,从而能把对设计的描述直接翻译成程序代码。程序设计方法学全文共393页,当前为第30页。处理

数据流

输入/输出

磁盘选择

文档

显示

多分支

人工输入

终止

程序流程图又称为程序框图,它是历史最悠久、适用最广泛的描述程序设计的方法。

程序设计方法学全文共393页,当前为第31页。使用程序流程图的例子

某装配厂有一座存放零件的仓库,仓库中现有的各种零件的数量以及每种零件的库存量临界值等数据记录在库存清单主文件中。当仓库中零件数量有变化时,应该及时修改库存清单主文件,如果哪种零件的库存量少于库存量的临界值,则应该报告给采购部门以便订货,规定每天向采购部门送一次订货报告。该装配厂使用一台小型计算机处理更新库存清单主文件和产生订货报告的任务。零件库存量的每一个变化称为一个事务,通过放在仓库中的终端输入到计算机中;系统中的库存清单程序对事务进行处理,更新存储在磁盘上的库存清单主文件,并且把必要的订货信息写在磁盘上。最后,每天由报告程序读一次磁盘,并且打印出订货报告。

程序设计方法学全文共393页,当前为第32页。程序设计方法学全文共393页,当前为第33页。当算法中包含多重嵌套的条件选择时,用程序流程图不易描述清楚,但判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。一张判定表由四部分组成:左上部分列出所有条件;左下部分是所有可能的动作;右上部分是表示各种条件组合的一个矩阵;右下部分是和每种条件组合对应的动作。判定表右半部分的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。程序设计方法学全文共393页,当前为第34页。判定表的例子

规则123456789国内乘客TTTTFFFF头等舱TFTFTFTF残疾乘客FFTTFFTT行李质量W<30或W=30TFFFFFFFF免费╳(W-30)*2╳(W-30)*3╳(W-30)*4╳╳(W-30)*6╳╳(W-30)*8╳(W-30)*12╳程序设计方法学全文共393页,当前为第35页。过程设计语言(PDL)PDL也称为伪代码,这是一个笼统的名称。现在有很多种不同的过程设计语言在使用,它是用正文形式表示数据和处理过程的设计工具。在伪代码中,每一条指令占一行(elseif除外),指令后不跟任何符号。书写上的“缩进”表示程序中的分支程序结构。用“缩进”取代表示程序的块结构可以大大提高代码的清晰性。同一模块的语句有相同的“缩进”量,次一级模块的语句相对于其父级语句又有一个“缩进”量。程序设计方法学全文共393页,当前为第36页。line1line2subline1subline2subline1subline2subline3line3程序设计方法学全文共393页,当前为第37页。PDL作为一种设计工具有如下优点:(1)可以作为注释直接插在源程序中间。这样做能促使维护人员在修改程序代码的同时也相应地修改PDL注释,因此有助于保持文档和程序的一致性,提高了文档的质量。(2)可以使用普通的正文编辑软件或者文字处理系统,可以很方便地完成PDL的书写和编辑工作。(3)已经有自动处理程序的存在,而且可以自动由PDL生成程序源代码。程序设计方法学全文共393页,当前为第38页。Chapter2程序设计语言与环境

计算机语言的体系结构与语言的体系结构完全一致,只是每一个层次的内容要简单得多。段落描写文章句子短语词汇基本符号图2-1语言的基本体系结构常量、变量、保留字、运算符等函数类、包程序语句表达式图2-2计算机语言的基本体系结构基本符号程序设计方法学全文共393页,当前为第39页。按照乔姆斯基对语言的形式化定义,从符号集到完整程序的结构,施加于形式化描述的规则越来越多,限制条件也越来越细,从而使得计算机自动翻译程序容易实现。另一方面,与自然语言一样,程序设计语言也有其特定的运行环境,程序设计语言的学习不能脱离其环境。程序设计方法学全文共393页,当前为第40页。机器语言汇编语言高级语言计算机语言的发展程序设计方法学全文共393页,当前为第41页。机器语言计算机是靠无数的逻辑电路开闭来运行的,这些物理器件识别的只是高、低电位,用二进制的方法来表示,刚好就是“1”和”0”。所有发给计算机的指令,以及保存在计算机内的数据,都要最终转换成一系列的由”0”和”1”组成数字串,计算机才明白。由“0”和“1”组成的指令序列就是机器语言。程序设计方法学全文共393页,当前为第42页。汇编语言用比较容易识别、记忆的助记符替代特定的二进制串。ADDAX,BX;表示将寄存器AX和BX中的内容相加,结果保存在寄存器AX中。SUBAX,NUM;表示将寄存器AX中的内容减去NUM,结果保存在寄存器AX中。MOVAX,NUM;表示把数NUM保存在寄存器AX中。程序设计方法学全文共393页,当前为第43页。通过这种助记符,人们就能较容易地读懂程序,调试和维护也更方便了。但这些助记符号计算机无法识别,需要一个专门的程序将其翻译成机器语言,这种翻译程序被称为汇编程序。汇编语言的一条汇编指令对应一条机器指令,与机器语言性质上是一样的,只是表示方式做了改进,其可移植性与机器语言一样不好.但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精炼而质量高。程序设计方法学全文共393页,当前为第44页。高级语言结构化程序设计语言面向对象程序设计语言其他高级语言人们渐渐认识的,应该设计一种这样的语言:这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。1956年首先在IBM公司的计算机上实现的由美国的计算机科学家巴科斯设计第一个完全脱离机器硬件的高级语言Fortran语言,标志着高级语言的到来。

程序设计方法学全文共393页,当前为第45页。(1)结构化程序设计语言通过努力,人们总结出一套行之有效的程序设计方法,称为结构化程序设计。按照结构化程序设计方法设计出的程序结构清晰、容易阅读、容易修改、容易验证。1970年,瑞士计算机科学家NiklausWirth开发了第一个结构化程序设计语言—Pascal语言,标志着结构化程序设计时期的开始。

程序设计方法学全文共393页,当前为第46页。1984年,第十九位图灵奖,获得者。

(授予NiklausWirth图灵奖以表彰其)开发了一系列的计算机程序语言,EULER,ALGOL-W,MODULEA和PASCAL。PASCAL语言被用在计算机程序语言教学上具有重要的意义,并为将来的计算机语言,系统和结构设计提供了一个基础。程序设计方法学全文共393页,当前为第47页。除Pascal语言外,另一个名的结构化程序设计语言就要数C语言了。这两种语言的语法结构基本上是等价的,它们都是通过函数和过程等语言特性来构成结构化程序设计的基础。但是很主要的区别在于Pascal语言强调的是语言的可读性,因此Pascal语言至今成为学习算法和数据结构等软件基础知识的教学语言;而C语言强调的是语言的简洁性以及高效性。程序设计方法学全文共393页,当前为第48页。结构化程序设计语言和结构化程序设计方法的缺陷:(1)代码的可重用性差(2)可维护性差(3)稳定性差(4)难以实现程序设计方法学全文共393页,当前为第49页。(2)面向对象程序设计语言1967年挪威计算中心的KristenNygaard和Ole-JohanDahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,被认为是第一个面向对象程序设计语言。

C++和Java程序设计方法学全文共393页,当前为第50页。(3)其他高级语言程序设计方法学全文共393页,当前为第51页。运行环境运行环境是其他所有软件赖以执行的支撑环境,或是说所有其他的软件都必须通过它间接地使用计算机硬件。因此为了控制和管理运行在它上面的各种软件,运行环境必然会提供一种基础的程序运行模型,从而在本质上决定了所有软件的工作模型。目前流行的运行环境主要有MS-Dos,MSWindows,UNIX和LINUX,不同的运行环境所规定的程序运行模型是不同的。程序设计方法学全文共393页,当前为第52页。开发环境软件开发环境(SoftwareDevelopmentEnvironment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE。它由软件工具和环境集成机制构成,前者用以支持软件开发的相关过程、活动和任务,后者为工具集成和软件的开发、维护及管理提供统一的支持。程序设计方法学全文共393页,当前为第53页。开发环境一般有两种工作模式:命令行模式和集成环境方式。命令行工作方式是将整个应用软件描写过程的步骤,通过一个个命令完成,每一个命令完成一个工作步骤。这种开发环境的使用,需要记忆命令、以及每个命令的各种参数及其含义,以便充分利用命令所提供的功能。这种方式是一种初级的方式,比较直接。程序设计方法学全文共393页,当前为第54页。集成环境工作方式是将整个应用软件描写过程的步骤全部集中起来,提供一个图形画面,通过各种菜单、对话框等交互元素,将各种命令、以及每个命令的各种参数通过图形画面呈现给我们,通过交互元素进行选择、简单输入操作即可完成。这种方式是一种高级的方式,比较人性化,工作界面美观。VC++&Eclipse程序设计方法学全文共393页,当前为第55页。程序设计方法学全文共393页,当前为第56页。程序设计方法学全文共393页,当前为第57页。程序设计方法学全文共393页,当前为第58页。程序设计方法学全文共393页,当前为第59页。在Java平台的结构中,JVM处在核心的位置,是程序与底层操作系统和硬件无关的关键。JVM的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统,其中依赖于平台的部分称为适配器;JVM通过移植接口在具体的平台和操作系统上实现;在JVM的上方是Java的基本类库和扩展类库以及它们的API,利用JavaAPI编写的应用程序和JavaApplet。可以在任何Java平台上运行而无需考虑底层平台,就是因为JVM实现了程序与操作系统的分离,从而实现了Java的平台无关性。程序设计方法学全文共393页,当前为第60页。Chapter3结构化程序设计方法

1974年,D.Gries教授将已有的对结构程序设计的不同解释归纳为13种。其中比较有代表性的有以下几种:(1)结构化程序设计是一种避免使用goto语句的程序设计;(2)结构化程序设计是自顶向下、逐步求精、模块化的程序设计;(3)结构化程序设计是一种组织和编写程序的方法,利用它编写的程序容易理解和修改程序设计方法学全文共393页,当前为第61页。(4)结构化程序设计的一个主要功能是使得正确性的证明容易实现;(5)结构化程序设计把任意大而复杂的流程图转变为标准形式,使得它们能够用几种标准的控制结构(通常是顺序、分支和重复)来表示。

程序设计方法学全文共393页,当前为第62页。例子:编写程序打印前N(N是正整数)个素数用Pascal描述,采用逐步求精的方法Step1:根据问题程序结构如下

programprintSushu()vari,x:integer;beginx:=1;fori:=1toNdobegin

x:=“下一个素数”;write(x);endend.

Step2:repeatx:=x+1

prim=“x是一个素数”;Untilprim;程序设计方法学全文共393页,当前为第63页。Step3:对prim=“x是一个素数”求精

k:=2;prim:=true;whileprimAND(k<lim)dobegin

prim:=“x不能被k整除”k:=k+1;endStep4:对prim:=“x不能被k整除”进一步求精

prim:=(xMODK)0程序设计方法学全文共393页,当前为第64页。结构化程序设计的思想:自顶向下,逐步求精。(1)程序的结构按照功能划分若干个基本模块,这些模块形成一个树状结构并按层次进行组织;(2)各模块之间的关系尽可能简单,在功能上相对独立,每一模块内部均是由顺序、选择和循环三种基本结构组成。同时,结构化定理还进一步表明,任何一个复杂问题的程序设计都可以用顺序、选择和循环3种基本结构组成;程序设计方法学全文共393页,当前为第65页。并且它们都具有以下特点的:只有一个入口,只有一个出口,结构中无死循环,程序中3种基本结构之间形成顺序执行关系。其模块化实现的具体方法是使用子程序。(3)在程序设计时应采用自顶向下、逐步细化的实施方法。程序设计方法学全文共393页,当前为第66页。(1)使用程序设计语言中的顺序、选择、循环等有限的控制结构表示程序的控制逻辑;(2)选用的控制结构只允许有一个入口和一个出口;(3)程序语句组成容易识别的语句序列块,每块只允许有一个入口和一个出口;(4)复杂结构的程序设计时,仅用嵌套的基本控制结构进行组合嵌套来实现;结构化程序设计的原则程序设计方法学全文共393页,当前为第67页。(5)语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致;(6)严格控制goto语句的使用。程序设计方法学全文共393页,当前为第68页。结构化程序设计的步骤(1)需求分析:需求分析是程序设计中必不可少的环节。分析以及该阶段要解决什么问题,理解和表达用户对程序功能的需求,明确程序的总任务。(2)系统设计:这一部分可以分为两步:一是总体设计,即按照程序的要求,把总任务分解成为一些功能相对独立的子任务,最终达到每个子目标只专门完成某一单一的逻辑功能;二是模块设计,即按照各独立的子目标,给出其算法。程序设计方法学全文共393页,当前为第69页。(3)算法和程序实现:算法是具体的解决步骤,该步骤实际上是对某些给定的数据按照一定的次序进行有限步运算的且能够求出问题的解或判断出问题无解的运算序列。算法要做到易读、易动,自身必须具有良好的结构,而良好的结构是指仅用顺序、分支和循环三种基本结构组合而成的。确定算法后,用特定的计算机语言将算法编制出来。程序设计方法学全文共393页,当前为第70页。(4)调试运行:程序编好之后,难免会出现这样那样的错误,此时应认真检查程序,找出错误加以改正,主要是排除语法错误和逻辑错误。(5)编写程序使用与维护的文档:内容包括程序功能介绍、使用说明、参数含义等。对于有价值的程序,写出使用和维护说明等文档资料是很有必要的。程序设计方法学全文共393页,当前为第71页。N-S图在程序的系统设计阶段得到了程序的模块结构图和各模块功能的详细说明,程序的模块结构图确定了程序要“做什么”,接下来就要按算法编出程序。程序是用计算机语言的语句编制的,是给计算机执行的,一般人很难看懂,而算法是给人看的,算法设计的目的是为模块找到一个切实可行的计算过程,并用图示的方式表示出来。N—S图尤其迎合结构化程序设计思想。程序设计方法学全文共393页,当前为第72页。N—S图主要特点是:(1)不使用流线,即不允许流程任意转移,而只能从上到下顺序进行。这样避免了流程转来转去而影响流程思路的理解;(2)采用三种基本结构作为构造算法的基本单元:1)顺序结构:在这种结构中各模块是按照他们出现的先后顺序执行的,即A模块先于B模块执行,A与B模块之间是顺序关系程序设计方法学全文共393页,当前为第73页。例题:使用N-S图以求解圆面积的问题程序设计方法学全文共393页,当前为第74页。程序设计方法学全文共393页,当前为第75页。选择结构:在计算机应用的许多场合,要求程序按照给定的条件进行分析、比较和判断,并根据判断后的不同情况进行不同的处理。此类情况即为选择结构程序设计方法学全文共393页,当前为第76页。程序设计方法学全文共393页,当前为第77页。逐步求精的设计方法循环结构:循环是指对同一个程序段重复执行若干次,被重复执行的部分成为循环体。循环结构就是根据给定条件成立与否,来决定是否执行循环体。

程序设计方法学全文共393页,当前为第78页。程序设计方法学全文共393页,当前为第79页。对含“中断”语句的处理程序设计方法学全文共393页,当前为第80页。对含“继续”语句的处理程序设计方法学全文共393页,当前为第81页。非结构化程序到结构化程序的转化重复编码法程序设计方法学全文共393页,当前为第82页。条件复合技术程序设计方法学全文共393页,当前为第83页。布尔标志技术这种方法一般用于将含有循环的非结构化程序转化为结构化程序,常在循环中引进一个布尔量—“标志”,该布尔量在循环之前先被初始化,在程序段中利用对它的重新赋值来达到控制循环执行的目的。程序设计方法学全文共393页,当前为第84页。计算机程序是算法的一种精确描述,算法的任务是把给定的输入信息变换为所需要的输出信息。所谓一段程序是正确的,是指这段程序能准确无误地完成编写者所期望赋予它的功能。或者说,对任何一组允许的输入信息,程序执行后能得到一组和这组输入信息相对应的正确的输出信息。通俗地说,“做了它该做的事,没有做它不该做的事”。结构化程序的正确性验证程序设计方法学全文共393页,当前为第85页。一段程序是错误的,是指:(1)程序完成的事情并不是程序员想要完成的事情;(2)程序员想要程序完成的事情,程序并没有完成。一般来说,程序中含有错误是很难避免的错误可能有:(1)设计时的错误;(2)程序编写时的错误;(3)运行时的错误等;……程序设计方法学全文共393页,当前为第86页。如何发现错误或尽量减少错误?(1)设计程序时尽可能使用结构化程序设计方法,使程序设计过程规范化和标准化;(2)程序调试或运行时采用测试的方法去跟踪程序的运行,从而发现与改正错误;(3)利用程序正确性证明的方法检验程序是否正确。程序设计方法学全文共393页,当前为第87页。1983年IEEE提出的软件工程术语中给软件测试下的定义是:“使用人工或者自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。”测试是程序的执行过程,目的在于发现错误。一个好的测试用例在于能发现至今未发现的错误;一个成功的测试是发现了至今未发现的错误的测试。程序设计方法学全文共393页,当前为第88页。测试的原则1.应当“尽早地和不断地进行软件测试”。2.测试用例应由测试输入数据和对应的预期输出结果组成。3.程序员应避免检查自己的程序。4.在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。程序设计方法学全文共393页,当前为第89页。5.充分注意测试中的群集现象。即测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。6.严格执行测试计划,排除测试的随意性。7.应当对每一个测试结果做全面检查。8.妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。程序设计方法学全文共393页,当前为第90页。程序测试实质上只是一种抽样检查测试过程:选取测试数据→执行程序→输入测试数据→记录执行结果→手工核对结果因此,测试只是一种查错的手段,它可以帮助人们去发现程序中的错误,但不能证明程序中没有错误,即:测试不能证明程序是正确的程序设计方法学全文共393页,当前为第91页。测试只能发现程序错误,但不能证明程序无错。原因:测试并没有也不可能包含所有数据,只是选择了一些具有代表性的数据,所以它具有局限性。正确性证明是通过数学技术来确定软件是否正确,也就是说,是否符合其规格说明。程序设计方法学全文共393页,当前为第92页。正确性证明的发展程序设计方法学全文共393页,当前为第93页。程序正确性证明方法认为:一段程序的正确性是指给定一个输入断言以及程序的程序函数,能够导出程序的输出断言。输入断言:满足程序的输入条件,Φ(x)指出输入变量ζ的定义域,也即输入变量应满足的条件。输出断言:满足程序的输出条件,Ψ(x,z)指出输出变量z和输入变量x之间应满足的关系。程序设计方法学全文共393页,当前为第94页。严格意义上的程序正确性定义分为:部分正确性、终止性和完全正确性。假定给定一个程序P,谓词Φ(x)为输入断言,Ψ(x,z)为输出断言。(1)若对每一个使Φ(ζ)为真,并且程序P计算终止,Ψ(ζ,P(ζ))为真,则称程序P关于Φ和Ψ是部分正确的。程序设计方法学全文共393页,当前为第95页。(2)若对每一个使Φ(ζ)为真,程序P的计算都能终止,则称程序P对Φ是终止的。(3)若对每一个使Φ(ζ)为真的输入信息ζ,程序p的计算都能终止,并且Ψ(ζ,P(ζ))为真,则称程序P关于Φ和Ψ是完全正确的。很显然,(3)等价于(1)和(2)的同时成立。程序设计方法学全文共393页,当前为第96页。为了证明一个程序的完全正确性,通常采用的方法是分别证明该程序的部分正确性和终止性。关于部分正确性证明的方法Floyd的不变式断言法(*)Manna的子目标断言法Hoare的公理化方法(*)关于终止性证明的方法Floyd的良序集方法(*)Manna等人的不动点方法Knuth的计数器方法关于完全正确性证明的方法Hoare的公理化方法的推广(Manna,Pnueli)Burstall的间发断言方法Dijkstra最弱前置谓词变换方法以及强验证方法程序设计方法学全文共393页,当前为第97页。不变式断言法证明一个程序的部分正确性步骤(1)建立断言前置断言((x)):前提条件,初始状态后置断言((x,z)):最终结论,终止状态满足的条件循环不变式:在每次循环的前后均为真的谓词(2)建立检验条件检验条件:程序运行通过该通路时应满足的条件(3)证明检验条件适合对象:程序流程图i(x,y)Ri(x,y)i(x,ri(x,y))输入断言输出断言y:一组中间变量x:输入变量xy:蕴含符ri(x,y):通过该通路后y的值通过此路径的条件程序设计方法学全文共393页,当前为第98页。实例设x1,x2是正整数,求他们的最大公约数z=gcd(x1,x2)。我们知道,对于任意正整数y1,y2,有下列关系:(1)若y1>y2,gcd(y1,y2)=gcd(y1-y2,y2)(2)若y2>y1,gcd(y1,y2)=gcd(y1,y2-y1)(3)若y1=y2,gcd(y1,y2)=y1=y2开始(x1,x2)(y1,y2)y1=y2y1>y2y1-y2y1y2-y1y2

A…(x)

B…P(x,y)y1zG结束C

(x,z)DETF

F

T程序设计方法学全文共393页,当前为第99页。(1)建立断言

(x):x1>0x2>0

(x,z):z=gcd(x1,x2)

在B点建立不变式断言P(x,y):

x1>0x2>0y1>0y2>0gcd(y1,y2)=gcd(x1,x2)开始(x1,x2)(y1,y2)y1=y2y1>y2y1-y2y1y2-y1y2

A…(x)

B…P(x,y)y1zG结束C

(x,z)DETFF

T(1)建立断言程序设计方法学全文共393页,当前为第100页。通路1:A-->B;通路2:B-->D-->B通路3:B-->E-->B;通路4:B-->G-->C为每一条通路,建立检验条件.通路1:A-->B无条件,即R1(x,y)恒真,结果y取值为x。检验条件为:(x)P(x,x)即[x1>0x2>0]x1>0x2>0gcd(x1,x2)=gcd(x1,x2)(2)建立检验条件程序设计方法学全文共393页,当前为第101页。通路2:B-->D-->B

R2(x,y)=[y1y2y1>y2]r2(x,y)=(y1-y2,y2)输入输出断言均为P(x,y)检验条件为:[P(x,y)y1y2y1>y2]P(x,y1-y2,y2)将断言P(x,y)代入,即得

[x1>0x2>0y1>0y2>0gcd(y1,y2)=gcd(x1,x2)y1y2y1>y2][x1>0x2>0y1-y2>0y2>0gcd(y1-y2,y2)=gcd(x1,x2)]程序设计方法学全文共393页,当前为第102页。通路3:B-->E-->B与通路2类似地,得到[P(x,y)y1y2y1y2]

P(x,y1,y2-y1)通路4:B-->G-->C类似地,得到[P(x,y)y1=y2](x1,x2)程序设计方法学全文共393页,当前为第103页。(3)证明检验条件通路1:[x1>0x2>0]x1>0x2>0gcd(x1,x2)=gcd(x1,x2)通路2:[x1>0x2>0y1>0y2>0gcd(y1,y2)=gcd(x1,x2)y1y2y1>y2][x1>0x2>0y1-y2>0y2>0gcd(y1-y2,y2)=gcd(x1,x2)]检验条件前项成立时,y1>y2为真,则y1-y2>0为真且gcd(y1-y2,y2)=gcd(y1,y2)=gcd(x1,x2)检验条件为真

程序设计方法学全文共393页,当前为第104页。通路3:

[P(x,y)y1y2y1y2]P(x,y1-y2,y2-y1)

y1<y2为真,则y1-y2<0为真,gcd(y1,y2-y1)=gcd(y1,y2)=gcd(x1,x2)检验条件为真

通路4:

[P(x,y)y1=y2](x1,x2)y1=y2,gcd(y1,y2)=y1=y2,检验条件为真程序设计方法学全文共393页,当前为第105页。不变式断言法也可以直接用于高级语言写出的程序。具体使用时,以注释的形式在程序的断点处加上断言。例2:设x、y是非负整数,求它们的最大公约数,ProgramAvarx,y,z,s:integer;beginread(x,y);whilex≠0doifyxtheny:=y-xelsebegins:=x;x:=y;y:=s;endz:=y;write(z);end程序设计方法学全文共393页,当前为第106页。(1)建立断言。设x,y的初始值为x0,y0,输入断言:Φ(x):x00∧y00∧(x0≠0∨y0≠0)输出断言Ψ(x,z):z=gcd(x0,y0)不变式断言:P(x,y):x0∧y0∧(x0≠0∨y0≠0)∧gcd(x,y)=gcd(x0,y0)将断言直接写入程序中:ProgramAvarx,y,z,s:integer;beginread(x,y);{x00∧y00∧(x0≠0∨y0≠0)}//输入断言whilex≠0doL:{x0∧y0∧(x≠0∨y≠0)∧gcd(x,y)=gcd(x0,y0)}//不变式断言ifyxtheny:=y-xelsebegins:=x;x:=y;y:=s;endz:=y;{z=gcd(x0,y0)}//输出断言write(z);end程序设计方法学全文共393页,当前为第107页。设x,y的初始值为x0,y0,假定输入断言成立,即要证明程序第一次执行到断点L处时,不变式断言成立。此时的检验条件为:检验条件1:[x0>0∧y0>0∧(x0≠0∨y0≠0)][x0>0∧y0>0∧(x0≠0∨y0≠0)∧gcd(x,y)=gcd(x0,y0)]进一步证明,当检验条件1成立,程序控制循环后再次回到断点L处时,不变式断言仍然成立。(2)建立检验条件。程序设计方法学全文共393页,当前为第108页。程序控制循环再次回到断点L处有两个途径,一个是yx成立时,另一个是y<x时。当y>x成立时有检验条件2:[x0∧y0∧(x≠0∨y≠0)∧gcd(x,y)=gcd(x0,y0)∧x≠0∧yx][x0∧y-x0∧(x≠0∨y-x≠0)∧gcd(x,y-x)=gcd(x0,y0)]程序设计方法学全文共393页,当前为第109页。当y<x成立时有检验条件3:[x>0∧y>0∧(x≠0∨y≠0)∧gcd(x,y)=gcd(x0,y0)∧x≠0∧y<x][y0∧x0∧(x≠0∨y≠0)∧gcd(y,x)=gcd(x0,y0)]程序设计方法学全文共393页,当前为第110页。最后要证明如果不变时断言成立,但程序控制转出循环时,输出断言成立。此时的检验条件为:检验条件4:[x>0∧y>0∧(x≠0∨y≠0)∧gcd(x,y)=gcd(x0,y0)∧x=0]y=gcd(x0,y0)程序设计方法学全文共393页,当前为第111页。(3)证明检验条件条件1:程序第一次执行到L处时,x=x0,y=y0,gcd(x,y)=gcd(x0,y0)成立,整个检验条件1成立。条件2:如果蕴涵式前项成立,由x0,yx成立可以推导出:x0∧y-x0为真。由x≠0为真可以推导出:x≠0∨y-x≠0成立,再根据数论知识可知:yx时,gcd(x,y)=gcd(x,y-x)成立,而gcd(x,y)=gcd(x0,y0)成立,因此gcd(x,y-x)=gcd(x0,y0)成立,由此条件2为真。程序设计方法学全文共393页,当前为第112页。条件3:如果蕴涵式前项成立,由x,y互换,由合式公式的互换定律,可以推导出条件2为真。条件4:如果蕴涵式前项成立,可得x=0,y0。再根据数论知识可知:x=0,y>0时,gcd(0,y)=y成立.又根据蕴涵式前项gcd(x,y)=gcd(x0,y0)∧x=0可得y=gcd(x0,y0)由此,条件4为真。整个程序的部分正确性得以证明。程序设计方法学全文共393页,当前为第113页。整个程序的部分正确性不能保证整个程序的完全正确性。在例1中,若将问题前提改为与例2一致:设x1、x2是非负整数,求它们的最大公约数,z=gcd(x1,x2)输入断言:x0∧y0∧(x≠0∨y≠0)可能不能保证整个程序的运行的正常终止。如x>0,y=0时,程序会出现什么情况?程序设计方法学全文共393页,当前为第114页。子目标断言法子目标断言法与不变式断言法的主要区别是:两种方法对循环所建立的断言不同。不变式断言描述了程序变量y的中间值与初始值之间关系,而子目标断言法描述的是y的中间值与循环终止时的最终值yend之间的关系。两种方法进行归纳的方向不同。不变式断言沿着程序正常执行的方向进行归纳,而子目标断言法则沿着相反方向进行归纳。程序设计方法学全文共393页,当前为第115页。从理论上讲,不变式断言方法与子目标断言方法在功能上是等价的,在实践上究竟采用那种方法更为有利,要视程序的具体情况而定,两者可互为补充。程序设计方法学全文共393页,当前为第116页。STARTRead(x,y)x0yxy:=y-xxyz:=ySTOPTFTFI(x,y)aP(x,y)bcψ(x,y,z)deg输入断言I(x,y):x00y00(x00y00)输出断言O(x,z):z=gcd(x0,y0)子目标断言P(x,y,yend):x0y0(x00y00)yend=gcd(x,y)程序设计方法学全文共393页,当前为第117页。子目标断言的含义是:每当控制以x和y允许的容许值通过L时,x、y的当前值的最大公约数将等于y的最终值。首先证明当控制转出循环时候,子目标断言成立(通路1:bc)即要证明检验条件1:x=0[x0y0(x0y0)

yend=gcd(x,y)]程序设计方法学全文共393页,当前为第118页。子目标断言法(建立检验条件)其次证明如果在通过循环之后,子目标断言在b处成立,那么在循环之前,断言也成立。其中通路2:bdb检验条件2:P(x,y-x,yend)x0y>xP(x,y,yend)x0y-x0yend=gcd(x,y-x)x0y>xx0y0yend=gcd(x,y)程序设计方法学全文共393页,当前为第119页。通路3:beb检验条件3P(y,x,yend)x0y<xP(x,y,yend),即通过循环的else通路之后的子目标断言蕴含通过此通路之前的子目标断言通路4:ab检验条件4x00y00P(x0,y0,yend)yend=gcd(x0,y0)程序设计方法学全文共393页,当前为第120页。检验条件1:x=0[x0y0

yend=gcd(x,y)]证明:因为有x=0,yend=y所以yend=y=gcd(0,y)=gcd(x,y)程序设计方法学全文共393页,当前为第121页。检验条件2:P(x,y-x,yend)x0y>xP(x,y,yend)即证明:x0y-x0yend=gcd(x,y-x)x0y>xx0y0yend=gcd(x,y)由:x0y>xy>0,以及gcd(x,y-x)=gcd(x,y),当且仅当x>0,y>0可知yend=gcd(x,y-x)=gcd(x,y)程序设计方法学全文共393页,当前为第122页。终止性证明方法偏序集设有一个非空集合W和一个定义在W上的二元关系,且这个关系满足下列性质:1)传递性,即对于一切a,b,c∈W,如果ab,bc,则ac2)反对称性,即对于ab,则有ba3)反自反性,即对于一切a∈W,aa称W为具有关系<的偏序集,记做(W,)程序设计方法学全文共393页,当前为第123页。例如:(1)具有小于关系(<)的,位于0~1之间的实数集合A1。(2)具有小于关系(<)的全体整数集合B1。但将<换成≤就不是偏序集。(1)具有小于关系(≤)的,位于0~1之间的实数集合A1。(2)具有小于关系(≤)的全体整数集合B1。程序设计方法学全文共393页,当前为第124页。良序集设(W,)是偏序集,如果不存在由W中的元素构成的无限递减序列:……a0a1a2,则称(W,)是良序集。程序设计方法学全文共393页,当前为第125页。例如:(1)若N是自然数集合,那么(N,<)是良序集。(2)具有通常序A<B<C…<Z的字母表∑={A,B,…,Z}是良序集。但下述集合A1和B1是偏序集,但不是良序集。(1)具有小于关系(<)的,位于0~1之间的实数集合A1。(2)具有小于关系(<)的全体整数集合B1。程序设计方法学全文共393页,当前为第126页。采用良序集证明程序终止性思路1、结构化程序由顺序、选择和循环三种基本结构组成,而影响程序终止性的是循环结构,因此,是程序终止性证明的重点。2、程序终止性证明思路:A.选取割点集,割断循环;B.选取一个良序集合(W,);C.在割点上寻找函数u,使u∈W;D.证明每次循环,u依次递减。由于良序集合(W,)不存在无穷递减序列,因此,循环必然终止。程序设计方法学全文共393页,当前为第127页。用良序集方法证明程序终止性步骤1.选取一个点集去截断程序的各个循环部分,并在每个截断点I处建立中间断言qi(x,y).2.选取一个良序集(W,),并在每个截断点处定义一个终止表达式Ei(x,y).程序设计方法学全文共393页,当前为第128页。3.证明对每一个从程序入口到截断点j的通路a有

φ(x)Ra(x,y)qj(x,ra(x,y))而对每一个从截断点i到截断点j的通路a,有qi(x,y)Ra(x,y)qj(x,ra(x,y))其中,Ra和ra分别表示通过通路a的条件及通过通路a以后变量y的值。即证明中间断言是“正确的”,是“良断言”程序设计方法学全文共393页,当前为第129页。4.证明qi(x,y)Ei(x,y)∈W,即终止表达式是良函数5.证明对于每一个从截断点i到截断点j的通路a,有qi(x,y)Ra(x,y)[Ei(x,y)Ej(x,ra(x,y))]程序设计方法学全文共393页,当前为第130页。良序集方法证明程序终止性实例例子:对任一给定的自然数x,计算z=[]的程序的终止性。开始(0,0,1)(y1,y2,y3)y2+y3y2y2

x(y1+1,y3+2)(y1,y3)y1z结束B’TFA…φ(x)B…p(x,y)程序设计方法学全文共393页,当前为第131页。1.选取断点B’,建立中间断言q(x,y1,y2,y3):y2<xy3>02.选取良序集(N,<),其中N为自然数集合,在B’建立终止表达式:E(x,y1,y2,y3):x-y2程序设计方法学全文共393页,当前为第132页。3.证明Q(x,y1,y2,y3)是良断言从程序开始点到B’的通路a(AB'):φ(x)q(x,0,0,1),即:x>0[0<x1>0]从截断点B’到B’的通路a‘(B'DB'):q(x,y1,y2,y3)y2+y3<xq(x,y1+1,y2+y3,y3+2)即:[y2<xy3>0y2+y3<x][y2+y3<xy3+2>0]程序设计方法学全文共393页,当前为第133页。4.证明E(x,y)是良函数,即证明q(x,y)E(x,y)∈N,即[y2<xy3>0]x-y2>0∈N5.证明终止条件成立[q(x,y)y2+y3<x]

E(x,y1,y2,y3)][E(x,y1+1,y2+y3,y3+2)即:[y2<xy3>0y2+y3<x][x-y2x–(y2+y3)]程序设计方法学全文共393页,当前为第134页。采用良序集证明程序终止性总结1、采用良序集方法证明程序终止性,关键在于选择合适的良序集qi(x,y)和终止表达式Ei(x,y)。2、采用良序集证明程序终止性,与程序部分正确性证明采用了不同途径,相互完全独立,因此,证明程序的完全正确性工作量较大。3、采用计数器方法可以将程序的部分正确性和终止性证明结合进行。程序设计方法学全文共393页,当前为第135页。Chapter4面向对象程序设计方法

任何一种思想和方法,都会引入一套术语和概念,用于刻画该思想和方法的原理。面向对象方法是一种运用对象、类、继承、封装、多态、聚合、关联等构造软件的开发方法。对象:对象是个自包含的实体,用一组可识别的属性和行为来标示。程序设计方法学全文共393页,当前为第136页。要在软件中刻画对象,可以利用一个或者多个变量来刻画它的状态,用若干个函数或子程序来刻画对象的行为。具有相同特征(静态特征和动态特征)的多个对象可以归为一类。类是一组具有相同特征的对象的抽象描述,它定义了该类对象的共同的特征。程序设计方法学全文共393页,当前为第137页。对象的抽象是类,类的具体化就是对象。实例是一个真实的对象。封装、继承和多态是面向对象的三大基本特征。程序设计方法学全文共393页,当前为第138页。图4-3面向对象的基本特征

程序设计方法学全文共393页,当前为第139页。封装,简单地说,就是把客观事物封装成抽象的类,其目的是为了简化编程和增强安全性。使用者不必了解具体的类的实现细节,只通过外部接口来使用类的成员。这样,方法和属性包装在类中,通过类的实例来实现。封装对设计和实现程序有很多好处:(1)良好的封装机制能够减少耦合;(2)类内部的实现可以自由地修改;(3)类具有清晰的接口。程序设计方法学全文共393页,当前为第140页。继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对其功能进行扩展。通过继承所创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程实质上就是从一般到特殊的过程,即继承代表一种“is-a”的关系。如果有两个对象A与B可以被描述为‘B是A的一种’,就表明B可以继承A。程序设计方法学全文共393页,当前为第141页。从另一个角度,继承者也可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自身独有的性质。使用继承机制的优点是继承使得所有子类公共的部分都放在父类中,使得这些代码可以共享,避免了重复编写代码;而且,继承使得修改或扩展子类都较为容易。程序设计方法学全文共393页,当前为第142页。多态性的定义是:同一操作作用于不同的类的实例,将产生不同的执行结果。多态性是允许将父对象设置成为和一个或更多其子对象相等的技术。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承关系最底层的子类的方法实现会被调用。程序设计方法学全文共393页,当前为第143页。要实现多态,有两种方式:覆盖和重载。覆盖是指子类重新定义父类的虚函数的做法;重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。它们的目的都是为了代码重用。多态是为了接口重用,这样也就增强了软件的灵活性和重用性。程序设计方法学全文共393页,当前为第144页。类之间存在的关系(1)泛化关系(Generalization)泛化关系表示类与类之间的继承关系,接口与接口间的继承关系或者类对接口的实现关系。泛化关系在Java语言中可以使用关键字extends和implements,其中extends描述类与类、接口与接口之间的泛化关系,implements描述与接口之间的泛化关系。程序设计方法学全文共393页,当前为第145页。(2)关联关系(Association)关联是一种弱的连接关系。关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联关系往往可以进一步确定为聚合(Aggregation)关系或者合成(Composition)关系。类之间存在的关系程序设计方法学全文共393页,当前为第146页。(3)聚合关系(Aggregation)聚合关系是关联关系的一种,表示整体与个体之间的一种弱的“拥有”的关系。关联关系所涉及的两个类是处于同一层次上的;而在聚合关系中,两个类处在不平等的层次上的,一个代表整体,一个代表部分。类之间存在的关系程序设计方法学全文共393页,当前为第147页。(4)合成关系(Composition)合成关系,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,并且合成关系是不能共享的,代表整体的对象需要负责保持对象的存活。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,合成关系代表部分的对象在每一个时刻只能与一个对象发生合成关系,由后者排它的负责其生命周期。程序设计方法学全文共393页,当前为第148页。(5)依赖关系(Dependency)依赖关系是类与类之间的连接,它代表一个类依赖于另一个类的定义。类之间存在的关系程序设计方法学全文共393页,当前为第149页。统一建模语言(UML)一旦决定使用对象,就需要某种方式把它们表示出来,以便描述和分析。统一建模语言UML可以实现这样的功能,它是说明、可视化、构造和文档化软件系统的语言,也是一种定义良好、易于表达、功能强大的通用建模语言,它提供了一种机制使得不同的开发人员之间可以有效地共享和交流。程序设计方法学全文共393页,当前为第150页。UML提供了多种图,常用的包括:类图、序列图、对象图、用例图、状态图、部署图。程序设计方法学全文共393页,当前为第151页。一个图就是系统架构在某一方面的表示,每一种UML的视图就是由一个或多个图组成,所有的图共同组成系统的一组完整视图,这组视图被称为一个模型(Model)。模型是对现实系统的一种抽象,反映了现实系统中最主要的方面,是理解、分析、开发现实系统的一种最常用的方式。程序设计方法学全文共393页,当前为第152页。UML的常用图类图:类图是UML图中最基本的图。它既可以描述类和接口,也可以表示类之间的关系。程序设计方法学全文共393页,当前为第153页。在类图中,不同类之间、类与接口之间的多种关系也是可以表达的。图4-9Point、Line和Square类继承Shapes类

程序设计方法学全文共393页,当前为第154页。关联关系是类与类之间的连接,它使一个类知道另一个类的属性和方法。关联既可以是双向的,又可以是单向的。单向的关联更普遍,使用一个箭头表示关联的方向。每一个关联都有两个端点,端点可以有一个角色名,显出关联的对象。在每一个关联的端点,还可以有基数(cardinality),表明这一端的类有几个实例.程序设计方法学全文共393页,当前为第155页。程序设计方法学全文共393页,当前为第156页。图4-10聚合关系的实例

程序设计方法学全文共393页,当前为第157页。图4-11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论