第1页:第6章实现 本节目录
- 第6章实现
- 6.1程序设计语言的分类
- 6.2程序设计语言的选择
- 6.3编码风格
- 6.4程序复杂度度量
- 6.5习题
第2页:第6章实现 本节目录
- 第6章实现
- 6.1程序设计语言的分类
- 6.2程序设计语言的选择
- 6.3编码风格
- 6.4程序复杂度度量
- 6.5习题
第3页:编码的目的
编码的目的:模块的过程性描述(不可执行的)源程序(可执行的)编码使用选定的程序设计语言,把模块的过程性描述翻译为用该语言书写的源程序(源代码)第6章实现
第4页:程序设计语言的(分类)
程序设计语言分类:面向机器语言机器语言;汇编语言高级语言通用语言;专用语言6.1程序设计语言的分类
第5页:面向机器语言——机器语言机器语言是计
面向机器语言——机器语言机器语言是计算机系统可以直接识别的程序设计语言。
机器语言程序中的每一条语句实际上就是一条二进制形式的指令代码,由操作码和操作数两部分组成。
由于机器语言难以记忆和使用,通常不用机器语言编写程序。
例:1011011000000000表示进行一次加法操作;1011010100000000表示进行一次减法操作。
操作码地址码操作码6.1程序设计语言的分类
第6页:面向机器语言——汇编语言(符号语言)
面向机器语言——汇编语言(符号语言)汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
汇编语言程序必须通过汇编系统翻译成机器语言程序,才能在计算机上运行。
汇编语言与计算机硬件密切相关,其指令系统因机器型号的不同而不同。
由于汇编语言生产效率低且可维护性差,所以目前软件开发中很少使用汇编语言。
6.1程序设计语言的分类
第7页:高级语言——通用语言通用语言是指可用
- 高级语言——通用语言通用语言
- 是指可用于解决各类问题、可广泛应用于各个领域的程序设计语言。从较早出现的基础语言Basic、FORTRAN等,到后来出现的结构化语言Pascal、C等,再到现在被广泛使用的面向对象语言Visual C、Java等都属于通用语言的范畴。6.1程序设计语言的分类
第8页:高级语言——专用语言专用语言是为了解
高级语言——专用语言专用语言是为了解决某类特殊领域的问题而专门设计的具有独特语法形式的程序设计语言。
如专用于处理人工智能领域问题的LISP语言和PROLOG语言等。
这些语言的共同特点是可高效地解决本领域的各种问题,但难以应用于其他领域。
6.1程序设计语言的分类
第9页:第6章实现 本节目录
- 第6章实现
- 6.1程序设计语言的分类
- 6.2程序设计语言的选择
- 6.3编码风格
- 6.4程序复杂度度量
- 6.5习题
第10页:程序设计语言的选择
- 1.待开发软件的应用领域
- 2.用户的要求
- 3.软件的运行环境
- 4.软件开发人员的知识
- 5.软件的可移植性要求6.2程序设计语言的选择
第11页:第6章实现 本节目录
- 第6章实现
- 6.1程序设计语言的分类
- 6.2程序设计语言的选择
- 6.3编码风格
- 6.4程序复杂度度量
- 6.5习题
第12页:6.3 编码风格概述
- 编程风格编码风格
- 是指在不影响程序正确性和效率的前提下,有效编排和合理组织程序的基本原则。良好编码风格主要表现:可读性好、易测试、易维护。将从以下几方面来说明编码风格:程序内部文档、语句的构造及书写、输入/输出、效率。6.3编码风格
第13页:程序内部文档说明性注释信息包括标识符
6.3.1程序内部文档说明性注释信息包括标识符的选取、增加注解和好的程序布局。
6.3编码风格
第14页:标识符的命名及说明
- 1、标识符的命名及说明
- 选用具有实际含义的标识符;
- 为了便于程序的输入,标识符的名字不宜过长(≦8);
- 为了便于区分,不同的标识符不要取过于相似的名字;按照某种顺序分别对各种类型的变量进行集中说明;对同一类型的多个变量说明时,应按照变量名中的字母顺序排列。6.3编码风格
第15页:程序的注解序言性注释
2、程序的注解序言性注释:位于模块的首部,用于说明模块的相关信息。
主要包括:模块的功能、用途、界面、调用语句、参数及需调用的下级模块的清单等。
描述性注释:位于源程序模块内部,用于对某些难以理解的语句段的功能或某些重要的标识符的用途等进行说明。
3.程序的布局:阶梯式布局增加可读性6.3编码风格
第16页:语句的构造及书写语句构造
- 6.3.2语句的构造及书写语句构造:
- 语句应简单直接;
- 对复杂表达式应加上必要的括号使表达更加清晰;
- 尽量不使用否定的逻辑表示;
- 尽量少用强制转移语句,如goto语句;
- 避免使用大量循环/条件嵌套语句,重数不要过大;
- 尽可能地使用编译系统提供的标准函数。6.3编码风格
第17页:6.3.2 语句的构造及书写
- 语句书写:
- 虽然许多语言都允许在一行上书写多个语句,但为了程序看起来更加清楚,最好在一行上只书写一条语句。
- 在书写语句时,应通过采用递缩式格式使程序的层次更加清晰。
- 在模块之间通过加入空行进行分隔。
- 为了便于区分程序中的注释,最好在注释段的周围加上边框。6.3编码风格
第18页:输入/输出输入、输出的方式往往是用户
6.3.3输入/输出输入、输出的方式往往是用户衡量程序好坏的重要指标。
为了使程序的输入、输出能便于用户的使用,在编写程序时应对输入和输出的设计格外注意。
6.3编码风格
第19页:6.3.3 输入/输出设计
- 输入设计:
- (1)输入方式力求简单,避免给用户带来不必要的麻烦。如:尽可能采用简单的输入格式、尽可能减少用户的输入量。
- (2)交互式输入数据时应有必要的提示信息。
- (3)程序应对输入数据的合法性进行检查。
- (4)若用户输入某些数据后可能会产生严重后果,应给用户输出必要的提示并在必要的时候要求用户确认。
- (5)当需要输入一批数据时,不要以记数方式控制数据的输入个数,而应以特殊标记作为数据输入结束的标志。
- (6)应根据系统的特点和用户的习惯设计出令用户满意的输入方式。6.3编码风格
第20页:6.3.3 输入/输出设计
- 输出设计:用户需要通过程序的输出来获取加工的结果。为了使用户能够清楚地看到需要的结果,设计数据输出方式时应注意以下几点:
- (1)输出数据的格式应清晰、美观,设计良好的输出报表。如,对大量数据采用表格的形式输出,可以使用户一目了然。
- (2)输出数据时要加上必要的提示信息。例如,表格的输出一定要带有表头,用以说明表格中各项数据的含义。6.3编码风格
第21页:效率是属于性能的要求
- 6.3编码风格6.3.4效率效率主要是指处理机工作时间和内存容量这两方面的利用率。关于程序效率问题应该记住下面3条原则:
- (1)效率是属于性能的要求,因此应该在软件需求分析阶段确定效率方面的要求。
- (2)良好的设计可以提高效率。
- (3)提高程序的效率要与好的编码风格保持一致,不应该一味追求程序的效率而牺牲程序的清晰性和可读性。
第22页:第6章实现 本节目录
- 第6章实现
- 6.1程序设计语言的分类
- 6.2程序设计语言的选择
- 6.3编码风格
- 6.4程序复杂度度量
- 6.5习题
第23页:程序复杂度度量
- 6.4程序复杂度度量定量度量程序复杂程度的价值在于:
- 估算软件中错误数及开发软件的工作量;
- 比较两个不同的设计或两个不同算法的优劣;
- 作为模块规模的精确限度。下面将着重介绍常用的两种方法:McCabe方法和Halstead方法。
第24页:McCabe(麦坎比)方法6.4程序
6.4.1 McCabe(麦坎比)方法6.4程序复杂度度量Tom J. McCabe数学思维和软件工程思维的结合并非偶然。
对于圈复杂度测试方法,我认为其属于数学范畴,这一方法创立的灵感来自于数学中的图论。
对一切可操作的事物都要先进行量化才能进行管理的思想,正是数学带给我们的礼物。
McCabe & Associates公司创始人、CEO及董事会主席、McCabe圈复杂度的始创者。
第25页:McCabe方法环形复杂度
- 6.4.1McCabe方法环形复杂度
- 根据程序控制流的复杂程度定量度量程序的复杂程度,可得到环形复杂度。流图:也称“程序图”,即“退化了的”程序流程图,仅描绘程序的控制流图,不表现对数据的操作及分支或循环条件。圆:称为结点,代表程序流程图中的一条或多条语句。边:流图中的箭头线,代表控制流,边必须终止于结点。区域:边和结点围成的面积。6.4程序复杂度度量
第26页:McCabe方法程序流程图——〉流图
- 6.4.1McCabe方法程序流程图——〉流图
- 相连的一个顺序处理框和一个判定框可映射为一个结点;
- 程序流程图中的复合条件分解,每个简单条件对应流图中一个结点。
- 呈顺序结构的一个或多个处理框,对应流图中的一个结点。6.4程序复杂度度量
第27页:程序复杂度度量
6.4程序复杂度度量
第28页:环形复杂度的计算方法
- 环形复杂度的计算方法:环形复杂度V(G):定量度量程序的逻辑复杂度
- (1)流图中的区域数等于环形复杂度。
- (2)V(G)=E–N+ 2。E:边数;N:结点数
- (3)V(G)=P+ 1。P:流图中的判定结点数6.4程序复杂度度量
第29页:程序复杂度度量
举例:计算下列流图的环形复杂度。
6.4程序复杂度度量
第30页:程序复杂度度量acbdegfh
举例:计算下列流图的环形复杂度。
6.4程序复杂度度量acbdegfh
第31页:环形复杂度的用途
- 环形复杂度的用途:
- (1)对测试难度的一种定量度量;
- (2)对软件可靠性给出预测。模块规模以V(G)≦10为宜,否则应将程序分解成几个小程序,以减少程序错误。V(G)=10是模块规模的一个更科学更精确的上限。6.4程序复杂度度量
第32页:6.4.1 McCabe方法
- 几点说明:
- 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目增加时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
- 环路复杂度是可加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。6.4程序复杂度度量
第33页:McCabe度量方法的缺点
- McCabe度量方法的缺点:
- 对于不同种类的控制流的复杂性不能区分
- 简单IF语句与循环语句的复杂性同等看待
- 嵌套IF语句与简单CASE语句的复杂性是一样的
- 模块间接口当成一个简单分支一样处理
- 认为一个具有1000行的顺序程序与一行语句的复杂性相同6.4程序复杂度度量
第34页:Halstead方法——文本复杂度度
6.4.2 Halstead方法——文本复杂度度量根据程序中运算符和操作数的总数来度量程序的复杂程度。
程序长度计算公式:N=N1+N2其中,N1为程序中运算符的出现次数;N2为程序中操作数出现的总次数;N为程序长度。
6.4程序复杂度度量
第35页:Halstead方法给出的程序长度预
Halstead方法给出的程序长度预测公式:多次验证表明,预测长度H与实际长度N非常接近。
Halstead方法给出的错误个数预测公式:6.4程序复杂度度量
第36页:程序复杂度度量
举例:下面列出的代码用于重复执行的加法来计算两个正整数X和Y的乘积,请用Halstead方法预测程序长度,并将其与实际长度相比较。
Z=0;while X>0Z=Z+Y;X=X-1;end while;print(Z);6.4程序复杂度度量
第37页:本章结束页
The End