5软件工程基础.ppt
程序设计&软件工程基础,一、程序设计的概念 程序设计:利用计算机解决具体问题的全过程。程序设计的基本过程:分析所求解的问题 抽象数学模型 设计合适的算法和数据结构 编写程序 调试运行,程序设计基础,二、程序设计方法 1.结构化程序设计(Structured Programming)为了完成一些大规模、高复杂度的程序设计任务,SP(和软件工程)思想被提倡。强调数据类型、程序结构,强调可靠性、可维护性甚于程序的效率。其主要思想如下:(1)注意程序的可读性(2)采用自顶向下、逐步求精的设计方法。(3)程序语言只包括3种结构(单入口,单出口)(4)模块化,程序设计基础,基本结构:顺序结构 选择结构 循环结构,程序设计基础,2.面向对象程序设计(Object-Oriented Programming)20世纪80年代OOP由理论转向实践,90年代开始盛行。(1)软件规模越来越大,(美国航天飞机系统4000万条代 码),人们不得不寻求更高效、更可靠的开发技术。(2)OOP抓住软件开发的本质,OOP开发的软件易重用、易修 改、易测试、易扩充。,程序设计基础,对象:用来描述客观事物的实体。每个对象有各自的内部属性和操作方法。,程序设计基础,整个程序是由一系列相互作用的对象构成的,对象之间的交互通过发送消息来实现。,类:具有相同的属性和操作方法,并遵守相同 规则的对象的集合。类是对象集合的抽象,规定了这些对象的公共属性(即数据结构)和方法(操作数据的函数)。对象是类的一个实例。,程序设计基础,OOP特点:封装、继承、多态性,程序设计基础,三、程序设计语言,计算机语言:人与计算机通讯的语言 程序:利用计算机语言编写的能够完成一定功能的一 组代码。,程序设计语言计算机语言,1.语言的分类,程序设计基础,机器语言 从本质上说,计算机只能识别0和1两个数字,因此,计算机能够直接识别的指令是由一连串的0和1组合起来的二进制编码。机器指令操作码操作数 机器语言:指计算机能够直接识别的指令的集合。即以二进制代码表示的机器指令集合,它是计算机能够直接识别和执行的语言。,程序设计基础,优点:占用内存少,执行速度快;缺点:面向机器,通用性差,不易阅读和记忆,编程 工作量大,难以维护。,程序设计基础,例用Intel 8086指令系统编写机器语言程序,完成“9+8”,优点:比机器语言程序容易阅读和修改 缺点:面向机器,通用性差。,程序设计基础,汇编语言 汇编语言:用符号代替机器指令所产生的语言。例如,8086汇编语言 实现“9+8”,源程序:用汇编语言编写的程序。汇编程序:负责翻译的软件。主要作用源程序转换成用二进制代码表示的目标程序。连接程序:将目标程序与库文件或其他目标程序连接起来 形成可执行程序。,程序设计基础,高级语言 高级语言:用接近自然语言和数学语言的语法、符号描 述基本操作的程序设计语言 FORTRAN、Pascal、C、C+、Delphi、Java、C#例如用C+实现“9+8”,程序设计基础,优点:符合人类习惯,简单易学 通用性强,便于维护 源程序:用高级语言编写的程序。翻译程序:将源程序翻译成用二进制代码表示的 目标程序。翻译程序的工作方式:解释方式:边解释边执行 编译方式:编译程序、运行程序,程序设计基础,程序设计基础,2.程序设计语言的选择 选择编程语言涉及很多因素:人的因素:编程小组精通这门语言吗?任务需要:选择的语言能否实现任务的全部功 能?能跨平台吗?有数据库接口功能吗?能直 接控制声卡等硬件吗?客户指定。例如要通过串行口控制一个外部设 备,C+汇编语言是最明智的选择。,了解一些流行的语言,对于做出合理选择会有帮助。,程序设计基础,18,一、软件的定义 软件:计算机系统中的程序及其文档。程序:计算任务的处理对象和处理规则的描述。文档:为了便于了解程序所需的阐明性资料。,程序必须装入机器内部才能工作文档供人阅读,不一定装入机器,软件工程基础,IEEE对软件的定义(1983)软件是计算机程序、方法、规则、相关的文档资料以及在计算机上运行的程序所必需的数据的集合。,程序:是计算机需要遵照执行的一系列指令。它作为一种具 有逻辑结构的信息,精确而完整地描述计算任务中的 处理对象和处理规则。方法、规则:通常是在文档中说明并在程序中实现的。文档:开发、使用和维护程序所需要的图文资料。数据:向一个程序提供的输入。,二、软件的发展过程 软件的发展受到应用和硬件发展的推动和制约,其发展过程大致可分为三个阶段:,1.软件危机概念 观点1 软件产品的生产总是超出预算,落后 于计划进度,而且产品质量不可靠。观点2 在软件的开发和维护过程中所遇到的 一系列严重问题。,软件的生产过程不像硬件那样规范,受人的因素和外界影响很大,因此在软件生产的各阶段都会引入不同程度的错误,致使成本上升,甚至导致软件失败。,三、软件危机与软件工程,2.软件危机的表现软件开发和维护费用急剧上升不重视文档资料产品质量不可靠软件产品成本高于硬件产品,3.软件开发中的问题软件生产技术进展缓慢软件成本和质量难以控制对软件开发的错误认识难以准确、全面把握用户需求不重视阶段审查和复审软件复杂且规模庞大软件维护费用上升,4.软件工程概念软件工程(Software Engineering,SE)一门研究用工程化方法构建和维护有效的、实用的和高 质量软件的学科。软件工程 在软件开发与维护过程中采用工程的原理、方法、技术 并使用正确的管理方法来指导软件生产的全过程。主要内容 软件开发方法 软件开发过程 软件开发工具 软件管理,5.软件工程的基本准则 B.W.Boehm综合各方意见,于1983年提出了软件工程的基本准则1用分阶段的生命周期计划严格管理 据统计,在不成功的软件项目中有50%左右是由于计划不周造成的。应该把软件生命周期划分为若干阶段,并制定出相应的切实可行的计划,严格按照计划对开发和维护进行管理。2坚持进行阶段评审 设计的错误占软件错误的63%,编码错误只占37%。而且在后期纠正错误的代价非常高。因此,必须严格坚持阶段评审,及早发现和纠正错误3实行严格的产品质量控制 在现实中由于外部原因要求对需求等进行修改是难免的。但必须有严格的管理制度和措施。,4采用现代程序设计技术和软件工程技术 如结构化程序分析(Structured Analysis)和结构化设计(Structured Design)等。5结果应能清楚地审查 由于软件是一种看不见摸不着的逻辑产品,对它的检验和审查很困难。因此,应提供可视化的检验标准和方法。6开发人员应少而精 软件开发小组的人员应该是素质高,人员不宜过多。人员素质低和人员过多,都会导致软件的错误率高,且开发效率下降,成本增加。7承认不断改进软件工程的必要性 软件工程是一门不断迅速发展的学科,必须学习和跟踪先进的技术和方法,也要不断总结经验、改进方法,要不断进行技术创新。,四、软件生命周期 软件生命周期是从时间的角度出发,从软件目标的提出、定义、开发、维护,直到最终被丢弃的整个过程。计划时期开发时期运行时期,1.计划时期 问题的定义:提出软件项目的目标和规模 可行性研究:对项目进行可行性调研和论证,确定项目是否能够或 者值得开发2.开发时期 开发时期要具体分析、设计和实现计划时期定义的软件。需求分析:做什么 概要设计:建立目标系统的总体结构 详细设计:怎样做 编 码:选择程序设计语言进行描述。测 试:单元测试、综合测试、确认测试和系统测试或者验收测试。3.运行时期 交付使用维护工作 维护的主要任务:通过各种必要的维护活动延长系统的生命周期。,软件开发的原则与方法,结构化软件开发的原则 结构化:用一组规范的步骤、准则和工具来进行工作 最成熟、最广泛的方法(1)用户参与(2)先逻辑,后物理(3)自顶向下 逐步求精 功能分解与抽象(4)工作成果描述标准化软件开发的方法(1)系统流程图(2)结构分析法(3)结构化设计法(4)数据结构法(5)层次输入处理输出方法(HIPO法),一、问题定义,问题是指用户的基本要求,就是确切地定义用户要求解决的问题,即确定问题的性质、工程的目标和规模。问题定义的目的是要在短时间内,对用户的要求有一个比较准确的估计,对要实现的系统规模做到心中有数。但仅有这些还不够,还要搞清用户不打算干什么,在这个系统中哪些内容不用实现。工作的宗旨是搞清要做什么并划清要实现的系统的范围边界。在问题定义阶段,分析员应尽可能站在较高的角度去抽象、概括所要做的事情。分析员对问题有了明确认识之后,应该把自己的认识写成书面报告,提交给用户和使用部门的负责人审查,以检验分析员对所要解决的问题的理解是否正确。因为分析员对问题的理解为今后开发工作确定了方向。分析员对问题理解正确与否,关系到系统成败。,问题定义(续),在问题定义阶段,分析员应该对工程成本做出粗略的预算,并对下阶段可行性研究所需要时间和成本做出较精确的估计。对问题定义的书面报告应该尽可能清楚简洁,最好写在一页内。这份报告通常应包括工程项目的名字,对问题概括定义、项目的目标,项目的规模,对可行性研究的具体建议(既需要用的时间和成本)等等。一旦分析员和用户及使用部门的负责人对所要解决的问题,取得完全一致的看法且在报告书上签了字,问题定义阶段工作就宣告完成,可行性研究就可以开始。,二、可行性研究,可行性研究就是分析员站在较高的角度去调查现行系统及用户提出的目标,并寻找是否有一种手段能够在现有条件下实际地达到项目目标。同时向用户指出该系统实现的意义,使用户去权衡花费这样的代价去实现这样的系统是否值得。可行性研究的目的就是用最小的代价在尽可能短的时间内,确定问题是否能够解决,从而确定问题是否值得去解。如何才能达到这个目的呢?进行客观分析,通过对几种可能解法,分析其利弊,才能判断原定系统的目标和规模是否现实,系统带来的效益是否大到值得投资开发这个系统。因此,可行性研究实质上是进行一个大大压缩简化了的软件分析和设计过程,也就是在较高层上,以较抽象的方式进行软件分析和设计的过程。可行性研究应在以下三方面进行:技术可行性;经济可行性;操作可行性。,可行性研究(续),1.技术可行性 对技术可行性研究,首先应从对现行系统进行调查入手。因为现行系统是信息的重要来源。新的目标系统必须能完成现行系统的基本功能;另一方面,新系统必须能解决旧系统中存在的问题。所以,应先对现行系统的组成部分、功能和存在问题进行调查研究。但这种调查研究不可能做得很细,对一些内容细节必须先暂时忽略,抓住主要的问题。此时,分析员应把调查到的现行系统的情况画成高层数据流程图。其次,导出新系统的高层逻辑模型(数据流程图)。新系统的高层的逻辑模型建立在现行系统的高层数据流程图的基础上。因为通过前一步的工作,分析员对目标系统(新系统)应该具的基本功能和所受的约束,已有一定的了解,使用数据流程图描绘数据在系统中流动和处理的情况,从而概括地表达出对新系统的设想。用数据流程图和数据字典来定义新系统的高层逻辑模型。,可行性研究(续),其三,重新定义问题。新系统的逻辑模型实质上表达了分析员对新系统必须做什么的看法。此时,分析员应该和用户一起复查问题定义、工程规模和目标。这次复查应该把数据流程图和数据字典作讨论的基础。如果分析员对问题有误解或者用户曾经遗漏了某些要求,那么现在是发现和改正这些错误的时候了。其四,导出供选择的解法。分析员应从他所建议的系统逻辑模型出发,推导出若干个较高层次的解决办法,供比较和选择。最简单的途径,是从技术角度出发,考虑解决问题的不同方案。这些不同方案可以在数据流程图上划分不同的自动化边界而得到。所以分析员在确定了几组不同的自动化边界之后,再针对每组边界,考虑如何实现所要求的系统。当从技术角度提出了一些系统模型之后,应根据技术可行性的考虑,初步排除一些不现实的系统。把技术上行不通的解法(方案)去掉之后,就剩下了一组技术上可行的方案。,可行性研究(续),一般来说,技术可行性还可以从硬件(包括外围设备)的性能要求、软件的性能要求(包括操作系统、软件包、数据库管理系统、各种软件工具)能源及环境条件以及软件系统所采用的技术是否先进,实现的可能性如何,实现软件系统的人员素质是否具备等方面进行考虑。2.经济可行性 研究经济可行性,不仅仅是了解为完成用户提出的要求是否有足够的资金支持(这是目前很多分析员重点要做的事情),而更主要是把成本与获利分析清楚。也就是对经济合理性进行评价,即带来的经济效益是否超过其开发和维护所需要的费用。这工作包括估计费用和估计效益两个方面。,可行性研究(续),估计费用。主要考虑以下几部分:设备费用,包括计算机硬件和软件的费用;人力费用,包括开发人员和维护人员的工资;材料费用;管理费用以及维护费用等。估计效益。可以从以下几个方面考虑:提供了哪些以前提供不了的信息,提供信息的速度提高了多少?质量有什么提高?对使用者查询和使用信息的方便程度有什么提高,节省多少人力?对组织的领导人和管理人员正确做出决策提供了哪帮助?有时不能直接用金钱来衡量效益,如一个邮购单位,由于能够及时、准确地处理订货,缩短了顾客收到货物的时间,从而在竞争中得到了更多的顾客。这一类的收益就不容易用具体金钱来衡量,只能由管理人员根据经验来做出大约的估计。在估计效益时,要谨慎把各种可能影响效益发挥的各种因素考虑在内,打上折扣。,可行性研究(续),3.操作和维护可行性 人员操作和维护可行性的研究是了解当用户所要求的软件系统建立起来之后,用户对它的操作是否方便?管理和维护是否容易?如果对于一个软件系统的操作比原有的手工系统还麻烦,那么它是不会受欢迎的。另一方面,如果管理和维护这个软件系统的人员比原来的手工系统还多,素质要求还高,那么这个系统对用户来说负担太重了。从上面的讨论中不难看出,可行性研究的出发点应该是从当前的物理系统到新的物理系统的转换,它是整个可行性研究的基础,实际上也是整个系统开发过程的缩影。因为整个系统实现过程也就是把当前的手工系统转化为可用计算机实现的新系统的一个转换过程,只不过这工作比在可行性研究阶段更细致,更具体罢了。上述从三个方面分别开展的,而实际上它们之间有着密切的联系,因此还必须对它们综合考虑,然后向用户推荐方案供其选择。,可行性研究(续),当用户选定方案之后,分析员应对在问题定义阶段所规定的实现目标进行修改。因为,这时对系统有了更深入的了解,原来的问题定义可能有的不能实现,还有些需要加上去,也就是说原有的问题边界不够准确,需要纠正,以便今后有一个非常明确的工作目标。这是一步极有实质意义的工作,它使分析员和用户最后明确了要解决的问题的边界以及它的实现方案。一般来说,可行性研究的结果可导致以下两种情况:(1)可行()不可行 可行性研究结束后,要写出可行性研究报告,提交有关专家论证和上级主管部门批准。可行性研究报告作为所有软件文件资料的基础材料,它的格式可以很不相同,但大体的内容提纲是一致的。,需求分析的定义软件需求分析是在可行性研究基础上进行的更细致的分析工作。也就是在对软件计划阶段确定的工作范围内进一步对目标对象和环境作细致、深入的调查分析。需求分析过程实际上是一个调查研究、分析综合的过程,是一个抽象思维、逻辑推理的过程。通过调查研究和分析,充分了解用户对软件系统的要求。在此基础上,把用户要求表达出来,解决软件系统“做什么”的问题。也就是建立起系统的逻辑模型,把软件功能和性能的总体概念描述成具体的软件规格说明书。需求分析的目标(1.理清数据流或数据结构;2.通过标识接口细节,深入描述功能,确定设计约束和软件有效性要求;3.构造一个完全、精致的目标系统逻辑模型。)需求分析的任务(认清问题、分析与综合、逻辑模型导出与复审)结构化分析方法,三、需求分析,结构化分析方法,结构化分析方法的策略基本的系统模型结构化分析方法策略分析,.,输入1,.,.,业务流程图,结构化分析方法(续)数据流图,数据流图的定义数据流图的组成要素:源点、终点、数据流、数据文件、数据变换数据变换的两种类型:对数据结构的变换,如对数据的格式重新排列。在原有数据内容基础上产生新的数据内容,如计算平均值或总计。数据流图的画法、画数据流图的基本原则(数据流程图中的图形符号只能包含四种基本元素。数据流程图主图上的数据流必须封闭在外部实体(外部项)之间,实体可以是一个也可是多个。变换框上至少有一个输出数据流和一个输入数据流。数据流程图上的每一个元素都必须有“名字”。)、方法与步骤注意事项(父子图的平衡、分解程度与数据存储文件,数据流图是静态图、与传统框图的差别、反复修改的过程),数据流图,数据流图,数据流图,数据字典、数据字典的定义(数据字典就是对数据流程图中,数据、变换等进行精确定义。)、数据定义方法(对数据自顶向下的分解。当分解到不需要 进一步定义,对每个和系统有关的人都能清楚理解这些数 据项的含义为止。)、数据定义中的数据结构(顺序、选择、重复、可选)、数据字典中的符号(表示等价、+表示和(或连接两个 分量)、表示重复花括号内的分量、|表示或即从 方括弧内列出的若干分量中选择一个、()表示可选即 或括弧里的量可有可无、n.m 表示界域)、数据流、数据存储、数据变换的定义,加工的描述,要求:准确、清晰、简洁自然语言结构化语言决策树决策表以上工具的混合使用,决策树、决策表、结构化语言,if 交易额=2500元 then if 三个月无欠款 then 折扣 15%else if 老顾客 then 折扣10%else 折扣 5%else 无折扣,1.研究目前正在使用的系统 现有的系统(包括人工系统)是信息的重要来源。因此,首先要去了解现有系统能完成哪些工作,而新的目标系统必须也能完成它的基本功能;对现有系统(人工系统)的了解,是要了解对现有系统能做什么,同时画出描绘现有系统的高层数据流程图。2.导出新系统的高层数据流程图(即逻辑模型)好的设计,通常总是从现有系统出发导出现有系统的逻辑模型,然后参考现有系统的逻辑模型,设想出新系统的逻辑模型。通常第一步的工作,对新的目标系统应该具有的基本功能和所受的约束条件,已有一定的了解,把这些了解用数据流程图概括地描绘出对新系统的设想。同时定义系统中使用的数据,构造初步的数据字典。这样,数据流程图和数据字典共同定义了新的目标系统的高层逻辑模型。,结构化分析步骤,结构化分析步骤(续),3.完善数据流程图 在第二步画出新系统的高层数据流程图中,许多数据的定义和一些细节都没有考虑进去。现在应着手解决这个问题。(1)沿着数据流程图回溯 为了对数据流程图中的数据流和数据存储进行定义,通常是从数据流程图的输出端着手分析。这是因为软件系统的目标是产生这些输出,输出数据确定了软件系统必须具有的最基本的组成元素。输出数据是由哪些数据项组成的,通过调查访问是不难搞清这个问题。那么每个输出数据项又是从哪里来的呢?因为它是新系统的输出,那么它们或者是从外面输入到系统中来,或者是通过运算由系统中产生出来的。为了弄清这些,可以沿着数据流程图从输出端往输入端回溯,能够确定每个数据项的来源,与此同时也就初步定义了有关的算法。,结构化分析步骤(续),在第二步得到的高层数据流程图中,许多具体细节没有包括在里面。因此,当沿着数据流程图回溯时,经常会遇到:为了得到某个数据项需要用到数据流程图中目前还没有的数据项,或者得出这个数据项要用的算法还不完全清楚。为了解决这些问题,需要向用户和有关人员请教,他们的回答使分析员对新系统的认识更具体更深入了。系统中更多的数据项被划分出来,更多的算法被搞清楚了。一般把分析过程得到的有关数据项的信息、变换的算法简明地记在数据字典中。(2)用户复查 通过沿着数据流程图的回溯过程,把一些数据项和变换的算法记录到数据字典中。这个数据字典是否准确完整?算法是否正确?还有没有必要的变换和数据项遗漏了?某些数据项的来源搞清楚吗?,结构化分析步骤(续),对这些问题必须请系统的用户对前面步骤得出的结果仔细地进行复查。可以借助于数据流程图和数据字典,从输入端开始向用户解释输入数据怎样一步一步地转变成输出数据。这些解释集中反映了分析员通过前面分析工作,所获得的对新目标系统的认识。这些认识是否正确,有无遗漏?应请用户及时纠正和补充分析员的认识。通过复查过程验证了已知的元素,补充了未知的元素。填补了文档中的空白。由于复查可能获得新的知识,又可能引出新的问题。这些需要进一步的调查访问寻求对问题的解答,而且还应及时修改和补充数据流程图和数据字典,把对系统的新认识及时记录下来。所以,追踪数据流程图和复查软件系统的逻辑模型实质上构成一个循环。对数据流程图的分析产生一些问题,这些问题通过复查得到的答案使分析员对系统有更深人更具体的认识,同时可能又引出新的问题,寻找这些新问题的答案导致了对新系统的更进一步的认识。,每经过一次循环都会对新系统了解更多的细节。,结构化分析(续),4.分解细化数据流程图 通过上面的分析及用户的复查,分析员对新系统有了更进一步了解,此时可对数据流程图中的各个变换进行检查。如果某个变换的功能还比较复杂,即还比较抽象,就应将这个变换功能分解成若干个子功能。这些较低层的子功能就成为新的数据流程图上的变换。在新的数据流程图中,也应包括自己的数据流和数据存储。数据流程图经分解之后,得到一组新的数据流程图,不同的软件元素之间关系变得更清楚了。对这组新数据流程图的分析追踪可能产生新的问题,对这些问题的解答,又可能在数据字典中增加一些新的条目,并且可能导致新的或精化的变换算法的描述。随着分析过程的进展,经过问题与解答的反复循环,分析员越来越深入、具体地定义了新系统。通过上面各步就可以得到一套新目标系统的分层数据流程图和数据字典,也就是得到新系统的逻辑模型。,软件总体设计的任务 从软件需求规格说明书出发,将设计对象用数据流或数据结构的形式表达成完整的抽象实体。这个实体应当是一个结构清晰、层次分明的模块组合,应当可以被评价和细化,也可以被修改。同时还要定义这个实体与外部环境的接口。软件总体设计的目标 1.软件实体应当具有明显的层次结构,便于软件元素之间的 控制。2.软件实体应当模块化,这些摸块应具有完全独立的功能。3.软件实体与环境的界面应当清晰。4.软件设计的最终表示软件设计规格说明应当清晰、简 洁、完整和无岐义。,四、软件总体设计,结构化方法从建立一个具有良好结构系统的观点出发,基于把一个复杂的系统分解成相对对立的模块的原则,主要研究了将系统分解为不同模块的方法与技术,分析系统分解师长生的各种影响,提出了评价模块结构质量的具体标准,还给出了从数据流图导出模块结构图的规则。结构化设计方法规定了一系列模块的分解协调原则,提出了结构化设计的基础是模块化,即将整个协调分解成相对对立的若干模块,通过对模块的设计和模块之间关系的协调来实现整个协调的功能。,结构化设计方法,系统模块结构图,模块化的优点,可以独立设计、编码、测试,控制了程序的复杂性,减少了出错。模块错误不宜扩散,提高了软件的可靠性。便于团队开发开发的软件可维护性、开放性、通用性好。,1.评价软件初始结构,调节之间的耦合度和聚合度 在设计初始软件结构以后,常常会发现几个模块的功能有相似之处,这相似部分不仅增加了编程和调试的工作量,同时也给维护过程带来麻烦,应当消除这样的重复。(1)完全相似 这种情况只在数据类型上不一致,可采用完全合并,只需在数据类型的描述或变量定义上加以改进。(2)局部相似 两个模块具有功能类似的组成部分和不同部分。可通过模块分解消除重复功能部分:首先找出模块中的功能相似部分,分离出来,构成它们的一个公共的下层模块。如果分解后余下的模块比较简单,则可以同它们的各自调用模块进行合并。这样消除了重复功能的组成部分,模块间的耦合较小、模块内的聚合较大。,软件总体设计准则(续),软件总体设计准则(续),2.模块功能的完善一个完整的功能模块应具有以下三个要素:(1)执行某项指定功能的部分(2)如果需要返回一系列的数据给它的调用者,应在完成数据处理或结束时,告诉它的调用者“文件完”或其他标志。(3)出错处理部分,即在不能完成指定任务时,必须将产生这种例外情况的原因(出错标志)通知它的调用者。它们是一个功能模块的有机组成部分,不应当分离到其他模块中去,否则会增加模块间的耦合。,软件总体设计准则(续),3.模块调用个数最好不要超过五个 一个模块拥有的直属下级模块的个数叫模块的扇出数。如果一个模块扇出数过大,这个模块就往往包含过多的功能,一般是因为缺乏中间层次的控制模块,需要将其功能进行分解。一个模块的直接上级模块的个数叫模块的扇入数。一个模块的扇入表明有多少个上级模块直接调用它,扇入越大,则共享该模块的上级模块数目越多,这是有好处的。但不能违背模块独立性而单纯追求高扇入。4.一个模块的作用范围应在其控制范围之内 一个模块的作用范围就是这个模块内一个判定的作用范围。一个判定的作用范围是指所有受这个判定影响的那些模块,只要模块中含有一些依赖于这个判定的操作,那么这个模块就在这个判定的作用范围之内。,软件总体设计准则(续),5.力争设计单入口和单出口的模块,避免“病态联接”一个模块只有一个入口和一个出口时,这个模块比较容易理解,有利于结构化编制程序,也比较容易维护。但实际上这样的模块不多。病态联接是指转移到或引用到另一模块中去的内容耦合。要尽量避免这种病态联接,以减少模块间的耦合。6.力争降低模块接口的复杂性 模块接口复杂性是软件发生错误的一个主要原因。因此,应该仔细设计模块接口,使得信息传递简单并且和模块功能相一致。例如:求一元二次方程的根的模块QUAD-ROOT(TBL,x)其中用数组TBL传送方程的系数,用数组x回送求得的根。但是模块QUAD-ROOT接口TBL和x意义不明确,不利于对这个模块的理解。因此可以将它简化如下:QUAD-ROOT(A,B,C,ROOT1,ROOT2),其中,A,B,C是方程系数,ROOT1和ROOT2是方程的两个根。,软件的总体设计准则(续),7.模块的大小 模块大小就是模块含语句数量的多少。模块的大小没有统一的标准。一般来说,模块的大小以一页左右为宜,比较容易阅读和理解。在进行模块设计时,首先应根据模块的独立性来选取模块的规模。如果某个模块功能是独立的,那怕程序段较短也不要人为地加长;如果程序段只有一个独立的功能,那怕程序较长,也不要人为地把它分解成两个模块。,结构化设计工具:HIPO图,用图形的方法表示系统的输入、输出、功能和层次,软件详细设计的定义 对软件模块的过程设计。软件详细设计的任务 对总体设计所产生的功能模块进行过程描述,开发一个可以直接转换成程序语言代码的软件表示。软件详细设计的步骤1.将总体设计产生的构成系统的各功能模块逐步细化,形成 若干程序模块;2.运用详细设计工具对程序模块进行过程描述;3.确定各个模块间的详细接口信息;4.编写详细设计说明书;5.详细设计评审。,五、软件详细设计,程序设计,风格效率,测试的目的1.测试是一个程序的执行过程,它的目的在于发现错误;2.一个好的测试用例是极可能发现至今未发现的错误;3.一个成功的测试是发现了至今未发现的错误的测试。测试的原则1.避免由程序编写者自己进行测试,目的在于克服盲目的自信心和对功能要求误解的延续性;2.测试用例的设计和选择,预期结果的定义要有利于错误的检测。无效的、异常的、临界的或可能引起问题变异的输入条件比正常的输入条件更重要。测试用例不仅要检查程序是否做了应该做的事,还要检查它是否做了不应该做的事;3.应当尽早地不断地进行软件测试;,系统测试,4.测试用例应当由测试输入数据及对应的输出数据构成;5.应当制定严格的测试计划;6.应当注意测试中的群集现象,即已经发现了错误的位置很 可能还存在错误,要继续重点测试;7.应当对每一个测试结果做全面检查;8.妥善保存测试计划与测试用例,为以后的维护提供方便。测试方法人工测试:个人复查,走查,会审机器测试:黑箱测试(功能测试):等价划分、边界值分析、错误推测 法、因果图法 白箱测试(结构测试):逻辑覆盖(语句、判断、条件),测试步骤:单元测试(对应编码、白盒测试)组装测试(对应系统设计、黑盒测试)确认测试(对应需求分析、黑盒测试)系统测试,系统测试,动态调试的测试方法可以按照两种标准进行分类。(1)按照测试用例设计依据的不同,可分为黑箱测试和白箱测试 在程序调试中常常使用两者结合的方法进行测试。在进行底层模块测试的时候可以使用白箱测试法,通过专门的测试条件和测试数据来考虑程序在不同点上的状态是否符合预期的要求。在总体调试的时候则可以使用黑箱测试法,脱离程序内部结构来考察对于不同情况下的测试数据程序是否能够正确出解。对于中间模块,可以用黑箱,也可以用白箱,或是两者兼用,具体要看适应那种测试法。一般说来,结构复杂的模块使用黑箱测试法,结构简单的使用白箱测试法。由于白箱测试法测试用例设计比较困难,所以在时间紧张的情况下,可以一律采用黑箱测试法,这样效率比较高。,系统测试,(2)按照测试顺序的不同,可分为由底向上测试和从顶向下测试 在运用这些测试方法时,首先对程序的结构、模块的功能一定要了如指掌。采用从顶向下的测试方法时,经常是一个模块还没有测试完,就转到了下一个模块,特别容易忘记和疏漏。如果对程序结构心中没有概念,就很容易被弄糊涂。如果对模块的功能不是很清楚,则难以判断模块执行结果的对错,从而无法准确确定错误所在。其次,测试需要有条理地进行。坚持使用同一个测试用例直到输出正确为止;在一个模块没有测试完毕时,不要进行下一个模块的测试,除非这个模块是当前模块的子模块且在当前模块的测试中发现这个子模块有错。最后,在每次修改了源代码之后一定要把已经测过的所有测试用例再测一遍,以防产生新的错误。测试只能发现某些错误的存在,而不能证明错误的不存在。证明有错误存在就必须用测试用例。,系统测试,常用的测试用例设计方法有等价分类法和错误推测法等 等价分类法:根据程序功能将输入的数据划分成若干个等价类,然后考虑数据选择,设计出测试用例,以达到测试目的。错误推测法:错误推测法实际上是利用了黑箱白箱结合的思想,有针对性地设计测试用例来找出程序容易出现错误的地方。例如在一个有许多IfThenElse语句嵌套的地方,就很容易出现错误,而一般的测试用例很难找出这种错误。这时错误推测法就能派上用场,对于这一系列的IfElse语句,设计出盖不同路径的测试用例,从而检验程序的正确性。具体测试时选用哪种方法,采用的策略是首先用边界分析法,再用等价分类法,最后对结构复杂的部分使用错误推测法进行测试。,系统测试,