收藏 分享(赏)

第6章 程序编码.ppt

上传人:tkhy51908 文档编号:8010168 上传时间:2019-06-04 格式:PPT 页数:75 大小:570.50KB
下载 相关 举报
第6章 程序编码.ppt_第1页
第1页 / 共75页
第6章 程序编码.ppt_第2页
第2页 / 共75页
第6章 程序编码.ppt_第3页
第3页 / 共75页
第6章 程序编码.ppt_第4页
第4页 / 共75页
第6章 程序编码.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、,2019/6/4 1,结束,返回,第6章 程序编码,6.1 程序编码的目的 6.2 程序设计语言 6.3 程序设计风格 6.4 程序效率 6.5冗余编程及容错技术 6.6 程序复杂性度量,第6章 程序编码,2019/6/4 2,结束,返回,所谓编码,是使用选定的程序设计语言,把模块的过程描述翻译为用该语言书写的源程序。 源程序不仅要求语法上的正确性,还要求源程序具有良好的结构性和良好的程序设计风格 。 在程序编写时应考虑到,所写的程序将被别人阅读,一定要尽量使程序写得容易被人读懂。 目前,人们编写源程序还不能使用自然语言,只能用某种程序设计语言 。,6.1 程序编码的目的,2019/6/4

2、3,结束,返回,6.1 程序编码的目的,编码的目的: 使用选定的程序设计语言, 把模块的过程性描述翻译为用该语言书写 的源程序(源代码)。,第6章 程序编码,2019/6/4 4,结束,返回,6.2 程序设计语言,程序编码阶段的任务是将软件的详细设计转换成用程序设计语言实现的程序代码,即把用PDL伪码写成的程序,翻译成计算机能接受的诸如C、C#、Delphi、汇编之类程序设计语言的程序。 因此,程序设计语言的性能和设计风格对于程序设计的效能和质量有着直接的关系。,第6章 程序编码,2019/6/4 5,结束,返回,6.2.1 程序设计语言的分类,程序设计语言有多种分类法 按照语言的抽象级别,有

3、低级语言和高级语言。 低级语言包括机器语言(第一代语言)和汇编语言(第二代语言),它们都是与特定计算机硬件密切相关的程序设计语言。 高级语言是不反映特定计算机体系结构的程序设计语言,其表示方法更接近待解决问题的表示方法,包括FORTRAN、C等,即第三代语言。,6.2 程序设计语言,第6章 程序编码,2019/6/4 6,结束,返回,按照应用的范围,有通用语言和专用语言。 通用语言可适用于多种应用,包括Basic、FORTRAN、COBOL、C以及面向对象语言Visual C(Visual族)、Java、.net族等。 专用语言是为特殊的应用设计的语言。通常具有自己特殊的语法形式。面对特定的问

4、题,输入结构及词汇表与该问题的相应范围密切相关。例如人工智能领域Lisp、PROLOG,图像处理语言Matlab等。,6.2 程序设计语言,第6章 程序编码,2019/6/4 7,结束,返回,按照对用户的要求,有过程性语言和非过程性语言。 过程性语言是一种通过指明一系列可执行的运算和运算次序来描述计算过程的语言,如C、FORTRAN、COBOL等。 非过程性语言是一种不显式指定处理细节的程序设计语言,如查询语言SQL、程序生成器、判定支持语言、原型语言、形式化规格说明语言等。,6.2 程序设计语言,第6章 程序编码,2019/6/4 8,结束,返回,6.2.2 程序设计语言的选择,为某个特定开

