软件工程第五章 编码编码风格和程序复杂性_第1页
软件工程第五章 编码编码风格和程序复杂性_第2页
软件工程第五章 编码编码风格和程序复杂性_第3页
软件工程第五章 编码编码风格和程序复杂性_第4页
软件工程第五章 编码编码风格和程序复杂性_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

软件工程第5讲

编码

、编码风格和程序复杂性第5讲

编码

、编码风格和程序复杂性5.1编码的目的和任务5.2编码风格5.3程序复杂性度量5.1编码的目的n

目的¨

把模块的过程性描述翻译为用选定的程序设计语言书写的源程序(源代码)。n

依据¨

编码的主要依据是概要设计和详细设计说明文档。n

任务Ø

理解概要设计和详细设计说明书;Ø

遵循编码原则和风格进行翻译,形成源代码。编码模块的过程性描述源程序(不可执行的)(可执行的)n

编码中的问题Ø

编码中产生的问题大多数是由于设计的错误或缺陷引起的,程序的质量首先取决于设计的质量。但编码仍然对程序的可靠性、可读性、可测试性、可维护性、执行效率产生深远的影响。Ø

编码产生的源程序应该是正确、可靠,简明清晰,运行效率高。但是,保持程序的清晰就可能会降低程序的效率。Ø

编码与选择的程序设计语言/工具有密切的关系。5.2编码风格Ø

编码风格

(

程序设计风格

ProStyle)Ø

程序员习惯使用的编码方式。Ø

好的编码风格可以使编写的程序更容易阅读、更容易修改。Ø

早期的编码风格强调效率第一、占用内存少、包含的功能多。Ø

现在的编码风格则强调“清晰第一,效率第二”。Ø

现在的编码风格主要以可理解性、可修改性、可测试性为主要目标。n

主要的编码风格Ø

有意义的命名Ø

清晰的表达式Ø

使用标准的控制结构Ø

限制使用GOTO语句Ø

清晰与效率Ø

实现源程序的文档化Ø

输入/输出(1)有意义的命名Ø

一个名字用于标识这个对象时,应该带着说明其用途的一些信息。它应该是非形式的、简练的、容易记忆的,如果可能的话,最好是能够拼读的。Ø

全局变量/局部变量Ø

函数/过程(可采用名词或动宾结构)Ø

常量Ø

文件名/文件夹Ø

例如在C++中类的成员有如Ø

例如C语言中的名字命名下定义:Ø

#defineMAXLENTH80Ø

#defineSTEP10classCTestViewØ

char

*strcpy(char*str1,char*str2){前缀“m_”表示是成员变量,用“g_”表示全局变量。Ø

int

search(char

s[],charc)private:int

m_iCounter;public:Ø

voidpreorder(treenode*root)“i”表示整数数据类型void

GetCounter(){returniCounter;}Ø

文件名如,studentlist}动宾结构(2)清晰的表达式#include

<stdio.h>#include

<math.h>void

main()Ø

