软件工程基础之程序实现.ppt

上传人:本田雅阁 文档编号:2160994 上传时间:2019-02-24 格式:PPT 页数:60 大小:640.51KB
返回 下载 相关 举报
软件工程基础之程序实现.ppt_第1页
第1页 / 共60页
软件工程基础之程序实现.ppt_第2页
第2页 / 共60页
软件工程基础之程序实现.ppt_第3页
第3页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《软件工程基础之程序实现.ppt》由会员分享,可在线阅读,更多相关《软件工程基础之程序实现.ppt(60页珍藏版)》请在三一文库上搜索。

1、第五章 程序实现,本章学习目标,2,3,培养良好的编程习惯,理解编程规范,了解选择程序设计语言的一般原则,程序编码就好比建筑工程中最基础的砌砖和泥工作一样是工程的基础,是设计的具体实施。,引言不同 瓷砖特点,砌砖风格,砌墙的手艺,砌墙的规范 程序语言特点,编程风格,编程基本功,编程规范,手艺太差了,还不规范,手艺不错,规范,屋里的墙砖的应用不合适,程序设计语言,程序设计语言是:人与计算机通信的最基本工具。 程序设计语言的特性不可避免地会影响开发人员的思路和解决问题的方式,会影响代码的可理解性和可维护性。 编码之前的一项重要工作就是选择一种适当的编程语言。,不同的语言适用于不同的应用,COBOL

2、语言:数据处理程序 PHP语言:专门用来编写网页处理程序 Perl语言:更适合文本处理 C语言:被广泛用于系统软件开发 JAVA语言:用于跨平台的应用软件开发等等。,程序设计语言的特点-技术方面,一旦确定了软件需求之后,待选用的程序设计语言的技术特性就显得非常重要了。 如果需要复杂的数据结构,就要仔细衡量有哪些语言能提供这些复杂的数据结构描述。 如果软件要求高性能及实时处理能力,就该选用适合于实时处理的语言,如C或汇编语言。 如果应用有许多输出报告或繁杂的文件处理,则选用PowerBuilder、Delphi或SQL比较合适。,所有程序语言的基本成分都可归纳为4种: 数据成分:指明该语言能接受

3、的数据,如各种类型的变量、数组、指针、记录等。作为程序操作的对象,具有名称、类型和作用域等特征。使用前要对这些特征加以说明,数据名称由用户通过标识符命名,类型是说明数据需占用多少存储单元和存放形式,作用域说明数据可被使用的范围。 运算成分:指明该语言可执行的运算,如+,-,*、/ 控制成分:顺序结构、条件选择结构和循环结构 传输成分:数据的传输方法,例如输入、输出函数,程序设计语言的特点-语言本身,名字声明 类型声明 初始化 程序变量的局部性 程序模块的独立性 循环结构 分支结构 异常处理 独立编译 ,1、名字声明,预先说明程序中所使用的变量名字,编译程序能够检查程序中出现的名字的合法性,从而

4、帮助程序员发现和改正程序中的错误。 但是,有些语言不要求显式地声明程序中所使用的变量名称,它把变量第一次出现时使用的名字看做对这个变量的声明。这样做可能会引入一些很难发现的错误,并且可能会产生严重后果。,2、类型声明,变量的类型声明确定一个变量的使用方式,有了类型声明,编译程序就能够很容易地发现程序中某个特定类型的变量使用不当的错误。有些语言不要求显式的类型声明,例如FORTRAN语言规定,名字的第一个字母决定它的类型,但是一旦显式地声明了一个变量的类型,则以显式声明为该变量的类型。这很容易造成阅读时的混淆。 现代的大多数高级语言都有自定义类型,即允许开发人员定义与特定应用相关的类型,并且可以