5、发项目选择程序设计语言时: 从技术角度、工程角度、心理学角度评价和比较各种语言的适用程度; 考虑现实可能性。 需要作出某种合理的折衷。 在选择与评价语言时,首先要从问题入手,确定它的要求是什么? 这些要求的相对重要性如何? 再根据这些要求和相对重要性来衡量能采用的语言。,6.2 程序设计语言,第6章 程序编码,2019/6/4 9,结束,返回,通常考虑的因素有: 项目的应用范围; 算法和计算复杂性; 软件执行的环境; 性能上的考虑与实现的条件; 数据结构的复杂性; 软件开发者的知识水平和心理因素等。,6.2 程序设计语言,第6章 程序编码,6.2 程序设计语言,第6章 程序编码,项目应用领域是

6、选择语言的关键因素,有下列几种类型。 1.科学工程计算软件 FORTRAN语言 (2)Pascal语言 (3)C语言 (4)PL/1语言 2.数据处理与数据库应用软件 Cobol语言 (2)SQL语言 (3)Oracle (4)FoxPro (5)Power Builder ,3.实时处理软件 (1) 汇编语言 (2) Ada语言 4.系统软件 汇编语言、C语言、Pascal语言和Ada语言。 5.人工智能软件 (1) Lisp语言 (2) Prolog语言,6.2 程序设计语言,第6章 程序编码,6.2 程序设计语言,第6章 程序编码,选择语言的原则为: 1.最少工作量原则; 2.最少技巧性

7、原则; 3.最少错误原则; 4.最少维护原则; 5.最少记忆原则。,6.2 程序设计语言,第6章 程序编码,程序设计的总原则: 1.先求正确后求快; 2.先求清晰后求快; 3.求快不忘保持程序正确; 4.保持程序整洁以求快; 5.不要因效率而牺牲清晰。,6.2 程序设计语言,第6章 程序编码,好程序的标准: 1.易于测试和调试; 2.易于维护; 3.易于修改; 4.设计简单; 5.高效率。,6.2 程序设计语言,第6章 程序编码,6.2 程序设计语言,第6章 程序编码,6.2 程序设计语言,第6章 程序编码,2019/6/4 18,结束,返回,6.3 程序设计风格,程序的良好风格包括: 源程序

8、文档化 数据说明 语句说明 输入/输出方法,第6章 程序编码,2019/6/4 19,结束,返回,6.3.1 源程序文档化,标识符的命名 标识符,包括模块名、变量名、常量名、标号名、子程序名、数据区名以及缓冲区名等。这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量用Total,表示平均值用Average,表示和的量用Sum等。,6.3 程序设计风格,第6章 程序编码,2019/6/4 20,结束,返回,名字不是越长越好,应当选择精炼的意义明确的名字。 必要时可使用缩写名字,但注意缩写规则要一致,并且要给每一个名字加注释。 在一个程序中,一个变量只应

9、用于一种用途。 new.balance.accounts.payable /名字太长nbap /需加注释N /?,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 21,结束,返回,程序的注释 程序中的注释是程序员与日后的程序读者之间通信的重要手段。 注释绝不是可有可无的。 一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多。 注释分为序言性注释和功能性注释。,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 22,结束,返回,序言性注释 通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。 包括: 程序标题;

10、 有关本模块功能和目的的说明;,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 23,结束,返回,主要算法; 接口说明:包括调用形式,参数描述,子程序清单; 有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息; 模块位置:在哪一个源文件中,或隶属于哪一个软件包; 开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 24,结束,返回,功能性注释 功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。 要点: 描述一段程序,而不是每一个语句; 用缩进和

11、空行,使程序与注释容易区别; 注释要正确。,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 25,结束,返回,视觉组织 恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。 例如,将表达式 (A-17)ANDNOT(B=49)ORC 写成 (A-17) AND NOT (B=49) OR C 自然的程序段之间可用空行隔开;,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 26,结束,返回,移行也叫做向右缩格。它是指程序中的各行不必都在左端对齐。 对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结构更加清晰。 例如,两重选择结构嵌套,写成