清晰、简单地表达意图{floata,b,c,x,y,z,s,area;scanf("%f,%f,%f",&a,&b,&c);x=a+b;y=a+c;z=b+c;if(x>c&&y>b&&z>a){

s=(a+b+c)/2;Ø

例,用C语言编程计算三角形的面积

:根据数学知识,若三直边a、b、c构成三角形,则必须满足条件:任意两边的之和大于第三边。area=sqrt(s*(s-a)*(s-b)*(s-c));printf("%f\n",area);}Ø

可以变为#include

<stdio.h>#include

<math.h>void

main(){floata,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){

s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("%f\n",area);}(3)使用标准的控制结构Ø

遵循单入口、单出口原则。Ø

采用结构化程序设计所允许的基本控制结构。Øifc

thens;Øifc

thens1elses2;ØWhile(c)do{

s};Øswitch(i){cases1:……ØDo{

s}while(c);cases2:}Øfor(i=n;i<m;i++){s}Ø例

把非结构化程序改为结构化程序。非结构化:While(

p

)

do结构化:flag=true;While(

p

andflag)

do{{g;g;if(notq

)thenflag=false;if(notq)thengotol;}}……l:……开始Ø问题思考:falsepØ通过这个例子,同学们是否可以把二重循环或三重循环的这类结构转换为结构化的?gqfalse结束Ø

提倡从深层次循环中退出(4)限制使用GOTO语句whilec1do{s11;Ø

不允许转上,但可以转下whilec2do{s21;whilec3do{s31;ifc4gotolabel;s32;}s22;}s12;}label:……问题思考:这类结构如何向结构化转换?Ø

goto语句的另外一种用法:转向出错处理。下例是一个堆栈的进栈操作,堆栈的最大容量是100。intpush(floatfitem,intindex,float[]stack){intiFlag=0;if(index>=100)goto10;index++;stack[index]=fitem;returniFlag;10:iFlag=1;returniFlag;}注:本例可以用IF-THEN-ELSE结构进行描述,但本例对于堆栈满的处理更为醒目。(5)清晰与效率的指导原则Ø

先使程序正确,再提高运行速度;Ø

使程序清楚,再使其快速;(6)实现源程序的文档化Ø“软件=程序+文档”有了详尽的文档,即使没有源程序,也能再现该软件。注释是文档化的一部分。Ø文档化包括以下内容:Ø

使用有意义的变量名、标号(前已述)Ø

适当的注释Ø

别为每一条语句注释Ø

注释应该与程序保持一致Ø

注释数据布局Ø

采用缩格方式排列程序结构Ø

适当使用空格或圆括号等做隔离符Ø

2种重要的注释:Ø

序言性注释:模块首部有关模块的功能说明界面描述:ØØØ

该模块被调用的语句格式;Ø

所有参数的解释;Ø

该模块需要调用的模块等;Ø

一些重要变量的使用、限制等Ø

开发历史,如Ø

作者、日期Ø

复查者、复查日期Ø

修改者、修改日期Ø

相关叙述等Ø

描述行注释Ø

功能性描述:程序段的功能说明,放在段首;状态性的描述:说明数据的状态,放在段尾。ØØ例

序言性注释///////////////////////////////////////////////////SetGraphicValue()的作用是设置当前图片的属性//fSdWendu

设定的温度//fSdShidu

设定的湿度///StartTime

代表整个图的起始时间//TableTimeSpan

代表一帧图象的时间跨度//bProgram

代表当前图片是否用于编辑程序///////////////////////////////////////////////////void

SetGraphicValue(float

fSdWendu,float

fSdShidu,CPointYValue,time_t

StartTime,time_t

TableTimeSpan,BOOL

bProgram){…………

}Ø例

PSP(PersonalSoftwareProcess

)建议的C++编码标准

(1)Ø例

PSP建议的C++编码标准

(2)Ø例

PSP建议的C++编码标准(3)(7)I/O风格Ø

绝大多数计算机系统都是人-机交互系统,故界面友善是十分重要的。Ø输入方面:Ø

对输入数据进行有效性检验Ø

输入格式力求简单、一致Ø

给用户足够多的提示信息Ø

组合检验时消除似是而非的选择Ø输出方面:Ø

给输出数据必要的说明Ø

报表、报告具有良好的格式Ø

能提供“在线”帮助]5.3程序复杂性度量程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。定量度量程序的复杂性是很有用的方法。Ø

HalsteadØ

McCabeØ

交叉复杂度Ø

HalsteadØ

n

程序中出现的不同的运算符的个数1Ø

n

程序中出现的不同的运算对象的个数2Ø

N

程序中出现的运算符总个数1Ø

N

程序中出现的运算对象总个数2Ø

程序长度N=

N

+N21Ø

估计程序长度N

=n

logn

+n

logn0

11

22估计错误数E=Nlog

(n

+n

)/30002

1

2预测的程序长度:N

=n1·log2n1+n2·log2n2=10·log210+7·log27=52.870实际的程序长度:N=N1+N2=28+22=50Ø

McCabe环域复杂度McCabe度量法是一种基于程序控制流的复杂性度量方法,它基于一个程序模块的程序图中环路的个数。Ø

计算方法Ø

V(G)=M-N+2PØ

M有向图G中的弧数(注:M不含附加弧)Ø

N有向图G中的结点数Ø

P有向图G中分离部分的数目。Ø

正常情况,程序图是连通的但不是强连通的。Ø

但可加一条弧从结束处连到开始处,可使程序图构成强连通图,此时,

P=1。可有Ø

V(G)=M-N+P(

(注:M含附加弧)=M-N+1=判定结点数+1Ø

例McCabe计算方法“求一个有n个元素的数组中的最Ø大者”的算法。用伪语言描述:STARTINPUTn;INPUTa(i)(i=1,2,…,n);max=a(1);FOR

i=2TOn,DOIFmax<a(i)THENmax=a(i);PRINTmaxENDV(G)=M-N+1=11-9+1Ø=3=判定结点数+1=2+1=3n

McCabe建议,对于复杂度超过10的程序,应分成几个

温馨提示

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

评论

0/150

提交评论