5、用自定义类型嵌套定义新的类型。例如,可以定义记录、链表、二叉树等复杂的结构类型。 程序设计语言中的类型说明不仅仅是一种安全措施,还是一种重要的抽象机制。,3、初始化,程序设计中最常见的错误之一就是在使用变量之前没有对变量进行初始化。为了减少发生错误的可能性,应该强迫程序员对程序中所使用的变量进行初始化。 另一个办法是在说明变量时由系统给变量赋予一个特殊的标识,表明它尚未初始化,以后如果没给这个变量赋值就企图使用它,系统会发出报警信号。,4、程序变量的局部性,程序设计的一般原则是变量的名字应该在靠近使用它的地方引入,并且应该只有程序中真正需要它的那些部分才能够访问它。 通常有两种提供局部变量的途

6、径:单层局部性和多层局部性 。,PROGRAM TEST PROCEDURE A() VAR ARRAY A20,B20:INTEGER; WORK,I,J:INTEGER; BEGIN END; PROCEDURE B() VAR ARRAY A20,B20:INTEGER; WORK,I,J:INTEGER; BEGIN END; END.,程序中过程A和B内的变量是单层局部性的,两个过程中声明的变量的作用范围局限于所在的过程。,PROGRAM TEST PROCEDURE A() VAR ARRAY A20,B20:INTEGER; WORK,I,J,K:INTEGER; PROCEDU

7、RE B() VAR ARRAY A20,B20:INTEGER; WORK,I,J:INTEGER; BEGIN END; BEGIN END; ,程序的结构是多层的,模块A中声明的变量与模块B中声明的变量除了变量K之外全部相同。内层模块B中有意义的变量是属于该模块的A,B,WORK,I,J和属于外层模块的变量K。 要尽量避免内层模块与外层模块定义相同的变量名,容易引起差错,给维护人员理解代码带来很多困难,5、程序模块独立性,结构化语言提供了控制局部变量可见性的某些手段,主要是在较内层程序模块中定义的变量不能被较外层的程序块访问。 由于动态存储分配的缘故,在两次调用一个程序块的间隔中不能够保

8、存局部变量的值。因此,即使只有一两个子程序使用的变量,如果需要在两次调用这些子程序的过程中保存这个变量的值,也必须把这个变量说明成全局的,这将增加维护时发生差错的可能性。因此现在大多数语言提供了静态变量,这种变量可以保存前次调用时的数据,解决了多次调用一个模块时局部变量不能保存的问题。,6、循环结构,最常见的循环结构有for语句、while-do语句和repeat-until语句,这些语言都是在循环体外判断循环条件。 有许多场合需要在循环体内的任意一点测试循环结束条件,如果使用if-then-else语句和附加的布尔变量实现这个要求,则将增加程序长度并且降低程序的可读性。 某些程序设计语言考虑

9、到上述要求,适当地解决了这个问题。 exit(标识符)when(条件)这个语句把控制转移到循环语句后面的一条语句或转移到由标识符指定的语句上 。,7、分支结构,简单的分支语句一般不会出现问题,但是多分支的case型语句注意以下2个问题: 如果case表达式取的值不在预先指定的范围内,需要用缺省方式处理。 在某些程序设计语言中,由case表达式选定的执行语句取决于所有可能执行的语句排列顺序,如果语句顺序排列错了,编译和运行时系统是不会发现这类错误的。,8、异常处理,程序运行过程中发生的错误或意外事件称为异常。 以前大多数程序设计语言在检测和处理异常方面几乎没有给程序员提供任何帮助,程序员只能使用

10、条件控制检测异常,在发生异常时把控制转移到处理异常的程序段。但是,JAVA等一些语言提供了异常处理机制,程序员可以很容易地利用语言提供的异常处理机制实现错误和异常的处理操作。,9、独立编译,独立编译意味着能够分别编译各个程序单元,然后再把它们集成为一个完整的程序。 一个大程序通常由许多程序单元组成,如果修改了其中任何一个程序单元都需要重新编译整个程序,将大大增加程序开发、调试和维护的成本; 反之,如果可以独立编译,则只需要重新编译修改了的程序单元,然后重新连接整个程序即可。独立编译的机制对于开发大型系统极其重要。,10、其它特性,某些语言带有一些特别的功能,这些功能可实现一些特殊的设计。如MO