12、下面的移行形式,层次就清楚得多。,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 27,结束,返回,IF() THEN IF() THEN ELSE ENDIF ELSE ENDIF,6.3.1 源程序文档化,第6章 程序编码,2019/6/4 28,结束,返回,6.3.2 数据说明,在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。 为了使程序中数据说明更易于理解和维护,必须注意以下几点: 数据说明的次序应当规范化 说明语句中变量安排有序化 使用注释说明复杂数据结构,第6章 程序编码,2019/6/4 29,结束,返回,(1)数据说明的次序规

13、范化,数据说明次序规范化,使数据属性容易查找,也有利于测试,排错和维护。 原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定。 在类型说明中还可进一步要求。,6.3.2 数据说明,第6章 程序编码,2019/6/4 30,结束,返回,(2)说明语句中变量安排有序化,当多个变量名在一个说明语句中说明时,应当对这些变量按字母的顺序排列。 例如,把integer size, length, width, cost, price; 写成 integer cost, length, price, size, width;,6.3.2 数据

14、说明,第6章 程序编码,2019/6/4 31,结束,返回,(3)使用注释说明复杂数据结构,如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的固有特点。 例如, 对链表结构和C、C+中用户自定义的数据类型,都应当在注释中做必要的补充说明。,6.3.2 数据说明,第6章 程序编码,2019/6/4 32,结束,返回,6.3.3 语句结构,在设计阶段确定了软件的逻辑流结 构,但构造单个语句则是编码阶段的任 务。语句构造力求简单,直接,不能为 了片面追求效率而使语句复杂化。,第6章 程序编码,2019/6/4 33,结束,返回,在一行内只写一条语句 在一行内只写一条语句,并且

15、采取适当的移行格式,使程序的逻辑和功能变得更加明确。 许多程序设计语言允许在一行内写多个语句。但这种方式会使程序可读性差。因而不可取。,6.3.3 语句结构,第6章 程序编码,2019/6/4 34,结束,返回,例如,有一段排序程序 FOR I:=1 TO N1 DO BEGIN T:=I;FOR J:=I1 TO N DO IF AJAT THEN T:=J;IF TI THEN BEGIN WORK:=AT;AT:=AI;AI:=WORK;END END;由于一行中包括了多个语句,掩盖了程序的循环结构和条件结构。,6.3.3 语句结构,第6章 程序编码,2019/6/4 35,结束,返回,

16、/改进布局 FOR I := 1 TO N-1 DO BEGIN T:=I; FOR J := I1 TO N DO IF (AJAT ) THEN T:=J; IF TI THEN BEGIN WORK:=AT; AT:=AI; AI:=WORK; END END;,6.3.3 语句结构,第6章 程序编码,2019/6/4 36,结束,返回,程序编写首先应当考虑清晰性程序要能直截了当说明程序员的用意保证程序正确,然后才要求提高速度避免使用临时变量而使可读性下降让编译程序做简单的优化尽可能使用库函数避免不必要的转移,6.3.3 语句结构,第6章 程序编码,2019/6/4 37,结束,返回,尽

17、量只采用三种基本的控制结构来编写程序 避免使用空的ELSE语句和IFTHEN IF语句 避免采用过于复杂的条件测试 尽量减少使用“否定”条件的条件语句 数据结构要有利于程序的简化 尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成使用的语言,6.3.3 语句结构,第6章 程序编码,2019/6/4 38,结束,返回,要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见; 利用信息隐蔽,确保每一个模块的独立性; 从数据出发去构造程序 不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织 对太大的程序,要分块编写、测试,然后再集成 对递归定义的数据结构尽量使用递归过程,6

18、.3.3 语句结构,第6章 程序编码,2019/6/4 39,结束,返回,输入和输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能方便用户的使用。在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。不论是批处理的输入输出方式,还是交互式的输入输出方式,在设计和编码时都应考虑下列原则:,6.3.4 输入和输出,第6章 程序编码,2019/6/4 40,结束,返回,对所有输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性检查输入项的各种重要组合的合理性,必要时报告输入状态信息使得输入的步骤和操作尽可能简单,并保持简单的输入格式输入数据时,应允许使用自由格式应允许缺

