第6章软件工程.ppt_第1页
第6章软件工程.ppt_第2页
第6章软件工程.ppt_第3页
第6章软件工程.ppt_第4页
第6章软件工程.ppt_第5页
免费预览已结束,剩余46页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1程序设计语言概述6.2程序设计风格6.3程序设计方法6.4程序设计工具和环境,第6章程序设计语言与编码,6.1程序设计语言概述,程序设计语言特性,1.心理特性,程序设计语言经常要求程序员改变处理问题的方法,使这种处理方法适合于语言的语法规定。而程序是人设计的,人的因素在设计程序时是至关重要的。语言的心理特性指影响程序员心理的语言性能,许多这类特性是作为程序设计的结果而出现的,虽不能用定量的方法来度量,但可以认识到它在语言中的表现形式如下:,(1)歧义性:指程序设计语言通常是无二义性的,编译程序总是根据语法,按一种固定方法来解释语句的,但有些语法规则容易使人用不同的方式来解释语言,这就产生了心理上的二义性。,如:X=X1/X2X3,编译系统只有一种解释,但人们却有不同的理解,有人理解为X=(X1/X2)X3,而另一个人可能理解为X=X1/(X2X3)。又如FORTRAN语言中变量的类型有显式定义和隐式定义两种,用REALK显式说明K是实型变量,但按隐含类型定义,K是整型变量。在程序较长时,不可能每次都查类型定义,容易产生错误。若程序语言具有这些使人心理上容易产生歧义性的特征,则易使编程出错,而且可读性也差。,(2)简洁性:指人们必须记住的语言成分的数量。人们要掌握一种语言,就要记住语句的种类、各种数据类型、各种运算符、各种内部函数和内部过程,这些成分数量越多,简洁性越差,人们越难以掌握。但特别简洁也不好,有的语言(如APL)为了简洁,提供功能强但形式简明的运算符,允许用最少的代码去实现很多的算术和逻辑运算。可是这样使程序难以理解,一致性差。所以既要简洁又要易读易理解。,(3)局部性和顺序性:指人的记忆特性有两方面即联想方式和顺序方式。人的联想力使人能整体地记住和辨别某件事情,如一下子就能识别一个人的面孔,而不是一部分一部分地看过之后才认得出;顺序记忆提供了回忆序列中下一个元素的手段,如唱歌,依次一句一句地唱出,而不必思索。,人的记忆特性对使用语言的方式有很大的影响。局部性指语言的联想性,在编码过程中,由语句组合成模块,由模块组装成系统结构,并在组装过程中实现模块的高内聚,低耦合,使局部性得到加强,提供异常处理的语言特性,则消弱了局部性。若在程序中多采用顺序序列,则使人易理解,如果存在大量分支或循环,则不利于人们的理解。,(4)传统性:指人们习惯于已掌握的语种,而传统性容易影响人们学习新语种的积极性,若新语种的结构、形式与原来的类似,还容易接受,若风格根本不同,则难以接受,如习惯用Pascal或C的编程人员,用Lisp和Prolog编程,就要用更多的时间来学习。,2.工程特性从软件工程的观点、程序设计语言的特性着重考虑软件开发项目的需要,因此对程序编码有如下要求:,(1)可移植性:指程序从一个计算机环境移植到另一个计算机环境的容易程度,计算机环境是指不同机型、不同的操作系统版本及不同的应用软件包。要增加可移植性,应考虑以下几点:在设计时模块与操作系统特性不应有高度联系;要使用标准的语言,要使用标准的数据库操作,尽量不使用扩充结构;对程序中各种可变信息,均应参数化,以便于修改。,(2)开发工具的可利用性:指有效的软件开发工具可以缩短编码时间,改进源代码的质量。目前,许多编程语言都嵌入到一套完整的软件开发环境里。这些开发工具为:交互式调试器、交叉编译器、屏幕格式定义工具、报表格式定义工具、图形开发环境、菜单系统和宏处理程序等。,(3)软件的可重用性:指编程语言能否提供可重用的软件成分,如模块子程序可通过源代码剪贴、包含和继承等方式实现软件重用。可重用软件在组装时,从接口到算法都可能调整,需考虑额外代价。,(4)可维护性:指源程序的可维护性对复杂的软件开发项目的重要性,如易于把详细设计翻译为源程序、易于修改需要变化的源程序。因此,源程序的可读性、语言的文档化特性对软件的可维护性具有重大的影响。,3.技术特性,语言的技术特性对软件工程各阶段有一定的影响,特别是确定了软件需求之后,程序设计语言的特性就显得非常重要了,要根据项目的特性选择相应特性的语言,有的要求提供复杂的数据结构,有的要求实时处理能力强,有的要求能方便地进行数据库的操作。软件设计阶段的设计质量一般与语言的技术特性关系不大(面向对象设计例外),但将软件设计转化为程序代码时,转化的质量往往受语言性能的影响,可能会影响到设计方法。如Ada,Smalltalk,C+等支持抽象类型的概念,Pascal,C等允许用户自定义数据类型,并能提供链表和其他数据结构的类型。,这些语言特性为设计者进行概要设计和详细设计提供了很大的方便。在有些情况下,仅在语言具有某种特性时,设计需求才能满足。如要实现彼此通信和协调的并发分布式处理,要用并发Pascal,Ada,Modula-2等语言才能用于这样的设计。语言的特性对软件的测试与维护也有一定的影响。支持结构化构造的语言有利于减少程序环路的复杂性,使程序易测试、易维护。,程序设计语言的选择,1.项目的应用领域,项目应用领域是选择语言的关键因素,有下列几种类型。,为开发一个特定项目选择程序设计语言时,必须从技术特性、工程特性和心理特性几方面考虑。在选择语言时,从问题入手,确定它的要求是什么,以及这些要求的相对重要性。由于一种语言不可能同时满足它的各种需求,所以要对各种要求进行权衡,比较各种可用语言的适用程度,最后选择认为是最适用的语言。,1)科学工程计算,该计算需要大量的标准库函数,以便处理复杂的数值计算,可供选用的语言有:,FORTRAN语言:是世界上第一个被正式推广应用的计算机语言,产生于1954年,经过FORTRAN0到FORTRAN,又相继扩展为FORTRAN77,FORTRAN90,通过几个版本不断的更新,使它不仅面向科学计算,数据处理能力也极强。,(2)Pascal语言:产生于60年代末,具有很强的数据和过程结构化的能力,它是第一个体现结构化编程思想的语言,由于它语言简明、数据类型丰富、程序结构严谨,许多算法都用类Pascal来概括。用Pascal语言写程序,也有助于培养良好的编程风格。,(3)C语言:产生于70年代初,最初用于描述UNIX操作系统及其上层软件,后来发展成具有很强功能的语言,支持复杂的数据结构,可大量运用指针,具有丰富灵活的操作运算符及数据处理操作符。此外还具有汇编语言的某些特性,使程序运行效率高。,(4)PL/1语言:是一个适用性非常广泛的语言,能够适用于多种不同的应用领域,但由于太庞大,难以推广使用,目前一些PL/1的子集被广泛使用。,2)数据处理与数据库应用数据处理与数据库应用可供选用的语言如下:,(1)Cobol语言:产生于50年代末,是广泛用于商业数据处理的语言,它具有极强的数据定义能力,程序说明与硬件环境说明分开,数据描述与算法描述分开,结构严谨层次分明,说明采用类英语的语法结构,可读性强。,(2)SQL语言:最初是为IBM公司开发的数据库查询语言,目前不同的软件开发公司有了不同的扩充版本,如80年代后期我国引入Informix-SQL,Microsoft-SQL可以方便地对数据库进行存取管理。,(3)4GL语言:称为第4代语言,随着信息系统的飞速发展,原来的第2代语言(如FORTRAN,Cobol)第3代语言(如Pascal,C等)受硬件和操作系统的局限,其开发工具不能满足新技术发展的需求,因此,在70年代末,提出了第4代语言的概念,4GL的主要特征是:,友好的用户界面:指操作简单,使非计算机专业人员也能方便地使用它。,兼有过程性和非过程性双重特性:非过程性指语言的抽象层次又提高到一个新的高度,只需告诉计算机“做什么”,而不必描述“怎么做”,“怎么做”的工作由语言系统运用它的专门领域的知识来填充过程细节。,高效的程序代码:指能缩短开发周期,并减少维护的代价。,完备的数据库:指在4GL中实现数据库功能,不再把DBMS(数据库管理系统)看成是语言以外的成分。,应用程序生成器:能提供一些常用的程序来完成文件维护、屏幕管理、报表生成和查询等任务,从而有效提高软件生产率。,目前流行的Fox公司的FoxPro,Uniface公司的Uniface,Powersoft公司的PowerBuilder,Informix公司的Informix-4GL以及各种扩充版本的SQL等都不同程度地具有上述特征。,3)实时处理,实时处理软件一般对性能的要求很高,可选用的语言有:,(1)汇编语言:是面向机器的,它可以完成高级语言无法满足要求的特殊功能,如与外部设备之间的一些接口操作。,(2)Ada语言:是美国国防部出资开发的,主要用于适时、并发和嵌入系统的语言。Ada语言是在Pascal基础上开发出来的,但其功能更强、更复杂。它提供了一组丰富的实时特性,包括多任务处理、中断处理、任务间同步与通信等,它还提供了许多程序包供程序员选择。通过修订,已成为安全、高效和灵活的面向对象的编程语言。,5)人工智能,4)系统软件,如果编写操作系统、编译系统等系统软件时,可选用汇编语言、C语言、Pascal语言和Ada语言。,如果要完成知识库系统、专家系统、决策支持系统、推理工程、语言识别、模式识别、机器人视角及自然语言处理等人工智能领域内的系统,应选择的语言如下:,(1)Lisp:是一种函数型语言,产生于60年代初,它特别适用于组合问题中的符号运算和表处理,因此用于定理证明、树的搜索和其他问题的求解。近年来Lisp广泛应用于专家系统的开发,对于定义知识库系统中的事实、规则和相应的推理相对要容易一些。,(2)Prolog:是一种逻辑型语言,产生于70年代初,它提供了支持知识表示的特性,每一个程序由一组表示事实、规则和推理的子句组成,比较接近于自然语言,符合人的思维方式。,以上讨论的语言,一般适用于相应的应用领域,但要根据具体情况灵活掌握。有的语言功能强,适用的范围较广,但比较庞大。,2软件开发的方法,有时编程语言的选择依赖于开发的方法,如果要用快速原型模型来开发,要求能快速实现原型,因此宜采用4GL。如果是面向对象方法,宜采用面向对象的语言编程。近年来,推出了许多面向对象的语言,这里主要介绍以下几种:,(1)C+:是由美国AT&T公司的Bell实验室最先设计和实现的语言,它提供了面向对象类的定义、继承、封装和消息传递等概念实现的手段,又与C语言兼容,保留了C语言的许多特性,维护了大量已开发的C库、C工具以及C源程序的完整性,使编程人员不必放弃自己熟悉的C语言,只需补充学习C+提供的那些面向对象的概念,因而从C过渡到C+比较容易,加之它的运行性能较高,成为当今最受欢迎的对象语言之一。目前,除了常用的AT&TC+,TurboC+,BorlandC+及MicrosoftC+等版本外,又推出了MicrosoftVisualC+,充分发挥Windows和Web的功能。,(2)Java:是由Sun公司开发的一种面向对象的、分布式的、安全的、高效的及易移植的语言,它的基本功能类似于C+,但做了重大修改,不再支持运算符重载、多继承及许多易于混淆和较少使用的特性,增加了内存空间自动垃圾收集的功能,使程序员不必考虑内存管理问题。Java应用程序可利用语言提供的例程库,能够自由地打开和访问网络上的对象。,3.软件执行的环境,良好的编程环境不但有效提高软件生产率,同时能减少错误,有效提高软件质量。近几年推出了许多可视化的软件开发环境,如VisualBASIC,VisualC,VisualFoxPro及Delphi(面向对象的Pascal)等,都提供了强有力的调试工具,帮助你快速形成高质量的软件。,4.算法和数据结构的复杂性,科学计算、实时处理和人工智能领域中的问题算法较复杂,而数据处理、数据库应用和系统软件领域内的问题,数据结构比较复杂,因此选择语言时可考虑是否有完成复杂算法的能力,或者有构造复杂数据结构的能力。,5.软件开发人员的知识,有时编程语言的选择与软件开发人员的知识水平及心理因素有关,新的语言虽然有吸引力,但软件开发人员若熟悉某种语言,而且有类似项目的开发经验,往往愿选择原有的语言。开发人员应仔细地分析软件项目的类型,敢于学习新知识,掌握新技术。,6.2程序设计风格,随着计算机技术的发展,软件的规模增大了,软件的复杂性也增强了。为了保证软件的质量,要加强软件测试。为了延长软件的生存期,就要经常进行软件维护。不论测试与维护,都必须要阅读程序。因此,读程序是软件维护和开发过程中的一个重要组成部分。有时读程序的时间比写程序的时间还要多。同样一个题目,为什么有人编的程序容易读懂,而有人编的程序不易读懂呢?这就存在一个程序设计的风格问题。程序设计风格指一个人编制程序时所表现出来的特点、习惯及逻辑思路等。良好的编程风格可以减少编码的错误,减少读程序的时间,从而提高软件的开发效率。因此本节主要讨论与编程风格有关的因素。,1.源程序文档化,编写源程序文档化的原则为:,(1)标识符应按意取名。若是几个单词组成的标识符,每个单词第一个字母用大写,或者之间用下划线分开,这便于理解。如某个标识符取名为rowofscreen,若写成RowOfScreen或row-of-screen就容易理解了。但名字也不是越长越好,太长了,书写与输入都易出错,必要时用缩写名字,但缩写规则要一致。,(2)程序应加注释。注释是程序员与读者之间通信的重要工具,用自然语言或伪码描述。它说明了程序的功能,特别在维护阶段,对理解程序提供了明确指导。注释分序言性注释和功能性注释。,序言性注释应置于每个模块的起始部分,主要内容有:,说明每个模块的用途、功能。,说明模块的接口即调用形式、参数描述及从属模块的清单。,数据描述:指重要数据的名称、用途、限制、约束及其他信息。,开发历史:指设计者、审阅者姓名及日期,修改说明及日期。,功能性注释嵌入在源程序内部,说明程序段或语句的功能以及数据的状态。注意以下几点:,注释用来说明程序段,而不是每一行程序都要加注释。,使用空行或缩进或括号,以便很容易区分注释和程序。,修改程序也应修改注释。,2.数据说明,为了使数据定义更易于理解和维护,有以下指导原则:,(1)数据说明顺序应规范,使数据的属性更易于查找,从而有利于测试、纠错与维护。例如按常量说明、类型说明、全程量说明及局部量说明顺序。,(2)一个语句说明多个变量时,各变量名按字典序排列。,(3)对于复杂的数据结构,要加注释,说明在程序实现时的特点。,3.语句构造,语句构造的原则为:简单直接,不能为了追求效率而使代码复杂化。为了便于阅读和理解,不要一行多个语句。不同层次的语句采用缩进形式,使程序的逻辑结构和功能特征更加清晰。要避免复杂的判定条件,避免多重的循环嵌套。表达式中使用括号以提高运算次序的清晰度等。,4.输入和输出,在编写输入和输出程序时考虑以下原则:,(1)输入操作步骤和输入格式尽量简单。,(2)应检查输入数据的合法性、有效性,报告必要的输入状态信息及错误信息。,(3)输入一批数据时,使用数据或文件结束标志,而不要用计数来控制。,(4)交互式输入时,提供可用的选择和边界值。,(5)当程序设计语言有严格的格式要求时,应保持输入格式的一致性。,(6)输出数据表格化、图形化。,输入、输出风格还受其他因素的影响,如输入、输出设备,用户经验及通信环境等。,5.效率,效率指处理机时间和存储空间的使用,对效率的追求明确以下几点:,(1)效率是一个性能要求,目标在需求分析给出。,(2)追求效率建立在不损害程序可读性或可靠性基础之上,要先使程序正确,再提高程序效率;先使程序清晰,再提高程序效率。,(3)提高程序效率的根本途径在于选择良好的设计方法、良好的数据结构与算法,而不是靠编程时对程序语句做调整。,总之,在编码阶段,要善于积累编程经验,培养和学习良好的编程风格,使编出的程序清晰易懂,易于测试与维护,从而提高软件的质量。,6.3程序设计方法,6.3.1关于GOTO语句的争论,早在1963年,针对当时流行的ALGOL语言,PeterNaur指出,在程序中大量地、没有节制地使用GOTO语句,会使程序结构变得非常混乱。但是很多人还不太注意这一问题,以至于许多人写出来的程序仍然是纷乱如麻的。1965年,E.W.Dijkstra在一次会议上提出,应当把GOTO语句从高级语言中取消,并提出,程序的质量于程序中包含的GOTO语句的数量成反比。在这种思想的影响下,当时新开发的几种高级程序设计语言都取消了GOTO语句。1966年,Bohm与Jacopini证明了任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。,1968年,Dijkstra在写给杂志编辑部的信中再次建议从一切高级语言中取消GOTO语句,只使用三种基本控制结构编写程序。他的建议引起了激烈争论。争论集中在如何看待GOTO语句的问题上。赞成取消GOTO语句的一方认为,GOTO语句对程序清晰性有很大破坏作用,凡是使用GOTO语句多的程序,其控制流时而GOTO向前,时而GOTO向后,常常使程序变得很难理解,从而增加差错和维护的困难,降低程序的可维护性。但另一方认为,GOTO语句虽然存在着破坏程序清晰性的问题,但不应完全禁止。因为GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,并且GOTO语句可直接得到硬件指令的支持。,经过争论,人们认识到,不是简单的去掉GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,以显著提高软件生产率和软件质量,降低软件维护的成本。,6.3.2结构化程序设计的原则,综合在围绕GOTO语句的争论中众多学者的意见,对结构化程序设计的概念逐渐清晰起来。其主要的原则有:,使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。选用的控制结构只准许有一个入口和一个出口。程序语句组成容易识别的块(Block),每块只有一个入口和一个出口。复杂结构应该用基本控制结构进行组合嵌套来实现。语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致。严格控制GOTO语句,仅在下列情形才可使用:用一个非结构化的程序设计语言去实现一个结构化的构造。在某种可以改善而不是损害程序可读性的情况下。,例:设在闭区间a.b上函数F(X)有唯一的一个零点,如图所示。下面给出一个用C语言写出的程序段,用二分法求方程F(X)0在区间a.b中的根。程序段中X0、X1是当前求根区间X0.X1的下上界,Xm是该区间的中点,eps是一个给定的很小正数,用于迭代收敛的判断。在程序上采取了用goto语句和标号finish控制在循环中途转出循环。,程序段1,这类循环结构出现了两个循环出口。一个是for循环的正常出口:当循环控制变量i超出了循环终值n时退出循环;另一个是for循环的非正常出口:当某种条件满足时,从循环中间某处转出循环,执行循环后面的语句。它不满足结构化的要求。,作为对照,再看下面的两个程序段:,这段程序仍然不是结构化的程序,利用了C语言中的一个语句break,它的功能是将控制转移到它所在循环的后面第一个后续语句处。它与【程序段1】完成的工作相同,由于将转移语句与转出条件的判断直接联系在一起,可读性较好。,再看【程序段3】,它利用了一个布尔变量finished,该变量的初值为false,当循环中求到了要求的结果时,将此变量的值改变为true,表示循环应结束,while循环测试到finished为true,就自动退出循环,执行后续的语句。,此程序段中各种结构均为单入口与单出口,且没有GOTO语句,可以说它是一个结构化程序。它的结构很简单,只有一重循环,但由于引入一个布尔变量来控制循环结束,可读性比【程序段1】与【程序段2】要差。在只有一重循环的情形,差的程度还不很明显,在多重循环的情形,引入多个布尔变量,可读性就很差了。理解程序的时间差几倍到几十倍不止。因此,对于这种单入口多出口的循环,用GOTO可以得到较好的清晰性。,6.3.3程序设计自顶向下,逐步求精,关于逐步细化的方法,N.Wirth曾做过如下说明:“我们对付一个复杂问题的最重要的方法就是抽象。因此,对于一个复杂的问题,不要基于马上用计算机指令、数字和逻辑符号来表示它,而应当先用较自然的抽象的语句来表示,从而得到抽象的程序。抽象程序对抽象的数据类型进行某些特定的运算,并用一些合适的记号(可以是自然语言)来表示。下一步对抽象程序再做分解,进入下一个抽象的层次。这样的细化过程一直进行下去,直到程序能被计算机接受为止。此时的程序已经用某种高级语言或及其指令书写的了。”,例如,要求用筛选法求100以内的素数。筛选法就是从2到100中去掉2,3,9,10的倍数,剩下的就是100以内的素数。为了解决这个问题,可先按程序功能写出一个框架。,上述框架中每一个加工语句都可进一步细化成一个循环语句。,下一步继续对3.1和4.1细化下去,直到最后每一个语句都能直接用程序设计语言来表示为止。,6.3.3语句结构,在设计阶段确定了软件的逻辑结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句复杂化。,(1)在一行内只写一条语句,并采取适当的缩进格式,使程序的逻辑和功能变得更加明确。例如,许多程序设计语言允许在一行内写多条语句,但这种方式会使程序的可读性变得很差。,例如有一段排序程序如下:,上例程序由于一行中包括了多个语句,掩盖了程序的循环结构和选择结构,使其可读性变得很差,这里,将此程序段改成如下形式:,(2)程序编写应首先考虑清晰性,不要可以追求技巧性,使程序编写得过于紧凑。随着硬件技术的发展,软件人员的开发环境越来越优越,在大容量和高速度的条件下,开发人员不必在程序中精心设置技巧。与此相反,软件工程技术要求软件生产工程化、规范化,为了提高程序的可读性,减少出错的可能性,提高测试和维护的效率,要求把程序的清晰性放在首位。因此,写出的程序必须让人很容易读懂。,例如,有一个PASCAL语句片段:,此段程序可能不易看懂,如果给AI赋值3,给AT赋值5,在运算后发现交换了AI和AT中的内容。其目的就是为了节省一个内存单元。如果略微修改,就能一目了然。,(3)除非对效率有特殊的要求,程序编写要做到清晰第一,效率第二。不要为了追求效率而丧失了清晰性。事实上,程序效率的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论