11、DULA语言和并发PASCAL语言支持并发处理、以及必须彼此通信和协调的分布式进程。因此适应并发的和分布式处理的要求。,程序设计语言的特点-软件工程方面,详细设计能够直接地翻译成程序代码。 源程序的可移植性。改善软件可移植性的主要途径是使语言标准化。对于可移植性要求的软件,应该严格遵守相应的标准编写程序代码,不要图一时的省事去使用语言的非标准特性。 编译程序效率较高。编译程序首先应该支持独立编译,并且能够发现尽可能多的程序代码错误,辅助程序员提高程序调试效率。 尽可能应用代码生成工具。许多语言都有与它相应的编译程序、连接程序、调试程序、代码格式化程序、交叉编译程序、宏处理程序和标准子程序库等。

12、对于提高效率是明智的选择。 可维护性。可维护性的前提是代码的可理解性,源程序的可读性、语言的文档化特性是影响可维护性的重要因素。,程序设计语言的分类,按语言级别分类,有低级语言和高级语言之分 按照用户要求,有过程式语言和非过程式语言之分 按照应用范围,有通用语言和专用语言之分 按照使用方式,有交互式语言和非交互式语言之分 按照成分性质,有顺序语言、并发语言和分布式语言之分 第四代语言,有数据库查询语言DEV2000、程序代码生成器以及其他一些原型语言、形式化规格说明语言等等。,低级语言:与特定计算机体系结构密切相关,如机器语言、汇编语言,特点是与机器有关,功效高,但使用复杂、开发费时、难维护

13、高级语言:不与特定计算机体系结构密切相关,表示方法贴近于待解问题,特点是在一定程度上与具体机器无关,易学、易用、易维护,但编译后的目标程序的功效往往较低,过程式语言:通过指明一列可执行的运算及运算次序来描述计算过程,如FORTRAN、C、Java等 非过程式语言:不显式指明处理过程细节,在这种语言中尽量引入抽象度较高的非过程性描述手段,以期在程序中增加“做什么”的描述成分,较少“如何做”的描述细节,如第四代语言(4GL)、函数式语言、逻辑式语言。,通用语言:目标非单一的语言,如:FORTRAN、C、Java等 专用语言:目标单一的语言,如:自动数控程序APT,交互式语言:具有反映人机交互的语言

14、,如:BASIC 非交互式语言:不反映人机交互的语言,如:FORTRAN、COBOL,顺序语言:只含顺序成分的语言,如:FORTRAN、C 并发语言:含并发成分的语言,如:Modula、Ada、并发Pascal 分布语言:考虑分布式计算要求的语言,如:Modula,选择一种语言要考虑的因素,在选择与评价语言时,首先要从应用要求入手,对比各项要求的相对重要性,然后再根据这些要求和相对重要性来选择合适的编程语言。 具体选择的考虑: 编程人员的水平和编程经历 待开发软件的类型 算法和计算复杂性 数据结构的复杂性 软件的开发成本和时间要求 软件的可移植性要求 可用的软件工具,编程人员的水平和编程经历,

15、虽然程序员学习一门新的语言并不困难,但是要熟练地掌握和精通一门语言是需要长期的实践开发积累的。因此,在选择语言时一定要考虑到时间限制和程序员掌握语言的程度,尽可能选择一种程序员熟悉的语言。,待开发软件的类型,待开发软件的类型可能不同,一般分为数据库应用软件、实时控制软件、系统级软件、人工智能类软件、军用软件等等。根据软件的类型选择合适的开发语言,例如,FORTRAN语言适合科学计算,PowerBuilder、Delphi、C#等语言适合于信息系统的开发,LISP、PROLOG语言适合于人工智能领域。,算法和计算复杂性,待开发软件算法的复杂性不同,应该选择合适的语言,例如,科学计算领域大都选择F