19、省值,6.3.4 输入和输出,第6章 程序编码,2019/6/4 41,结束,返回,输入一批数据时, 最好使用输入结束标志在交互式输入/输出方式输入时,在屏幕上使用提示符明确提示交互输入的请求,指明可使用选择项的种类和取值范围,在屏幕上给出状态信息保持输入格式与输入语句要求的一致性给所有的输出加注解,并设计输出报表格式,6.3.4 输入和输出,第6章 程序编码,2019/6/4 42,结束,返回,6.4 程序效率,软件的“高效率”,即用尽可能短的时间及尽可能少的存储空间实现程序要求的所有功能,是程序设计追求的主要目标之一。 一个程序效率的高低取决于多个方面,主要包括需求分析阶段模型的生成、设计

20、阶段算法的选择和编码阶段语句的实现。,第6章 程序编码,2019/6/4 43,结束,返回,程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。 程序效率的准则为:效率是一个性能要求,应当在需求分析阶段给出;软件效率以需求为准,不应以人力所及为准;好的设计可以提高效率;程序的效率与程序的简单性相关。,6.4.1 程序效率的准则,6.4 程序效率,第6章 程序编码,2019/6/4 44,结束,返回,源程序的效率与详细设计阶段确定的算法的效率直接相关。在详细设计翻译转换成源程序代码后,算法效率反映为程序的执行速度和存储容量的要求。转换过程中的指导原则是: 在编程序前,尽可能化简有关的算术

21、表达式和逻辑表达式; 仔细检查算法中嵌套的循环,尽可能将某些语句或表达式移到循环外面;,6.4.2 算法对效率的影响,6.4 程序效率,第6章 程序编码,2019/6/4 45,结束,返回,尽量避免使用多维数组; 尽量避免使用指针和复杂的表; 不要混淆数据类型,避免在表达式中出现类型混杂; 尽量采用整数算术表达式和布尔表达式; 选用等效的高效率算法。,6.4 程序效率,第6章 程序编码,2019/6/4 46,结束,返回,在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操作系统的分页功能的虚拟存储管理,给软件提供了巨大的逻辑地址空间。 采用结构化程序设计,将程序功能合

22、理分块,使每个模块或一组密切相关模块的程序体积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。,6.4.3 存储效率,6.4 程序效率,第6章 程序编码,2019/6/4 47,结束,返回,在微型计算机系统中,存储容量对软件设计和编码的制约很大。因此要选择可生成较短目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。 提高存储效率的关键是程序的简单性。,6.4.3 存储效率,6.4 程序效率,第6章 程序编码,2019/6/4 48,结束,返回,6.4.4 输入输出效率,输入输出分为两种类型: 一种是面向设备的输入输出。 另一种是面向人(操作员)的输入输出; 如果操

23、作员能够十分方便、简单地录入输入数据, 能够十分直观、一目了然地了解输出信息,则面向 人的输入输出是高效的。,6.4 程序效率,第6章 程序编码,2019/6/4 49,结束,返回,面向设备的输入输出,分析起来比较复杂。从详细设计和程序编码的角度来说,可以提出一些提高输入输出效率的指导原则: (1)输入输出的请求应当最小化; (2)对于所有的输入输出操作,安排适当的缓冲区,以减少频繁的信息交换。,6.4.4 输入输出效率,6.4 程序效率,第6章 程序编码,2019/6/4 50,结束,返回,(3)对辅助存储(例如磁盘),选择尽可能简单的,可接受的存取方法; (4)对辅助存储的输入输出,应当成

