您好,欢迎访问三七文档
软件工程1第七章软件实现软件工程课件软件工程2第七章软件实现7.1软件实现的过程与任务7.2程序设计方法概述7.3编程风格与编码标准7.4编程语言7.5程序效率与性能分析7.6程序复杂性软件工程3做为软件工程过程的一个阶段,软件实现是软件设计的继续。实际上,程序编码就是将软件设计的结果翻译成为用某种程序设计语言描述的源代码。其中涉及到方法、工具和过程。然而,在实现中所遇到的问题,例如,编程语言的特性和程序设计风格会深刻地影响软件的质量和可维护性。本章不是具体介绍如何编写程序,而是从软件工程这个更广泛的范围去讨论与编程语言及程序编码有关的问题。软件工程47.1软件实现的过程与任务软件实现阶段也称为程序编码阶段,通常包括编程实现和单元测试。本章只讲编程实现。软件实现是软件产品由概念到实体的一个关键过程,它将详细设计的结果翻译成用某种程序设计语言编写的并且最终可以运行的程序代码。虽然软件的质量取决于软件设计,但是规范的程序设计风格将会对后期的软件维护带来不可忽视的影响。软件实现的过程如图:软件工程5软件实现的过程首先,开发人员需要正确理解用户需求和软件设计模型,补充一些遗漏的详细设计,进一步设计程序代码的结构,并自行检查设计结果;接下来,根据程序设计结果和编码规范等编写代码,在单元测试过程,检查和记录程序代码中可能的缺陷和错误,通过程序调试,对缺陷和错误定位和改正。软件工程6程序编码活动的依据是软件详细设计说明,它给出程序模块的实现逻辑和处理规则,还有为实现模块功能所需的算法和算法分析的结果,以及为配合算法实现所必须的局部数据结构。程序编码活动的工作制品是源程序、目标程序和用户指南。根据系统的类型。根据软件开发方法,程序编码可采用相应的编程语言来实现。软件实现与软件设计、软件测试密不可分。软件设计为软件实现提供输入,软件实现的输出是软件测试的输入。软件工程7尽管软件设计和软件测试是独立的过程,但软件实现本身也涉及设计和测试工作,它们之间的界限视具体项目而定。软件实现还会产生大量软件配置项,如源文件、测试用例等,因此软件实现还涉及配置管理。按照现代软件开发过程的要求,软件需求分析、设计、实现、测试等活动贯穿于每一个软件开发周期,多个开发周期迭代实施,构成一个完整的开发过程。因此软件实现与其他软件工程活动交织在一起,不能完全孤立地执行。软件工程87.2程序设计方法概述为了保证程序编码的质量,程序员必须深刻地理解、熟练地掌握并正确地运用编程语言的特性。只有语法上没有错误的程序才能通过编译系统的语法检查。然而,软件工程项目对代码编写的要求,绝不仅仅是源程序语法上的正确性,也不只是源程序中没有各种错误,还要求源程序具有良好的结构性和良好的程序设计风格。软件工程9结构化程序设计结构化程序设计技术主要包括两个方面:在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开。在编写程序时强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。尽可能避免使用会使程序质量受到影响的GOTO语句。软件工程10以自顶向下逐步求精的方式编写程序采取自顶向下,逐步细化的方法,把模块功能逐步分解,细化为一系列具体的步骤,进而翻译成一系列用某种编程语言写成的程序。用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序具有清晰的层次结构,程序容易阅读和理解。理想情况下把程序分解成树形结构。同一层的节点相互间没有关系,它们的细化工作相互独立。在任何一步发生错误,只影响它下层的节点。软件工程11每一步工作仅在上层节点的基础上做不多的设计扩展,这样有利于编程、检查、测试、集成和修改。逐步细化软件工程12例如,用筛选法求100以内的素数筛选法就是从2到100中去掉2,3,…,9,10的倍数,剩下的就是100以内的素数。为了解决这个问题,可先按程序功能写出一个框架。main(){//程序框架建立2到100的数组A[],其中A[i]=i;-----1建立2到10的素数表B[],其中存放2到10以内的素数;------------------------2若A[i]=i是B[]中任一数的倍数,则剔除A[i];----------------------------------3软件工程13输出A[]中所有没有被剔除的数;---------4}再细化框架中每条语句main(){/*建立2到100的数组A[],其中A[i]=i*/for(i=2;i=100;i++)A[i]=i;/*建立2到10的素数表B[],其中存放2到10以内的素数*/B[1]=2;B[2]=3;B[3]=5;B[4]=7;/*若A[i]=i是B[]中任一数的倍数,则剔除A[i]*/软件工程14for(j=1;j=4;j++)检查A[]所有的数能否被B[j]整除并将能被整除的数从A[]中剔除;----------3.1/*输出A[]中所有没有被剔除的数*/for(i=2;i=100;i++)若A[i]没有被剔除,则输出之----------4.1}对框架中的局部再做细化,得到整个程序。main(){/*建立2到100的数组A[],其中A[i]=i*/for(i=2;i=100;i++)A[i]=i;软件工程15/*建立2到10的素数表B[],其中存放2到10以内的素数*/B[1]=2;B[2]=3;B[3]=5;B[4]=7;/*若A[i]=i是B[]中任一数的倍数,则剔除A[i]*/for(j=1;j=4;j++)/*检查A[]所有的数能否被B[j]整除并将能被整除的数从A[]中剔除*/for(i=2;i=100;i++)if(A[i]!=0&&A[i]/B[j]*B[j]==A[i])A[i]=0;软件工程16/*输出A[]中所有没有被剔除的数*/for(i=2;i=100;i++)/*若A[i]没有被剔除,则输出之*/if(A[i]!=0)printf(“A[%d]=%d\n”,i,A[i]);}自顶向下,逐步求精方法符合人们解决复杂问题的普遍规律。用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发,成功率和生产率都很高。软件工程17使用基本控制结构构造程序(1)使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。(2)选用的控制结构只准许有一个入口和一个出口。(3)程序语句组成容易识别的块(Block),每块只有一个入口和一个出口。(4)复杂结构应该用基本控制结构进行组合嵌套来实现。(5)语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致。软件工程18(6)严格控制GOTO语句,仅在下列情形才可使用:用一个非结构化的编程语言去实现一个结构化的构造。在某种可以改善而不是损害程序可读性的情况下。例1打印A,B,C三数中最小者程序AB?BC?AC?打印C打印B打印AFFFTTT软件工程19if(AB)goto120;if(BC)goto110;100write(C);goto140;110write(B);goto140;120if(AC)goto130;goto100;130write(A);140end程序1:输出A、B和C中最小值软件工程20使用if_then_else结构化构造,则程序1可改成如下形式。if(AB)and(AC)write(A)elseif(AB)and(BC)write(B)elsewrite(C)例2:编写程序,用二分法求方程f(x)=0在区间[a..b]中的根。假设在闭区间[a..b]上函数f(x)有唯一的一个零点,此零点即为方程f(x)=0在区间[a..b]上的根,因此f(a)与f(b)的正负号相反。软件工程21f0=f(a);f1=f(b);if(f0*f1=0){x0=a;x1=b;abf(x)程序1:使用GOTO语句的求根程序软件工程22for(i=1;i=n;i++){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)eps||abs(x1-x0)eps)gotofinish;if(f0*fm0){x0=xm;f0=fm;}elsex1=xm;}finish:printf(“\nTherootofthisequationis%d\n”,xm);}软件工程23程序1是非结构化的程序,特点是单入口,两出口。正常出口是循环达到n次,非正常出口是循环中途用GOTO控制转出到标号finish所在位置。可读性好。f0=f(a);f1=f(b);if(f0*f1=0){x0=a;x1=b;程序2:用break转出循环的求根程序软件工程24for(i=1;i=n;i++){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)<eps||abs(x1-x0)<eps)break;if(f0*fm>0){x0=xm;f0=fm;}elsex1=xm;}printf(“\nTherootofthisequationis%d\n”,xm);}软件工程25程序2仍然是非结构化程序,特点是:单入口,两出口。正常出口是循环达到n次,非正常出口是循环中途满足某种条件通过break控制转出到循环后面。可读性好。f0=f(a);f1=f(b);if(f0*f1=0){x0=a;x1=b;i=1;finished=0;程序3:无GOTO的求根程序软件工程26while(i=n&&!finished){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)<eps||abs(x1-x0)<eps)finished=1;if(!finished)if(f0*fm>0){x0=xm;f0=fm;}elsex1=xm;i++;}printf(“\nTherootofthisequationis%d\n”,xm);}软件工程27程序3是结构化程序,引入布尔变量finished,改for型循环为while型,将单入口多出口结构改为单入口单出口结构。在传统的程序设计中把模块看成是黑箱,它接受给定的输入,进行需要的处理,最后产生规定的输出。这种模块是面向处理的,通常数据和处理是分开的。它是用户习惯或者熟悉的方法。面向对象的程序设计方法软件工程28在面向对象的程序设计中,数据和操作数据的算法不再分离,它们被封装在一起,构成对象,其他的对象可以使用这个对象所提供的服务。面向对象程序设计方法的特点是封装、泛化、多态、协同和复用。1.封装按照抽象数据类型的要求,对象把数据和相应操作封装在其内部,通过定义在接口上的操作访问。例如,用C++定义的类的实例,所有的数据软件工程29成员和成员函数都规定了三种访问权限:属于Private的只有该类的实例才能访问;属于Protected的只有该类的实例和子类的实例才能访问,对于外界其他操作禁止访问;属于Public的才可供任何外界的操作访问,在其属下的操作构成该类实例的接口。2.泛化泛化关系给出了一种类间的共享(继承)关系。子类可以共享父类的Public和Protectede数据和操作。从另一个角度看,子类可以是父类的一种实现方式。软件工程30例如,线性表抽象基类(父类)只列出了外界可使用的操作,但没有给出这些操作的实现,它的实现放在子类中。抽象基类可以看作是某对象的使用接口,而对象的实现由其具体子类负责。例如线性表LinearList有两种实现方式:顺序表和链表。因此,可以设计线性表的顺序表具体子类SeqList作为它的一种实现;还可以设计链表具体子类LinkedList作为它的另一种实现。软件工程313.多态多态是面向对象程序设计的一个亮点。多态有几种不同形式,Cardelli和Wegner把它分为4类:一般的多态包括参数多态和包含多态,特殊的多态包括过载多态和强制多态。参数多态是指把数据类型作为对象或函数的参数,比如T,对象和函数在使用时再代入适用的具体数据类型,并在所有的T处代换以真
本文标题:第07章 软件实现
链接地址:https://www.777doc.com/doc-3324029 .html