软件工程07.ppt
《软件工程07.ppt》由会员分享,可在线阅读,更多相关《软件工程07.ppt(68页珍藏版)》请在三一办公上搜索。
1、软件工程,1,第七章 软件实现,软件工程课件,软件工程,2,第七章 软件实现,7.1 软件实现的过程与任务7.2 程序设计方法概述7.3 编程风格与编码标准7.4 编程语言7.5 程序效率与性能分析 7.6 程序复杂性,软件工程,3,程序编码就是将软件设计的结果翻译成为用某种程序设计语言描述的源代码。其中涉及到方法、工具和过程。然而,在实现中所遇到的问题,例如,编程语言的特性和程序设计风格会深刻地影响软件的质量和可维护性。本章不是具体介绍如何编写程序,而是从软件工程这个更广泛的范围去讨论与编程语言及程序编码有关的问题。,软件工程,4,7.1 软件实现的过程与任务,软件实现阶段也称为程序编码阶段
2、,通常包括编程实现和单元测试。本章只讲编程实现。软件实现是软件产品由概念到实体的一个关键过程,它将详细设计的结果翻译成用某种程序设计语言编写的并且最终可以运行的程序代码。虽然软件的质量取决于软件设计,但是规范的程序设计风格将会对后期的软件维护带来不可忽视的影响。软件实现的过程如图:,软件工程,5,软件实现的过程,根据程序设计结果和编码规范等编写代码,在单元测试过程,检查和记录程序代码中可能的缺陷和错误,通过程序调试,对缺陷和错误定位和改正。编码的依据是软件详细设计说明,它给出程序模块的实现逻辑和处理规则、算法和算法分析的结果,以及为配合算法实现所必须的局部数据结构。程序编码活动的工作制品是源程
3、序、目标程序和用户指南。软件实现与软件设计、软件测试密不可分。软件设计为软件实现提供输入,软件实现的输出是软件测试的输入。软件实现还会产生大量软件配置项,如源文件、测试用例等,因此软件实现还涉及配置管理。按照现代软件开发过程的要求,软件实现与其他软件工程活动交织在一起,不能完全孤立地执行。,软件工程,6,7.2 程序设计方法概述,为了保证程序编码的质量,程序员必须深刻地理解、熟练地掌握并正确地运用编程语言的特性。只有语法上没有错误的程序才能通过编译系统的语法检查。然而,软件工程项目对代码编写的要求,绝不仅仅是源程序语法上的正确性,也不只是源程序中没有各种错误,还要求源程序具有良好的结构性和良好
4、的程序设计风格。,软件工程,7,结构化程序设计,结构化程序设计技术主要包括两个方面:在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开。在编写程序时强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。尽可能避免使用会使程序质量受到影响的GOTO语句。,软件工程,8,以自顶向下逐步求精的方式编写程序,采取自顶向下,逐步细化的方法,把模块功能逐步分解,细化为一系列具体的步骤,进而翻译成一系列用某种编程语言写成的程序。用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序具有清晰的层次结构,程序容易阅读和理解。把程序分解成树形结构。同一层的节点相互间没
5、有关系,它们的细化工作相互独立。在任何一步发生错误,只影响它下层的节点。,软件工程,9,for(int i=1;i100;i+)int n=0;for(int j=1;j=sqrt(i);j+)if(i%j=0)n+;if(n=1)System.out.print(i+);,求100以内的素数,软件工程,10,用筛选法求100以内的素数,筛选法就是从 2 到 100 中去掉 2,3,9,10 的倍数,剩下的就是100以内的素数。为了解决这个问题,可先按程序功能写出一个框架。main()/程序框架 建立2到100的数组A,其中Aii;-1 建立2到10的素数表 B,其中存放2 到10以内的素数;
6、-2 若Aii是B 中任一数的倍数,则 剔除Ai;-3 输出A 中所有没有被剔除的数;-4,软件工程,11,再细化框架中每条语句main()/*建立2到100的数组A,其中Aii*/for(i=2;i=100;i+)Ai=i;/*建立2到10的素数表B,其中存放2到10以内的素数*/B1=2;B2=3;B3=5;B4=7;/*若Aii是B 中任一数的倍数,则剔除Ai*/for(j=1;j=4;j+)检查A 所有的数能否被Bj整除并将 能被整除的数从A 中剔除;-3.1/*输出A 中所有没有被剔除的数*/for(i=2;i=100;i+)若Ai没有被剔除,则输出之-4.1,软件工程,12,对框架
7、中的局部再做细化,得到整个程序。main()/*建立2到100的数组A,其中Aii*/for(i=2;i=100;i+)Ai=i;/*建立2到10的素数表B,其中存放2到10以内的素数*/B1=2;B2=3;B3=5;B4=7;/*若Aii是B 中任一数的倍数,则剔除Ai*/for(j=1;j=4;j+)/*检查A 所有的数能否被Bj整除并将能被整除的数从A 中剔除*/for(i=2;i=100;i+)if(Ai!=0&AiBj*Bj=Ai)Ai=0;/*输出A 中所有没有被剔除的数*/for(i=2;i=100;i+)/*若Ai没有被剔除,则输出之*/if(Ai!=0)printf(“A%d
8、%dn”,i,Ai);,软件工程,13,自顶向下,逐步求精方法符合人们解决复杂问题的普遍规律。用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发,成功率和生产率都很高。,软件工程,14,使用基本控制结构构造程序,使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。选用的控制结构只准许有一个入口和一个出口。程序语句组成容易识别的块(Block),每块只有一个入口和一个出口。复杂结构应该用基本控制结构进行组合嵌套来实现。语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致。,软件工程,15,严格控制GOTO语句,仅在下列情形才可使用:用一个非结
9、构化的编程语言去实现一个结构化的构造。在某种可以改善而不是损害程序可读性的情况下。例1 打印A,B,C三数中最小者程序,软件工程,16,if(A B)goto 120;if(B C)goto 110;100 write(C);goto 140;110 write(B);goto 140;120 if(A C)goto 130;goto 100;130 write(A);140 end,程序1:输出A、B和C中最小值,软件工程,17,在面向对象的程序设计中,数据和操作数据的算法不再分离,它们被封装在一起,构成对象,其他的对象可以使用这个对象所提供的服务。面向对象程序设计方法的特点是封装、泛化、多
10、态、协同和复用。封装按照抽象数据类型的要求,对象把数据和相应操作封装在其内部,通过定义在接口上的操作访问。,面向对象的程序设计方法,软件工程,18,泛化泛化关系给出了一种类间的共享(继承)关系。子类可以共享父类的 Public 和 Protectede 数据和操作。从另一个角度看,子类可以是父类的一种实现方式。例如线性表 LinearList 有两种实现方式:顺序表和链表。因此,可以设计线性表的顺序表具体子类 SeqList 作为它的一种实现;还可以设计链表具体子类 LinkedList 作为它的另一种实现。,软件工程,19,多态多态是面向对象程序设计的一个亮点。多态有几种不同形式,包括参数多
11、态和包含多态,特殊的多态包括过载多态和强制多态。参数多态是指把数据类型作为对象或函数的参数,比如 T,对象和函数在使用时再代入适用的具体数据类型,并在所有的 T 处代换以真实的数据类型,在C+中称为模板。例如,若定义一个顺序表的每一元素的数据类型为T,把它作为顺序表类 SeqList 的参数放在以关键字 class 为先导的一对尖括号中:template/数据类型参数为Tclass SeqList:public LinearList;在使用程序时,也用一对尖括号代入实际数据类型,如int:/定义一个顺序表对象L SeqList L;/其数据类型为int,软件工程,20,协同协同是指一组对象通过
12、它们之间的协作来完成一个任务。这组对象间的协作包含了一个消息序列,亦称线程。在使用消息传递时需要仔细考虑消息序列中每个操作执行的前置条件和后置条件。例如,使用队列时,在进队列前要先保证队列非满,在出队列前要保证队列非空。但这样做,必须了解消息接收者对象的细节,有悖于实现与使用相分离的信息隐蔽原则。,软件工程,21,复用利用现成类来实现类,有 4 种方式:选择,分解,配置和演变。这是面向对象程序设计技术的一个重要优点。选择:从现成构件中简单地选择合乎需要的构件。这就是开发软件库的目的。一个OO开发环境应提供常用构件库,大多数语言环境都带有一个原始构件库(如整数、实数和字符),它是基础层。任一基本
13、构件库(如“基本数据结构”构件)都应建立在这些原始层上。(2)分解:最初标识的“类”常常是几个概念的组合。例如,链表类实际上是结点、链表、接口等的组合。在设计时,可能会发现所标识的操作落在分散的几个概念中,或者会发现,数据属性被分开放到模型中拆散概念形成的几个组内。这样我们必须把一个类分成几个类,希望新标识的类容易实现,或者它们已经存在。(3)配置:在实现类时,可能会要求由现成类的实例提供类的某些特性。通过把相应类的实例声明为新类的属性来配置新类。例如,一种仿真服务器可能要求使用一个计时器来跟踪服务时间。设计者不必开发在这个行为中所需的数据和操作,而是应当找到计时器类,并在服务器类的定义中声明
14、它。,软件工程,22,(4)演变:要开发的新类可能与一个现成类非常类似,但不完全相同。此时,不适宜采用“选择”操作,但可以从一个现成类演变成一个新类,可以利用泛化机制来表示一般特殊的关系。特殊化处理有三种可能的方式。a)由现成类建立子类:例如,现要建立一个新类“起重车”。它的许多属性和服务都在现成类“汽车”中,新类可视为现成类的特殊情形,直接让“起重车”类作为“汽车”类的派生类即可。,软件工程,23,b)由现成类建立新类:假设已经有“汽车”类,现要增加一个新类“拖拉机”。它的属性与服务有的与“汽车”类相同,有的与“汽车”类不同。可调整继承结构,建立一个新的抽象基类“车辆”,把“拖拉机”与“汽车
15、”类的共性放到“车辆”类中,“拖拉机”与“汽车”类都成为”类的派生类。“拖拉机”类相关的操作可调用“车辆”类定义的操作,由于“车辆”是抽象类,故系统可自动到“汽车”类去找。,车辆,软件工程,24,c)建立现成类的父类:若想在现成类的基础上加入新类,使得新类成为现成类的一般类。例如,已经存在“三角形”类,“四边形”类,想加入一个“多边形”类,并使之成为“三角形”和“四边形”类的一般类,,软件工程,25,7.3 编程风格与编码标准,程序设计风格或编程风格是指编程应遵循的原则。如果不注意编码风格就很难写出高质量的程序。尤其当多个程序员合作编写一个很大的程序时,更需要强调良好而一致的编码风格,以便相互
16、沟通,减少因不协调而引起的问题。现在有不少软件企业提出了编程规范,一些流行的编程语言也有了自己的编码标准,目的都是为了改进程序的编程风格,提高程序编写的质量。编程风格涉及源程序文档化、数据说明规范化、程序代码结构化、输入输出可视化等。,软件工程,26,源程序文档化,符号名的命名符号名即标识符,包括模块名、变量名、常量名、标号名、子程序名、数据区名以及缓冲区名等。这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等。名字不是越长越好,应当选择精炼的意义明确的名字。必要时可使用缩写名字,但这
17、时要注意缩写规则要一致,并且要给每一个名字加注释。同时,在一个程序中,一个变量只应用于一种用途。new.balance.accounts.payable/名字太长 nbalap/需加注释 N/?,软件工程,27,程序的注释夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。注释决不是可有可无的。一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多。注释分为序言性注释和功能性注释。,软件工程,28,序言性注释通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出
18、。有关项目包括:程序标题;有关本模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息;模块位置:在哪一个源文件中,或隶属于哪一个软件包;开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。,软件工程,29,(2)功能性注释功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。而不要解释下面怎么做。例如,/*add amount to total*/TOTAL=AMOUNTTOTAL不好。如果注明把月销售额计入年度总额,才能使读者理解了下面语句的意图:
19、/*add monthly-sales to annual-total*/TOTAL=AMOUNTTOTAL要点 描述一段程序,而不是每一个语句;用缩进和空行,使程序与注释容易区别;注释要正确。,软件工程,30,(3)空格、空行和移行恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。例如,将表达式(A17)ANDNOT(B49)ORC 写成(A17)AND NOT(B49)OR C自然的程序段之间可用空行隔开;移行也叫做向右缩格它是指程序中的各行不必都在左端对齐,都从第一格起排列。这样做使程序完全分不清层次关系。对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结
20、构更加清晰。例如,两重选择结构嵌套,写成下面的移行形式,层次就清楚得多。if()else endif,软件工程,31,数据说明规范化,在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需注意数据说明的风格。为了使程序中数据说明更易于理解和维护,必须注意以下几点。数据说明的次序应当规范化 说明语句中变量安排有序化 使用注释说明复杂数据结构,软件工程,32,数据说明的次序应当规范化数据说明次序规范化,使数据属性容易查找,也有利于测试,排错和维护。原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定。如在FORTRAN程序中
21、数据说明次序:常量说明 简单变量类型说明 数组说明 公用数据块说明 所有的文件说明在类型说明中还可进一步要求。如可按如下顺序排列:整型量说明 实型量说明 字符量说明 逻辑量说明,软件工程,33,说明语句中变量安排有序化当多个变量名在一个说明语句中说明时,应当对这些变量按字母的顺序排列。带标号的全程数据(如FORTRAN的公用块)也应当按字母的顺序排列。例如,把 integer size,length,width,cost,price写成 integer cost,length,price,size,width使用注释说明复杂数据结构如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这
22、个数据结构的固有特点。例如,对 C 的链表结构和用户自定义的数据类型,都应当在注释中做必要的补充说明。,软件工程,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:=
23、AI;AI:=WORK;END END;,程序代码结构化,软件工程,35,程序编写首先应当考虑清晰性程序编写首先应考虑清晰性,不要刻意追求技巧性,使程序显得过于紧凑。3、程序要能直截了当地说明程序员的用意,软件工程,36,程序编写得要简单,写清楚,直截了当地说明程序员的用意。例如,for(i=1;i=n;i+)for(j=1;j=n;j+)Vij(ij)*(ji),for(i1;i=n;i+)for(j1;j=n;j+)if(i=j)Vij1;else Vij0;,软件工程,37,除非对效率有特殊要求,程序编写要做到清晰第一,效率第二。首先要保证程序正确,然后才要求提高速度。反过来说,在使程序
24、高速运行时,首先要保证它是正确的。避免使用临时变量而使可读性下降。例如,有的程序员为了追求效率,往往喜欢把表达式 AI+1/AI 写成 XAI;YX+1/X;这样将一句分成两句写,会产生意想不到的问题。让编译程序做简单的优化尽可能使用库函数,软件工程,38,避免不必要的转移。同时如果能保持程序可读性,则不必用 GO TO语句。例如,有一个求三个数中最小值的程序:,if(X Y)goto 30 if(Y Z)goto 50 smallZ goto 7030 if(X Z)goto 60 smallZ goto 7050 smallY goto 7060 smallX70 continue,程序只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 07

链接地址:https://www.31ppt.com/p-4096078.html