24、块传送; (5)对终端或打印机的输入/输出,应考虑设备特性,尽可能改善输入/输出的质量和速度;,6.4.4 输入输出效率,6.4 程序效率,第6章 程序编码,2019/6/4 51,结束,返回,(6)任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的; (7)任何不易理解的所谓“超高效“的输入/输出是毫无价值的; (8)好的输入/输出程序设计风格对提高输入/输出效率会有明显的效果。,6.4.4 输入输出效率,6.4 程序效率,第6章 程序编码,6.5.1 冗余编程 冗余(Redundancy)是改善系统可靠性的一种重要技术。冗余是指所有对于实现系统规定功能来说是多余的那部分资源,包

25、括硬件、软件、信息、时间。 冗余有并行冗余和备用冗余。对于一个系统,提供两套或更多的硬件,使之并行工作,这种方式称为并行冗余,也称热备用或主动式冗余。另一种情况是,如果提供多套的硬件资源,但是只有一套资源在运行,只有当它失效时,才启用备用资源,该方式称为备用冗余,也称为冷备用或被动式冗余。,6.5 冗余编程及容错技术,第6章 程序编码,使用冗余技术可以大大提高系统运行的可靠性。比如,单个元件的可靠性为80%,则它发生故障的概率为20%,如果两个元件是相互独立的并行工作,则只有当两个元件都失效时系统才会失败,系统失败的概率为4%(0.2*0.2),可靠性提高到了96%。 但是,对于软件系统不能简

26、单照搬硬件冗余的情况。因为如果运行两个功能一样且程序一样的系统,则一个软件上的任何错误都会在另一个软件上出现。因此,在冗余软件设计时,必须由不同的人设计出功能相同,但算法和设计不同的源程序。,6.5 冗余编程及容错技术,第6章 程序编码,6.5.2 软件容错技术 软件系统的应用十分广泛,航空航天、军事、银行监管系统、交通运输系统以及其他重要的工业领域对软件的可靠性要求非常高。系统出现故障不仅会导致财产的重大损失,还会危及人身安全。因此,系统的可靠性越来越受到重视。 一般而言,提高系统的可靠性有两种比较有效的方法。一种是避错(Fault-avoidance),就是避免出现故障,即在软件开发的过程

27、中不让错误潜入软件的技术。这主要体现在提高软件的质量管理,采用先进的软件分析技术和开发方法。但即使这样,由于各种因素的影响总避免不了出现故障。这就要求在系统出现故障的情况下容忍故障的存在,即第二种方法容错(Fault-tolerance)技术。,6.5 冗余编程及容错技术,第6章 程序编码,容错技术最早由约翰冯诺依曼(John Von Neumann)提出,所谓容错是指在出现一个或者几个硬件或软件方面的故障或错误的情况下,计算机系统能够检测出故障的存在并采取措施容忍故障,不影响正常工作,或者在能够完成规定的任务的情况下降级运行。 1.容错软件的定义 容错软件具有以下四层含义: (1)对自身的错

28、误具有屏蔽作用; (2)可以从错误状态恢复到正常状态; (3)发生错误时,能在一定程度上完成预期的功能; (4)在一定程度上具有容错能力。,6.5 冗余编程及容错技术,第6章 程序编码,2.容错技术主要方法 实现容错的主要技术手段是冗余,由于加入了冗余资源,有可能使系统的可靠性得到较大的提高。按实现冗余的类型来分,通常冗余技术分为四类:结构冗余、信息冗余、时间冗余和冗余附加技术。 (1)结构冗余 结构冗余是最常用的冗余技术。按其工作方式,又有静态冗余、动态冗余和混合冗余三种。 静态冗余也叫被动冗余,通过冗余结果的表决和比较来屏蔽系统出现的错误。静态冗余常见的形式是三模冗余(TMR),其基本原理