16、ORTRAN,因为它的运行性能比较好,但是当今计算机硬件的发展使得运算速度已不再成为瓶颈,因此许多计算型软件普遍采用C/C语言。然而计算复杂度很高的软件采用汇编语言、人工智能类的语言肯定是不合适的,前者编写代码的工作复杂度太高,后者的运行效率太低,并且这两类语言的科学计算库都很少,可复用的软件元素较少。,数据结构的复杂性,有些语言,例如FORTRAN、BASIC语言,定义数据类型的能力非常差,一旦设计中有比较复杂的数据结构,程序员实现时会感到很棘手。而PASCAL、JAVA之类的语言其数据结构描述能力非常强大,为程序员创造了一个很广阔的编程空间。,考虑软件的开发成本和时间要求,不仅要考虑当前的

17、开发成本,还要考虑今后的维护成本,如果选择的语言很生僻,即使现在以很快的速度开发出来,将来的维护工作量不得不考虑。,软件的可移植性,如果目标系统的运行环境不能确定,例如,可能运行在小型机的UNIX操作系统上,也可能运行在大型机的OS/400操作系统上,甚至还要运行在PC机的Windows操作系统环境中,这时选择的开发语言最好是JAVA。这样可以保证软件的跨平台运行。,可用的软件工具,选择语言时,特别是为大型软件选择语言时,一定要考虑可用的软件工具。如果某种语言有支持开发的工具,则开发和调试都会容易。,良好的编程习惯,良好的编程习惯,程序员编写的代码除了交给计算机运行外,还必须让其他程序员或设计

18、人员能够看懂。如果程序代码的可读性好,则调试和维护的成本就可以大幅度降低,同时可以减小程序运行期间软件失效的可能性,提高程序的可靠性。 对于代码编写而言,要求程序具有良好的结构和风格。,结构化程序设计原则,尽量使用语言提供的基本控制结构,即顺序结构、选择结构和重复结构。 利用块机制将程序组织成容易识别的块,每块只有一个入口和一个出口。 复杂结构应该用基本控制结构组合或嵌套实现。 对于语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致 严格控制GOTO语句。,自顶向下、逐步细化,在详细设计和编码阶段,还应当采取自顶向下、逐步求精的方法,把一个模块的功能逐步分解,

19、细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。 例 用筛选法求100以内的素数。具体做法就是从2到100中去掉 2,3,9,10的倍数,剩下的就是100以内的素数。 为了解决这个问题,可先按程序功能写出一个框架。 main( ) 建立2到100的数组A ,其中Ai= i; -1 建立2到10的素数表B ,存放2到10以内素数; -2 若Ai = i是B 中任意一个数的倍数,则剔除Ai; -3 输出A 中所有没有被剔除的数; -4 ,程序设计风格,1)基本要求 2)可读性要求 3)正确性与容错性要求 4)可移植性要求 5)输入和输出要求 6)重用性要求 7)面向对象的程序

20、设计风格,1)基本要求,程序结构清晰且简单易懂,单个函数的行数一般不要超过 100行。 算法设计应该简单,代码要精简,避免出现垃圾程序。 尽量使用标准库函数(类方法)和公共函数(类方法)。 最好使用括号以避免二义性。,2)可读性要求注释,程序头,函数头说明:程序标题,该模块功能说明,主要算法说明;接口说明:调用形式,参数描述;子程序清单,有关数据的说明;模块位置:在哪个源文件中,隶属于哪一个软件包;开发历史:包括模块设计者,复审者,复审日期,修改日期及有关说明等 主要变量(结构、联合、类或对象):含义的注释。 处理过程的每个阶段和典型算法前都有相关注释说明,但是不要对每条语句注释。 应保持注释

