您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 软件工程第五章编码-、编码风格和程序复杂性
软件工程第5讲编码、编码风格和程序复杂性第5讲编码、编码风格和程序复杂性5.1编码的目的和任务5.2编码风格5.3程序复杂性度量5.1编码的目的目的把模块的过程性描述翻译为用选定的程序设计语言书写的源程序(源代码)。依据编码的主要依据是概要设计和详细设计说明文档。任务理解概要设计和详细设计说明书;遵循编码原则和风格进行翻译,形成源代码。模块的过程性描述源程序(不可执行的)(可执行的)编码编码中的问题编码中产生的问题大多数是由于设计的错误或缺陷引起的,程序的质量首先取决于设计的质量。但编码仍然对程序的可靠性、可读性、可测试性、可维护性、执行效率产生深远的影响。编码产生的源程序应该是正确、可靠,简明清晰,运行效率高。但是,保持程序的清晰就可能会降低程序的效率。编码与选择的程序设计语言/工具有密切的关系。5.2编码风格编码风格(程序设计风格ProgrammingStyle)程序员习惯使用的编码方式。好的编码风格可以使编写的程序更容易阅读、更容易修改。早期的编码风格强调效率第一、占用内存少、包含的功能多。现在的编码风格则强调“清晰第一,效率第二”。现在的编码风格主要以可理解性、可修改性、可测试性为主要目标。主要的编码风格有意义的命名清晰的表达式使用标准的控制结构限制使用GOTO语句清晰与效率实现源程序的文档化输入/输出(1)有意义的命名一个名字用于标识这个对象时,应该带着说明其用途的一些信息。它应该是非形式的、简练的、容易记忆的,如果可能的话,最好是能够拼读的。全局变量/局部变量函数/过程(可采用名词或动宾结构)常量文件名/文件夹例如在C++中类的成员有如下定义:classCTestView{private:intm_iCounter;public:voidGetCounter(){returniCounter;}}前缀“m_”表示是成员变量,用“g_”表示全局变量。“i”表示整数数据类型动宾结构例如C语言中的名字命名#defineMAXLENTH80#defineSTEP10char*strcpy(char*str1,char*str2)intsearch(chars[],charc)voidpreorder(treenode*root)文件名如,studentlist(2)清晰的表达式清晰、简单地表达意图例,用C语言编程计算三角形的面积:根据数学知识,若三直边a、b、c构成三角形,则必须满足条件:任意两边的之和大于第三边。#includestdio.h#includemath.hvoidmain(){floata,b,c,s,area;scanf(%f,%f,%f,&a,&b,&c);if(a+bc&&a+cb&&b+ca){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(%f\n,area);}#includestdio.h#includemath.hvoidmain(){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(xc&&yb&&za){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf(%f\n,area);}可以变为(3)使用标准的控制结构遵循单入口、单出口原则。采用结构化程序设计所允许的基本控制结构。ifcthens;ifcthens1elses2;switch(i){cases1:……cases2:}While(c)do{s};Do{s}while(c);for(i=n;im;i++){s}例把非结构化程序改为结构化程序。非结构化:While(p)do{g;if(notq)thengotol;}l:……开始结束pgqfalsefalse结构化:flag=true;While(pandflag)do{g;if(notq)thenflag=false;}……问题思考:通过这个例子,同学们是否可以把二重循环或三重循环的这类结构转换为结构化的?不允许转上,但可以转下(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代表当前图片是否用于编辑程序///////////////////////////////////////////////////voidSetGraphicValue(floatfSdWendu,floatfSdShidu,CPointYValue,time_tStartTime,time_tTableTimeSpan,BOOLbProgram){…………}PSP建议的C++编码标准例PSP(PersonalSoftwareProcess)建议的C++编码标准(1)例PSP建议的C++编码标准(2)例PSP建议的C++编码标准(3)(7)I/O风格绝大多数计算机系统都是人-机交互系统,故界面友善是十分重要的。输入方面:对输入数据进行有效性检验输入格式力求简单、一致给用户足够多的提示信息组合检验时消除似是而非的选择输出方面:给输出数据必要的说明报表、报告具有良好的格式能提供“在线”帮助]5.3程序复杂性度量程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。定量度量程序的复杂性是很有用的方法。HalsteadMcCabe交叉复杂度Halsteadn1程序中出现的不同的运算符的个数n2程序中出现的不同的运算对象的个数N1程序中出现的运算符总个数N2程序中出现的运算对象总个数程序长度N=N1+N2估计程序长度N0=n1logn1+n2logn2估计错误数E=Nlog2(n1+n2)/3000预测的程序长度:N0=n1·log2n1+n2·log2n2=10·log210+7·log27=52.87实际的程序长度:N=N1+N2=28+22=50McCabe环域复杂度McCabe度量法是一种基于程序控制流的复杂性度量方法,它基于一个程序模块的程序图中环路的个数。计算方法V(G)=M-N+2PM有向图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);FORi=2TOn,DOIFmaxa(i)THENmax=a(i);PRINTmaxENDV(G)=M-N+1=11-9+1=3=判定结点数+1=2+1=3McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。Walsh用实例证实了这个建议的正确性。交叉复杂度即程序图中的弧数的交叉点数,但弧必须在一边出现。例交叉点数为3如果弧(边)出现在两边,则不能进行计算。此时,必须做适当的变换。本讲主要介绍了教材中的第8章的内容。补充了程序复杂性度量方法。语言对于编码有重要影响。编码风格的好坏对于程序质量有重要影响。本讲小结
本文标题:软件工程第五章编码-、编码风格和程序复杂性
链接地址:https://www.777doc.com/doc-7632280 .html