29、是:系统输入通过3个功能相同的模块处理,将产生的3个结果送到多数表决器进行表决,即三中取二的原则,如果模块中有一个出错,而另外两个模块正常,则表决器的输出正确,从而可以屏蔽一个故障。,6.5 冗余编程及容错技术,第6章 程序编码,TMR的缺点是,如果3个模块的输出各不相同,则无法进行多数表决;若有两个模块出现一致的故障,则表决的结果会出现错误。,6.5 冗余编程及容错技术,第6章 程序编码,三模表决器的程序分析: 设模块1、2、3的输出分别为M1、M2、M3,则可能的输出结果有M1=M2=M3,M1=M2,M1=M3,M2=M3,M1M2M3。 程序如下: DO CASE CASE M1=M2

30、 OR M1=M3 ?M1 CASE M2=M3 ?M2 OTHERWISE ?“输出错误” ENDCASE 三模冗余可推广到N模冗余(NMR),其基本原理与TMR的原理相同,其中N3,且N为奇数,以便进行多数表决。,6.5 冗余编程及容错技术,第6章 程序编码,动态冗余是指系统连接一个参与工作的主模块,同时准备若干个备用模块,当系统检测到工作的主观模块出现故障时,就切换到一个备用的模块,当换上的备用模块又发生故障时,再切换到另一个备用模块,依次类推。,6.5 冗余编程及容错技术,第6章 程序编码,混合冗余是静态冗余和动态冗余的结合。通常有N个模块并行工作并进行多数表决,组成静态冗余,有M个模

31、块作为动态冗余中的备用模块,当参与表决的一个并行模块出现故障时就用一个备用模块来替换,以维持静态冗余系统的完整性。,6.5 冗余编程及容错技术,第6章 程序编码,(2)信息冗余 信息冗余是通过在数据中附加冗余的信息位来达到故障检测和容错的目的。通常情况下,附加的信息位越多,其检错纠错的能力就越强,但是这同时也增加了复杂度和难度。信息冗余最常见的有检错码和纠错码。检错码只能检查出错误的存在,不能改正错误,而纠错码能检查出错误并能纠正错误。常用的检错纠错码有奇偶校验码、海明码、循环码等。,6.5 冗余编程及容错技术,第6章 程序编码,(3)时间冗余 时间冗余的基本思想是:重复执行指令或者一段程序来

32、消除故障的影响,以达到容错的效果,它是用消耗时间来换取容错的目的。根据执行的是一条指令还是一段程序,分成两种方法: 一种是指令复执。当检测出故障的时候,重复执行故障指令,若故障是瞬时的,则在指令复执期间可能不会出现,程序就可以继续向前运行。 另一种是程序返(卷)回。它不是重复执行一条指令,而是重复执行一小段程序。在整段程序中可以设置多个恢复点,程序有错误的情况下可以从一个个恢复点处开始重复执行程序。首先检验一小段程序的计算结果,若结果出现错误则返回再重复执行这个部分,若一次返回不能解决,可以多次返回,直到故障消除。,6.5 冗余编程及容错技术,第6章 程序编码,(4)冗余附加技术 冗余技术实际

33、上是对硬件、程序、指令、数据等资源进行的冗余储备,所有这些冗余资源和技术统称为冗余附加技术。按不同的容错目的,实现冗余附加技术的侧重点不同。 以屏蔽硬件错误为目的的冗余附加技术包括: 关键程序和数据的冗余存储和调用; 检测、表决、切换、重构、纠错和复算的实现。 屏蔽软件错误的冗余附加技术包括: 各自独立设计的功能相同的冗余备份程序的存储及调用; 错误检测程序及错误恢复程序; 为实现容错软件所需的固化程序。,6.5 冗余编程及容错技术,第6章 程序编码,3.容错软件的设计过程 容错系统设计过程如图所示:,6.5 冗余编程及容错技术,第6章 程序编码,容错系统设计过程,容错系统的设计过程如下: (

34、1)首先要按设计任务要求进行常规设计,尽量保证设计结果正确,不能把希望寄托在容错上。 (2)根据系统的工作环境对可能出现的错误分类,确定实现容错的范围。例如,对于硬件的瞬时错误可以采用指令复执或程序复算;对于永久性错误,则采用备份替换或系统重构方式。对于软件来说,只有最大限度地弄清发生错误的原因和规律,才能正确地判断和分类,实现成功容错。 (3)按照“成本-效益”最优的原则,选用某种冗余手段(结构、信息、时间)来实现对各类错误的屏蔽。 (4)分析验证上述冗余结构的容错效果。如果没有达到预期效果,则应重新进行冗余设计,直到冗余效果满意为止。,6.5 冗余编程及容错技术,第6章 程序编码,2019