21、与代码完全一致。,2)可读性要求格式,程序格式清晰:一行只写一条语句,一个程序如果写得密密麻麻、分不出层次,是很难看懂的。利用空格、空行和缩进显示程序的逻辑结构,缩进量统一为4个字节。 (A-17)AND NOT(B=49)OR C 写成 (A -17) AND NOT (B = 49) OR C 对于嵌套的循环和分支程序,层次不要超过五层。,2)可读性要求程序本身,语句力求简单、清晰,不要片面追求效率,程序编写得过于紧凑,使语句复杂化。如: for (i=1; i=n; i+) for (j=1; j=n; j+) Vij = (i/j) * (j/i) V是一个NN单位矩阵,当IJ时,V(

22、I,J)=0;当I=J时,V(I,J)=1。这个程序构思巧妙,但不易理解。如果改成下面的形式,更容易了解程序的意图 for (i=1; i=n; i+) for (j=1; j=n; j+) if (i=j) Vij = 1; else Vij = 0;,2)可读性要求程序本身(续),简单变量的运算速度比下标(数组)变量的运算要快,程序员可能把语句: X=AI+1/AI 写成 AI= AI; X=AI+1/AI 因为不必访问数组的下标变量,程序运行效率高,但把一个计算表达式拆成了多个,增加了理解的难度。一旦将来修改可能会改变这几行代码的顺序或在其间插入其它语句,容易引入新的错误。,2)可读性要

23、求程序本身(续),编程时尽可能使用已有的库函数。 尽量用公共过程或子程序代替具有独立功能的重复代码段,但是如果不具有独立功能的代码不要这样做。 使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。 尽量使用三种基本控制结构编写程序,使用IF THEN ELSE结构实现分支;使用DO UNTIL或DO WHILE来实现循环。,2)可读性要求程序本身(续),避免采用过于复杂的条件测试,少用含有“否定”运算符的条件语句,例如在程序中把: IF NOT (CHAR9) THEN 改成 IF (CHAR0) AND (CHAR9) THEN ,2)可读性要求程序本身(续),避免使用空的ELSE语句和IF

24、 THEN IF语句 IF(CHAR=A) THEN IF(CHAR=Z) THEN PRINT “This is a letter。” ELSE/这个语句的配套IF逻辑上不明确 PRINT “This is not a letter。”,2)可读性要求程序本身(续),避免使用ELSE GOTO和ELSE RETURN结构。 避免过多的循环嵌套和条件嵌套。 数据结构要有利于程序的简化。 模块功能尽可能单一化,模块间的耦合能够清晰可见。利用信息隐蔽确保每一个模块的独立性。 对递归定义的数据结构尽量使用递归过程。 尽量不要修补结构差的程序,而应重新设计和编码。 对太大的程序,要分块编写、测试,然后

25、再集成 。,2)可读性要求数据说明,数据说明的先后次序规范化 简单变量类型说明、数组说明、公用数据块说明、文件说明 每个类型说明中可按如下顺序排列 整型量说明、实型量说明、字符量说明、逻辑量说明 同一条说明语句中可按字母顺序排列,例如 INTEGER cost, length, price, width,3)正确性与容错性要求,程序首先是正确,其次是考虑优美和效率。 对所有的用户输入,必须进行合法性和有效性检查。 不要单独进行浮点数的比较。在计算机中用二进制表示十进制数时,有时二进制数不能准确地表达十进制数,这时浮点数的表示具有不准确性。用它们做比较,其结果常常发生异常情况。解决办法是在严格的

26、容差级范围内检验两个值的差异,其形式为:|x0x1| 其中是容差级,其大小取决于具体应用中的总体精度要求及所用数值的精度。,3)正确性与容错性要求(续),所有变量在调用前必须被初始化。 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。 单元测试也是编程的一部分,提交联调测试的程序必须通过单元测试。 单元测试时,必须针对类里的每一个public方法进行测试,测试其正确的输入,是否得到正确的输出;错误的输入是否得到相应的容错处理(如异常捕捉处理,返回错误提示等)。,4)可移植性要求,应当尽量使用语言的标准部分,避免使用第三方提供的接口,以确保程序不受具体的运行环境影响,和平台无

27、关。 对数据库的操作,使用符合语言规范的标准接口类例如JDBC,除非程序是运行于特定的环境下,并且有很高的性能优化方面的要求。 程序中涉及到的数据库定义和操纵语句,尽量使用标准 SQL 数据类型和 SQL 语句,5)输入和输出要求,任何程序都会有输入输出,输入输出的方式应当尽量方便用户的使用。系统能否为用户接受,很大程度上取决于输入输出的风格。在需求分析和设计阶段就应确定基本的输入输出风格,要避免因设计不当带来操作和理解的麻烦。,5)输入和输出要求(续),对所有的输入数据进行检验,从而识别错误的输入,以保证每个数据的有效性。 检查输入项各种重要组合的合理性,必要时报告输入状态信息。 输入的步骤

