软件工程07.ppt

上传人:李司机 文档编号:4096078 上传时间:2023-04-04 格式:PPT 页数:68 大小:1.10MB
返回 下载 相关 举报
软件工程07.ppt_第1页
第1页 / 共68页
软件工程07.ppt_第2页
第2页 / 共68页
软件工程07.ppt_第3页
第3页 / 共68页
软件工程07.ppt_第4页
第4页 / 共68页
软件工程07.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《软件工程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,程序只

25、需编写成:smallx;if(y small)smally;if(z small)smallz;,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,程序只需编写成:smallx;if(y small)smally;if(z small)smallz;,软件工程,39,尽量只采用三种基本控制结构来编写程序除顺序结构外,使用 if-then-else 来实现选择结构;使用 do-unti 或 do-while 来实现循环结

26、构。避免使用空的else语句和ifthen if的语句,软件工程,40,避免采用过于复杂的条件测试。尽量减少使用“否定”条件的条件语句。例如,如果在程序中出现这种结构容 易使读者产生误解。例如,if(char=a)if(char=z)cout“This is a letter。”;else cout“This is not a letter。”;可能产生二义性问题。,if(!(char0|char 9)改成 if(char=0&char=9)不要让读者绕弯子想。,软件工程,41,数据结构要有利于程序的简化。尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成必须使用的语言。要模块化,使模块功能

27、尽可能单一化,模块间的耦合能够清晰可见。利用信息隐蔽,确保每一个模块的独立性。从数据出发去构造程序。不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织。对太大的程序,要分块编写、测试,然后再集成。,软件工程,42,输入和输出可视化,在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。系统能否被用户接受,有时就取决于输入和输出的风格。输入输出方式应考虑下列原则:对所有的输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性;检查输入项的各种重要组合的合理性,必要时报告输入状态信息;使得输入的步骤和操作尽可能简单,并保持简单的输入格式;输入数据时,应允许使用自由格

28、式;应允许缺省值;输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目;在交互式输入时,要在屏幕上使用提示符明确提示交互输入请求,指明可用选择项的种类和取值范围。同时,在数据输入过程中和输入结束时,也要在屏幕上给出状态信息;当语言对输入输出格式有严格要求时,应保持输入格式与输入语句要求的一致性;给所有的输出加注解并设计输出报表格式。输入输出风格还受到许多其它因素的影响。如输入输出设备、用户的熟练程度、以及通信环境等。,软件工程,43,7.4 编程语言,程序编码阶段的任务是将软件详细设计转换成用编程语言实现的程序代码。,从心理学的观点,影响程序员心理的语言特性有如下六种:,一致性它

29、表示一种语言所使用符号的兼容程度、允许随意规定限制、以及允许对语法或语义破例的程度。如在FORTRAN中,括号“()”可用来做:标明数组元素下标的界限符,如A(I);表达式中用以表示运算的优先次序,如(x*c)/(y*d);标明IF语句中条件的界限符,如IF(ch.LS.eps)GOTO 25;标明子程序参数表的界限符,如SIN(angle),等。同是一个符号,给予多种用途,会引起许多难以察觉的错误。,软件工程,44,二义性虽然语言的编译程序总是以一种机械的规则来解释语句,但读者则可能用不同的方式来理解语句。例如,一个逻辑表达式为:A 0and A 9Pascal语言规定“”、“”的运算优先级

30、低于“and”,但FORTRAN语言正好相反,“(用.GE.表示)”、“(用.LE.表示)”的运算优先级高于“and”。因此,这个逻辑表达式有可能导致二义性。另一种容易引起混淆的是数据类型的默认说明和显式说明。例如,在FORTRAN语言中有个变量K,按照默认数据说明它是整型。然而,如果经过显式类型说明REAL K,K就是实型的了,由于心理上的混淆就容易出错。缺乏一致性和心理上的二义性往往同时存在。若一个编程语言具有这样一些消极的特性,用这种语言编写出来的程序可读性就差,同时用这种语言编程也容易出错。,软件工程,45,简洁性表示为了用该语言编写程序,必须记忆的关于代码的信息量。在语言的属性中,简

31、洁性的标志是:语言支持块构造和结构化的能力;可使用的保留字和缩写字的种类;数据类型的种类和缺省说明;算术运算符和逻辑运算符的种类;系统内标准函数的数目。简洁的程序语言具有功能很强又很简洁的运算符,允许以少量编码完成含有大量算术运算和逻辑运算的过程。但语言过于紧凑将导致它的程序难读、难懂,并可能使得一致性变差。,软件工程,46,局部性局部性与模块化有关。如果一个编程语言支持模块构造,并允许用模块组装成系统,在组装过程可实现模块结构的高内聚和低耦合,那么这种语言具有局部性。使用具有局部性的编程语言编写出来的程序结构十分灵活,可以像搭积木一样很方便地搭建软件系统,C、C+、Java都延续了这种特性,

32、成为现代最流行的软件实现语言。,软件工程,47,5.线性线性是指程序的顺序特性。如果程序中线性序列和逻辑运算较多,会促进人们的理解力。如果存在大量的分支和循环,就会破坏顺序状态,增加理解上的困难。直接实现结构化程序可提高程序的线性特性。传统 人们学习一种新的程序设计语言的能力受到传统的影响。具有 Pascal 或 C 基础的程序设计人员在学习 C+或 Java 语言时不会感到困难,因为C+和 Java 保持了 Pascal 和 C 所确立的传统语言特性和风格。但是要求同一个人去学习 APL 或者 LISP 这 样一些具有另外风格的语言,传统就中断了,花在学习上的时间就会更长。编程语言的心理特性

33、对于我们学习、应用以及维护编程语言的能力有很大的影响。它影响程序员对编写程序的思考方法,从而内在地限制了程序员和计算机通信的方式。,软件工程,48,从软件工程观点,编程语言的特性应着重考虑软件开发项目的需要。为此对于程序编码有如下工程性能要求:详细设计能很容易地翻译成代码程序把设计变为程序的难易程度,反映了编程语言与设计说明相接近的程度。编程语言的结构和数据定义的能力直接影响从详细设计变换到代码程序的难易程度。源程序应具有可移植性对于可移植性,通常有三种解释:对源程序不做修改或少做修改就可以实现处理机上的移植或编译程序上的移植;即使程序的运行环境改变(例如,改用一个新版本的操作系统或从一个hp

34、工作站移植到一个服务器),源程序也不用改变;(3)源程序的许多模块可以不做修改或少做修改就能集成为功能性的各种软件包,以适应不同的需要。改善软件的可移植性,应选择标准的编程语言,以促进程序之间的通信,延长软件生存期及扩大其使用范围。在设计方案发生变化时,有利于降低修改的费用。,软件工程的观点,软件工程,49,编译程序应具有较高的效率尽可能应用代码生成的自动工具有效的软件开发工具是缩短编码时间,改善源代码质量的关键因素。许多语言都有与它相应的编译程序、连接程序、调试程序、源代码格式化程序、交叉编译程序、宏处理程序和标准子程序库等。使用带有各种有效的自动化工具的“软件开发环境”,支持从设计到源代码

35、的翻译等各项工作,可以保证软件开发获得成功。可维护性源程序的可维护性对复杂的软件开发项目尤其重要。把设计变换成为源程序、针对修改后的设计,软件工程,50,编程语言的技术性能 确定一个具体的编译器或者确定一个程序设计环境。读懂源程序。如果需要复杂的数据结构,就要考虑有哪些语言能提供这些复杂的数据结构(如C)。如果需要高性能及实时处理的能力,就可选用适合于实时应用的语言(如Ada)或效率高的语言(如汇编语言)。如果需要有许多报告或文件处理,用SQL或者COBOL就比较合适。最好是根据软件的要求,选定一种适合于该项工作的语言。软件的设计质量与编程语言的技术性能无关(面向对象设计例外)。但在把软件设计

36、转化为程序代码时,转化的质量往往受语言性能的影响。因而也会影响到设计方法。软件设计要求一个好的程序应具有模块化结构,应有较高的模块独立性,数据设计应按照抽象数据类型来处理。在把设计转换成程序时,编程语言的特性就影响到这些设计概念。,软件工程,51,下面举一些例子。几乎所有现代的编程语言都支持模块化结构。语言的特性可以加强或破坏模块的独立性。例如,C+和 Java 的类和 Ada 的程序包支持信息隐蔽的概念;而类之间的泛化关系会破坏模块的独立性。语言的性能也会影响数据结构设计。例如,Ada、Smalltalk、C+、Java等支持抽象数据类型的概念;C和C+等提供动态存储分配机制;Java支持单

37、继承,C+支持多重继承,而C不支持继承。(4)在某些情况下只有语言有专门性能时才能满足设计要求。如MODULA-II语言和并发PASCAL语言支持并发执行以及必须彼此通信和协调的分布式进程。(5)语言的技术性能对测试和维护的影响是多种多样的。例如,直接提供结构化构造的语言有利于减少循环带来的复杂性(即 McCabe复杂性),使程序易读、易测试、易维护。,软件工程,52,编程语言的分类,程序设计语言有多种分类法按照语言的抽象级别,有低级语言和高级语言。低级语言包括机器语言(第一代语言)和汇编语言(第二代语言),它们都是与特定计算机硬件密切相关的程序设计语言。高级语言是不反映特定计算机体系结构的程

38、序设计语言,其表示方法更接近待解决问题的表示方法,包括FORTRAN、ALGOL等,即第三代语言。C语言兼有高级语言和汇编语言某些特性,属于 2 代半语言。,软件工程,53,按照应用的范围,有通用语言和专用语言。通用语言可适用于多种应用,包括COBOL、FORTRAN、C等。专用语言是为特殊应用而设计的语言。通常具有自己特殊的语法形式,面对特定问题,输入结构及词汇表与该问题的相应范围密切相关。例如Lisp、PROLOG、FORTH等。,软件工程,54,过程性语言是通过指明一系列可执行的运算及运算的次序来描述计算过程的语言,也称命令式语言或强制式语言。ALGOL60、FORTRAN、Pascal

39、、C等高级语言是面向过程语言的主要代表。非过程性语言是一种不显式指定处理细节的程序设计语言,如查询语言、程序生成器、判定支持语言、原型语言、形式化规格说明语言等。,3.按照用户要求,有过程性语言和非过程性语言。,软件工程,55,4.按照语言所包含成分的性质,有过程性语言、面向对象语言,面向因特网语言等。面向对象语言是基于对象概念,以对象为中心,以类和继承为构造机制,认识、理解、刻画客观世界并构建相应软件的语言。第一个正式发表的面向对象语言是20世纪70年代的Smalltalk。目前流行的面向对象编程语言有Delphi、Visual Basic、Java、C+等。随着因特网的出现和万维网的普及,

40、出现了面向因特网的语言。典型的语言有HTML(超文本标记语言)、XML(可扩展标记语语言)、XML(标记语言)、Java(解释执行)、C#(编译执行)等。,软件工程,56,在构造软件系统时,必须首先确定要使用哪种编程语言来实现这个系统。总的原则是选择的语言能使编码容易实现,减少测试的工作量,容易阅读和维护程序。由于软件系统的绝大部分成本用在测试和维护阶段,所以易于测试和易于维护是非常重要的。为某个特定开发项目选择编程语言时,既要从技术角度、工程角度、心理学角度评价和比较各种语言的适用程度,又必须考虑现实可能性。软件开发人员在进行决策时经常面临的是矛盾的选择。例如,所有的技术人员都同意采用某种高

41、级编程语言,但所选择的计算机却没有这种语言,因此选择就不切实际了,不得不做出某种合理的折衷。,编程语言的选择,软件工程,57,理想的标准所选用的高级语言应有理想的模块化机制,可读性好的控制结构和数据结构,使程序容易测试和维护,减少软件生存期总成本。(2)所选用的高级语言应该使编译程序能够尽可能多地发现程序中的错误。(3)所选用的高级语言应该有良好的独立编译机制,以降低软件开发和维护的成本。,软件工程,58,2.实践标准编程语言自身的功能:各种编程语言都有自己适用的应用领域领域。要了解各种语言的特点和功能,选择出最有利的语言工具。(2)系统用户的要求:如果所开发的系统由用户自己负责维护,应该选择

42、他们熟悉的语言来编写程序。(3)编码和维护成本:选择合适的编程语言可降低程序的编码量及日常维护的难度,从而使编码和维护成本降低。(4)软件的兼容性:不同机器上所配备语言可能不同。在一个软件系统中各子系统之间或者主系统与子系统之间采用的机器类型可能会不同。(5)可以使用的软件工具:有些软件工具,如文本编辑、交叉引用表、编码控制系统及执行流分析等工具,在辅助编程方面作用很大,这类工具对于所选用的编程语言是否可用,决定了目标系统是否容易实现和测试。(6)软件可移植性:使所开发的软件将来能够移植到不同的硬件环境中运行。(7)待开发系统的规模:如果待开发系统的规模很大,而现有编程语言又不完全适用,那么就

43、要设计一个能够实现这个系统的专用编程语言。(8)程序设计人员的水平:在选择语言时还要考虑程序设计人员的水平,即他们对语言掌握的熟练程度及实践经验。,软件工程,59,从技术上要考虑的因素有:项目的应用范围;算法和计算复杂性;软件执行的环境;性能上的考虑与实现的条件;数据结构的复杂性;软件开发人员的知识水平和心理因素等。,软件工程,60,在科学与工程计算领域内,Fortran、C、C+语言得到了广泛的应用;在商业数据处理领域中,通常采用 COBOL,Java 语言编写程序,当然也可选用 SQL 语言或其他专用语言。在系统程序设计和实时应用领域中,汇编语言或一些新的派生语言,如 Ada、C+等得到了

44、广泛的应用。在人工智能领域以及问题求解,组合应用领域,采用 LISP 和 PROLOG 语言。,针对计算机的 4 个主要应用领域,语言分类,软件工程,61,7.5 程序效率与性能分析,程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。程序编码是最后提高运行速度和节省存储的机会,因此在此阶段不能不考虑程序的效率。让我们首先明确讨论程序效率的几条准则:效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力所及为准。好的设计可以提高效率。(3)程序的效率与程序的简单性相关。(4)一般说来,任何对效率无重要改善,且对程序的简单性、可读性和正确性不利的程序设计方法都是不可取

45、的。,软件工程,62,源程序的效率与详细设计阶段确定的算法的效率直接有关。,算法对效率的影响,设计向程序转换过程中的指导原则:在编程序前,尽可能化简有关的算术表达式和逻辑表达式;仔细检查算法中的嵌套的循环,尽可能将某些语句或表达式移到循环外面;尽量避免使用多维数组;尽量避免使用指针和复杂的表;采用“快速”的算术运算;不要混淆数据类型,避免在表达式中出现类型混杂;尽量用整数算术表达式和布尔表达式;选用等效的高效率算法;,软件工程,63,7.6 程序复杂性度量,程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种

46、度量。减少程序复杂性,可提高软件的简单性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少。为了度量程序复杂性,要求复杂性度量满足以下假设:它可用来计算任何一个程序的复杂性;对于不合理的程序,如对于长度动态增长的程序,或对于原则上无法排错的程序,不应使用它进行复杂性计算;如果程序中指令条数、附加存储量、计算时间增多,不会减少程序的复杂性。,软件工程,64,度量程序复杂性,最简单的方法就是统计程序源代码行数。以源代码行数做为程序复杂性度量。设每行代码的出错率为每100行源程序中可能有的错误数目。Lipow及其他研究者得出一个结论:对于少于100个语句的小程序,源代码行数与出错率

47、是线性相关的。随着程序的增大,出错率以非线性方式增长。所以,代码行度量法只是一个简单的,估计得很粗糙的方法,代码行度量法,软件工程,65,McCabe度量法,又称圈复杂性度量,是一种基于程序控制流的复杂性度量方法计算环路复杂性的方法。根据图论,在一个强连通的有向图G中,圈的个数由以下公式给出:V(G)=m n+2 或 V(G)=判定节点+1其中,V(G)是图G中环路数,m是图中弧数,n是图中结点数,,McCabe复杂性度量法,程序流程图,程序图,在例示中,结点数n11,弧数m12,则有 V(G)mn2 121123,McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错

48、误。,软件工程,66,2012年下半年软考软件设计师采用McCabe度量法计算下图的环路复杂性为()。,V(G)=9-7+2=4 或 V(G)=判定节点+1=2+1=3,软件工程,67,根据McCabe度量法,以下程序图的复杂性度量值为()。A.4B.5C.6D.7试题答案:A,软件工程,68,1、软件实现的任务详细设计的结果翻译成用某种程序设计语言编写的并且最终可以运行的程序代码2、结构化程序设计方法的特点自顶向下,逐步求精3、面向对象程序设计方法的特点封装、泛化、多态、协同和复用4、编程风格主要涉及的方面源程序文档化、数据说明规范化、程序代码结构化、输入输出可视化5、编程语言的分类按照语言的抽象级别,有低级语言和高级语言按照应用的范围,有通用语言和专用语言按照用户要求,有过程性语言和非过程性语言按照语言所包含成分的性质,有过程性语言、面向对象语言,面向因特网语言等。6、编程语言的选择程序复杂性度量McCabe复杂性度量法V(G)=m n+2 或 V(G)=判定节点+1,复习题,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号