35、/6/4 66,结束,返回,6.6 程序复杂性度量,程序复杂性主要指模块内程序的复杂性。它直接关系到软件开发费用的多少,开发周期的长短和软件内部错误的多少。 程序复杂性度量的参数主要有:规模:程序指令条数或源程序行数难度:与程序操作数和操作符有关的度量结构:与程序分支数有关的度量智能度:算法的难易程度,第6章 程序编码,2019/6/4 67,结束,返回,1.代码行度量法,度量程序的复杂性,最简单的方法就是统计程序的源代码行数。 此方法基于两个前提:程序复杂性随着程序规模的增加,不均衡地增长;控制程序规模的方法最好采用分而治之的办法。将一个大程序分解成若干个简单的可理解的程序段。,6.6 程序

36、复杂性度量,第6章 程序编码,2019/6/4 68,结束,返回,方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。若设每行代码的出错率为每100行源程序中可能有的错误数目,例如每行代码的出错率为1,则是指每100行源程序中可能有一个错误。 程序出错率的估算范围是从0.04-7之间。对于少于100个语句的小程序,源代码行数与出错率是线性相关的。随着程序的增大,出错率以非线性方式增长。,6.6 程序复杂性度量,第6章 程序编码,代码行估算技术 为了使程序规模的估计值更接近实际值,可以由多名软件工程师分别作出估计,每个人都估计代码行的最小值(a)、最大值(b)和最

37、可能值(m),分别算出这3种规模的平均值( )、( )、( ),再用下式计算程序代码行的估计值:,6.6 程序复杂性度量,第6章 程序编码,2019/6/4 70,结束,返回,McCabe度量法,又称环路复杂性度量,是一种基于程序控制流的复杂性度量方法。 它基于一个程序模块的程序图中环路的个数,因此计算它先要画出程序图。 程序图是退化的程序流程图。流程图中每个处理都退化成一个结点,流线变成连接不同结点的有向弧。,6.6 程序复杂性度量,第6章 程序编码,2.McCabe度量法,2019/6/4 71,结束,返回,程序流程图导出的程序图,第6章 程序编码,2019/6/4 72,结束,返回,程序

38、图仅描述程序内部的控制流程,完全不表现对数据的具体操作,以及分支和循环的具体条件。 计算环路复杂性的方法:在一个有向图G中,环路的个数由以下公式给出: V(G)mn2 其中,V(G)是有向图G中环路个数,m是图G中弧数,n是图G中结点数。 如上图:V(G)=12-11+2=3也可用 V(G)=P+1或V(G)等于程序图中有界封闭区和无界封闭区的总个数。 其中,P为判定点个数。,6.6 程序复杂性度量,第6章 程序编码,2019/6/4 73,结束,返回,环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目增加时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。 McCabe环路复杂度隐含的前提是:错误与程序的判定加上子程序的调用数目成正比。 环路复杂度是可加的。 McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。,6.6 程序复杂性度量,第6章 程序编码,2019/6/4 74,结束,返回,这种度量的缺点是: 对于不同种类的控制流的复杂性不能区分 简单IF语句与循环语句的复杂性同等看待 嵌套IF语句与简单CASE语句的复杂性是一样的 模块间接口当成一个简单分支一样处理 一个具有1000行的顺序程序与一行语句的复杂性相同,6.6 程序复杂性度量,第6章 程序编码,课后练习 1.综合练习七(P171) 2.补充练习:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报