28、和操作尽可能简单,并且要保持简单的输入格式。 有些输入信息应提供缺省值。 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目。,5)输入和输出要求(续),在以交互式方式进行输入时,要在屏幕上显示提示信息,说明输入的选择项和取值范围,便于操作者输入。同时,在输入数据的过程和输入数据结束时,也要在屏幕上给出状态信息。 当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的要求一致。 给所有的输出加上注解信息。 按照用户的要求设计输出报表格式。,6)重用性要求,可重复使用的、功能相对独立的算法或接口。应该考虑封装成公共的控件或类,如时间、日期处理,字符串格式处理,数据库连接

29、,文件读写等,以提高系统中程序的可复用性。 相对固定和独立的程序实现方式和过程,应考虑做成程序模板,增强对程序实现方式的复用,如对符合一定规范的 XML数据的解析等过程。,程序的效率,程序效率,程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。程序编码是最后提高运行速度和节省存储的机会,因此在此阶段不能不考虑程序的效率。讨论程序效率的几条准则: 效率是一个性能要求,应当在需求分析阶段给出。软件效率以需求为准,不应以人力所及为准。 好的设计可以提高效率。 程序的效率与程序的简单性相关。 一般说来,任何对效率无重要改善,且对程序的简单性、可读性和正确性不利的程序设计方法都是不可取的。,算

30、法对效率的影响,源程序的效率与详细设计阶段确定的算法的效率直接有关。在详细设计翻译转换成源程序代码后,算法效率反映为程序的执行速度和存储容量的要求。,设计向程序转换过程中的指导原则, 在编程序前,尽可能化简有关的算术表达式和逻辑表达式; 仔细检查算法中的嵌套的循环,尽可能将某些语句或表 达式移到循环外面; 尽量避免使用多维数组; 尽量避免使用指针和复杂的表; 采用“快速”的算术运算; 不要混淆数据类型,避免在表达式中出现类型混杂; 尽量采用整数算术表达式和布尔表达式; 选用等效的高效率算法;,影响存储器效率的因素,在大中型计算机系统中,存储限制不再是主要问题。在这种环境下,对内存采取基于操作系

31、统的分页功能的虚拟存储管理。存储效率与操作系统的分页功能直接有关。 采用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。 在微型计算机系统中,存储器的容量对软件设计和编码的制约很大。因此要选择可生成较短目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。 提高存储器效率的关键是程序的简单性。,影响输入输出的因素,输入输出可分为两种类型: 面向人(操作员)的输入输出 面向设备的输入输出 如果操作员能够十分方便、简单地录入输入数据,或者能够十分直观、一目了然地了解输出信息,则可以说面向人的输入输出

32、是高效的。,关于面向设备的输入/输出,可以提出一些提高输入/输出效率的指导原则: 输入/输出的请求应当最小化; 对于所有的输入/输出操作,安排适当的缓冲区,以减少频繁的信息交换。 对辅助存储(例如磁盘),选择尽可能简单的,可接受的存取方法 对辅助存储的输入/输出,应当成块传送; 对终端或打印机的输入/输出,应考虑设备特性,尽可能改善输入/输出的质量和速度; 任何不易理解的,对改善输入/输出效果关系不大的措施都是不可取的; 任何不易理解的所谓“超高效”的输入/输出是毫无价值的;,本章要点,选择程序设计语言考虑的因素:编程人员的水平和编程经历,待开发软件的类型,算法和计算复杂性,数据结构的复杂性,软件的开发成本和时间要求,软件的可移植性要求,可用的软件工具。 程序设计的风格主要考虑:基本风格、可读性、正确性和容错性、可重用和可移植性、输入和输出风格。 程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。对效率无重要改善,不能牺牲程序的简单性、可读性和正确性。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1