软件工程 编码_第1页
软件工程 编码_第2页
软件工程 编码_第3页
软件工程 编码_第4页
软件工程 编码_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第8章编码4学时不同瓷砖特点,砌砖风格,砌墙的手艺,砌墙的规范

程序语言特点,编程风格,编程基本功,编程规范程序编码就好比建筑工程中最基础的砌砖和泥工作一样是工程的基础,是设计的具体实施。引言——手艺太差了手艺不错,规范屋里的墙

砖的应用不合适第8章编码1)程序设计语言的特点2)选择程序设计语言的一般原则3)培养良好的编程习惯4)编程标准掌握了解掌握理解要求8.1程序设计语言程序设计语言是:人与计算机通信的最基本工具。程序设计语言的特性不可避免地会影响开发人员的思路和解决问题的方式,会影响代码的可理解性和可维护性。编码之前的一项重要工作就是选择一种适当的编程语言。不同的语言适用于不同的应用COBOL语言:数据处理程序JAVA语言:跨平台的网络编程PHP语言专门用来编写网页处理程序Perl语言更适合文本处理C语言被广泛用于系统软件开发8.1.1程序设计语言的特点-技术方面一旦确定了软件需求之后,待选用的程序设计语言的技术特性就显得非常重要了。如果需要复杂的数据结构,就要仔细衡量有哪些语言能提供这些复杂的数据结构描述。如果软件要求高性能及实时处理能力,就该选用适合于实时处理的语言,如C或汇编语言。如果应用有许多输出报告或繁杂的文件处理,则选用PowerBuilder、Dephi或SQL比较合适。所有程序语言的基本成分都可归纳为4种:数据成分:指明该语言能接受的数据,如各种类型的变量、数组、指针、记录等。作为程序操作的对象,具有名称、类型和作用域等特征。使用前要对这些特征加以说明,数据名称由用户通过标识符命名,类型是说明数据需占用多少存储单元和存放形式,作用域说明数据可被使用的范围。运算成分:指明该语言可执行的运算,如+,-,*、/控制成分:顺序结构、条件选择结构和循环结构传输成分:数据的传输方法,例如输入、输出函数8.1.1程序设计语言的特点-语言本身1--101、名字声明预先说明程序中所使用的变量名字,编译程序能够检查程序中出现的名字的合法性,从而帮助程序员发现和改正程序中的错误。但是,有些语言不要求显式地声明程序中所使用的变量名称,它把变量第一次出现时使用的名字看做对这个变量的声明。这样做可能会引入一些很难发现的错误,并且可能会产生严重后果。2、类型声明变量的类型声明确定一个变量的使用方式,有了类型声明,编译程序就能够很容易地发现程序中某个特定类型的变量使用不当的错误。有些语言不要求显式的类型声明,例如FORTRAN语言规定,名字的第一个字母决定它的类型,但是一旦显式地声明了一个变量的类型,则以显式声明为该变量的类型。这很容易造成阅读时的混淆。现代的大多数高级语言都有自定义类型,即允许开发人员定义与特定应用相关的类型,并且可以用自定义类型嵌套定义新的类型。例如,可以定义记录、链表、二叉树等复杂的结构类型。程序设计语言中的类型说明不仅仅是一种安全措施,还是一种重要的抽象机制。3、初始化程序设计中最常见的错误之一就是在使用变量之前没有对变量进行初始化。为了减少发生错误的可能性,应该强迫程序员对程序中所使用的变量进行初始化。另一个办法是在说明变量时由系统给变量赋予一个特殊的标识,表明它尚未初始化,以后如果没给这个变量赋值就企图使用它,系统会发出报警信号。4、程序变量的局部性程序设计的一般原则是变量的名字应该在靠近使用它的地方引入,并且应该只有程序中真正需要它的那些部分才能够访问它。通常有两种提供局部变量的途径:单层局部性和多层局部性。PROGRAMTEST……PROCEDUREA()VAR ARRAYA[20],B[20]:INTEGER;

WORK,I,J:INTEGER;

BEGIN ………… ………… END;PROCEDUREB()VAR ARRAYA[20],B[20]:INTEGER;

WORK,I,J:INTEGER;

BEGIN ………… ………… END;END.程序中过程A和B内的变量是单层局部性的,两个过程中声明的变量的作用范围局限于所在的过程。PROGRAMTEST……PROCEDUREA()VARARRAYA[20],B[20]:INTEGER;WORK,I,J,K:INTEGER;

PROCEDUREB()

VAR ARRAYA[20],B[20]:INTEGER;

WORK,I,J:INTEGER;

BEGIN ………… ………… END;BEGIN ……………………END;…………程序的结构是多层的,模块A中声明的变量与模块B中声明的变量除了变量K之外全部相同。内层模块B中有意义的变量是属于该模块的A[],B[],WORK,I,J和属于外层模块的变量K。要尽量避免内层模块与外层模块定义相同的变量名,容易引起差错,给维护人员理解代码带来很多困难5、程序模块独立性结构化语言提供了控制局部变量可见性的某些手段,主要是在较内层程序模块中定义的变量不能被较外层的程序块访问。由于动态存储分配的缘故,在两次调用一个程序块的间隔中不能够保存局部变量的值。因此,即使只有一两个子程序使用的变量,如果需要在两次调用这些子程序的过程中保存这个变量的值,也必须把这个变量说明成全程的,这将增加维护时发生差错的可能性。因此现在大多数语言提供了静态变量,这种变量可以保存前次调用时的数据,解决了多次调用一个模块时局部变量不能保存的问题。6、循环结构最常见的循环结构有for语句、while-do语句和repeat-until语句,这些语言都是在循环体外判断循环条件。有许多场合需要在循环体内的任意一点测试循环结束条件,如果使用if-then-else语句和附加的布尔变量实现这个要求,则将增加程序长度并且降低程序的可读性。某些程序设计语言考虑到该要求,适当地解决了这个问题。

exit{(标识符)}{when(条件)}这个语句把控制转移到循环语句后面的一条语句或转移到由标识符指定的语句上。7、分支结构简单的分支语句一般不会出现问题,但是多分支的case型语句注意以下2个问题:如果case表达式取的值不在预先指定的范围内,需要用缺省方式处理。在某些程序设计语言中,由case表达式选定的执行语句取决于所有可能执行的语句排列顺序,如果语句顺序排列错了,编译和运行时系统是不会发现这类错误的。8、异常处理程序运行过程中发生的错误或意外事件称为异常。以前大多数程序设计语言在检测和处理异常方面几乎没有给程序员提供任何帮助,程序员只能使用条件控制检测异常,在发生异常时把控制转移到处理异常的程序段。但是,JAVA等一些语言的提供了异常处理机制,程序员可以很容易地利用语言提供的异常处理机制实现错误和异常的处理操作。8、独立编译独立编译意味着能够分别编译各个程序单元,然后再把它们集成为一个完整的程序。一个大程序通常由许多程序单元组成,如果修改了其中任何一个程序单元都需要重新编译整个程序,将大大增加程序开发、调试和维护的成本;反之,如果可以独立编译,则只需要重新编译修改了的程序单元,然后重新连接整个程序即可。独立编译的机制对于开发大型系统极其重要。10、其它特性某些语言带有一些特别的功能,这些功能可实现一些特殊的设计。如MODULA语言和并发PASCAL语言支持并发处理,以及必须彼此通信和协调的分布式进程。因此适应并发的和分布式处理的要求。8.1.1程序设计语言的特点-软件工程方面详细设计能够直接地翻译成程序代码。源程序的可移植性。改善软件可移植性的主要途径是使语言标准化。对于可移植性要求的软件,应该严格遵守相应的标准编写程序代码,不要图一时的省事去使用语言的非标准特性。编译程序效率较高。编译程序首先应该支持独立编译,并且能够发现尽可能多的程序代码错误,辅助程序员提高程序调试效率。尽可能应用代码生成工具。许多语言都有与它相应的编译程序、连接程序、调试程序、代码格式化程序、交叉编译程序、宏处理程序和标准子程序库等。对于提高效率是明智的选择。可维护性。可维护性的前提是代码的可理解性,源程序的可读性、语言的文档化特性是影响可维护性的重要因素。8.1.2程序设计语言的分类按语言级别分类,有低级语言和高级语言之分按照用户要求,有过程式语言和非过程式语言之分按照应用范围,有通用语言和专用语言之分按照使用方式,有交互式语言和非交互式语言之分按照成分性质,有顺序语言、并发语言和分布式语言之分第四代语言,有数据库查询语言DEV2000、程序代码生成器以及其他一些原型语言、形式化规格说明语言等等。

8.1.3选择一种语言要考虑的因素在选择与评价语言时,首先要从应用要求入手,对比各项要求的相对重要性,然后再根据这些要求和相对重要性来选择合适的编程语言。具体选择的考虑:编程人员的水平和编程经历。虽然程序员学习一门新的语言并不困难,但是要熟练地掌握和精通一门语言是需要长期的实践开发积累的。因此,在选择语言时一定要考虑到时间限制和程序员掌握语言的程度,尽可能选择一种程序员熟悉的语言。待开发软件的类型可能不同,一般分为数据库应用软件、实时控制软件、系统级软件、人工智能类软件、军用软件等等。根据软件的类型选择合适的开发语言,例如,FORTRAN语言适合科学计算,PowerBuilder、Dephi、C#等语言适合于信息系统的开发,LISP、PROLOG语言适合于人工智能领域。算法和计算复杂性。待开发软件算法的复杂性不同,应该选择合适的语言,例如,科学计算领域大都选择FORTRAN,因为它的运行性能比较好,但是当今计算机硬件的发展使得运算速度已不再成为瓶颈,因此许多计算型软件普遍采用C/C++语言。然而计算复杂度很高的软件采用汇编语言、人工智能类的语言肯定是不合适的,前者编写代码的工作复杂度太高,后者的运行效率太低,并且这两类语言的科学计算库都很少,可复用的软件元素较少。数据结构的复杂性。有些语言,例如FORTRAN、BASIC语言,定义数据类型的能力非常差,一旦设计中有比较复杂的数据结构,程序员实现时会感到很棘手。而PASCAL、JAVA之类的语言其数据结构描述能力非常强大,为程序员创造了一个很广阔的编程空间。考虑软件的开发成本和时间要求。不仅要考虑当前的开发成本,还要考虑今后的维护成本,如果选择的语言很生僻,即使现在以很快的速度开发出来,将来的维护工作量不得不考虑。软件的可移植性要求。如果目标系统的运行环境不能确定,例如,可能运行在小型机的UNIX操作系统上,也可能运行在大型机的OS/400操作系统上,甚至还要运行在PC机的Windows操作系统环境中,这时选择的开发语言最好是JAVA。这样可以保证软件的跨平台运行。选择语言时,特别是为大型软件选择语言时,一定要考虑可用的软件工具。如果某种语言有支持开发的工具,则开发和调试都会容易。8.2良好的编程习惯程序员编写的代码除了交给计算机运行外,还必须让其他程序员或设计人员能够看懂。如果程序代码的可读性好,则调试和维护的成本就可以大幅度降低,同时可以减小程序运行期间软件失效的可能性,提高程序的可靠性。对于代码编写而言,要求程序具有良好的结构和风格。8.2.1结构化程序设计原则尽量使用语言提供的基本控制结构,即顺序结构、选择结构和重复结构。利用块机制将程序组织成容易识别的块,每块只有一个入口和一个出口。复杂结构应该用基本控制结构组合或嵌套实现。对于语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致严格控制GOTO语句。8.2.2自顶向下、逐步细化在详细设计和编码阶段,还应当采取自顶向下、逐步求精的方法,把一个模块的功能逐步分解,细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。[例3]用筛选法求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

输出A[]中所有没有被剔除的数;----4}8.2.3程序设计风格1)基本要求2)可读性要求3)正确性与容错性要求4)可移植性要求5)输入和输出要求6)重用性要求7)面向对象的程序设计风格1)基本要求程序结构清晰且简单易懂,单个函数的行数一般不要超过100行(特殊情况例外)。算法设计应该简单,代码要精简,避免出现垃圾程序。尽量使用标准库函数(类方法)和公共函数(类方法)。最好使用括号以避免二义性。2)可读性要求

注释程序头,函数头说明:程序标题,该模块功能说明,主要算法说明;接口说明:调用形式,参数描述;子程序清单,有关数据的说明;模块位置:在哪个源文件中,隶属于哪一个软件包;开发历史:包括模块设计者,复审者,复审日期,修改日期及有关说明等主要变量(结构、联合、类或对象):含义的注释。处理过程的每个阶段和典型算法前都有相关注释说明,但是不要对每条语句注释。应保持注释与代码完全一致。2)可读性要求

格式程序格式清晰:一行只写一条语句,一个程序如果写得密密麻麻、分不出层次,是很难看懂的。利用空格、空行和缩进显示程序的逻辑结构,缩进量统一为4个字节。对于嵌套的循环和分支程序,层次不要超过五层。(A<-17)ANDNOT(B<=49)ORC写成

(A<-17)ANDNOT(B<=49)ORC2)可读性要求

程序本身语句力求简单、清晰,不要片面追求效率,程序编写得过于紧凑,使语句复杂化。

DO5I=1,NDO5J=1,N5 V(I,J)=(I/J)*(J/I)V是一个N×N矩阵,当I≠J时,V(I,J)=0;当I=J时,V(I,J)=1。这个程序构思巧妙,但不易理解。如果改成下面的形式,读者很容易了解程序的意图:

DO5I=1,NDO5J=1,NIF(I<>J)THENV(I,J)=1.0ELSEV(I,J)=0.0ENDIF5 CONTINUE2)可读性要求

程序本身(续)编程时尽可能使用已有的库函数。简单变量的运算速度比下标变量的运算要快,程序员可能把语句:

X=A[I]+1/A[I]写成

AI=A[I];X=AI+1/AI因为不必访问数组的下标表量,程序运行效率高,但把一个计算表达式拆成了多个,增加了理解的难度。一旦将来修改可能会改变这几行代码的顺序或在其间插入其它语句,容易引入新的错误。2)可读性要求

程序本身(续)尽量用公共过程或子程序代替具有独立功能的重复代码段,但是如果不具有独立功能的代码不要这样做。使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。尽量使用三种基本控制结构编写程序,使用IFTHENELSE结构实现分支;使用DOUNTIL或DOWHILE来实现循环。2)可读性要求

程序本身(续)避免采用过于复杂的条件测试,少用含有“否定”运算符的条件语句,例如在程序中把:IFNOT((CHAR<=’0’)OR(CHAR>=’9’))THEN……改成IF(CHAR>=’0’)AND(CHAR<=’9’)THEN……2)可读性要求

程序本身(续)避免使用空的ELSE语句和IFTHENIF语句

IF(CHAR>=’A’)THENIF(CHAR<=’Z’)THENPRINT“Thisisaletter。”

ELSE//这个语句的配套IF逻辑上不明确

PRINT"Thisisnotaletter。”2)可读性要求

程序本身(续)避免使用ELSEGOTO和ELSERETURN结构。避免过多的循环嵌套和条件嵌套。数据结构要有利于程序的简化。模块功能尽可能单一化,模块间的耦合能够清晰可见。利用信息隐蔽确保每一个模块的独立性。对递归定义的数据结构尽量使用递归过程。尽量不要修补结构差的程序,而应重新设计和编码。对太大的程序,要分块编写、测试,然后再集成。2)可读性要求

程序本身(续)注意计算机浮点运算的精度限制,不要单独进行浮点数的精确比较,应在严格的容差级范围内检验两个值的差异,其形式为:

|x0﹣x1|<ε其中ε是容差级,其大小取决于具体应用中的精度要求。确保所有变量在使用前都进行了初始化。2)可读性要求(续)

数据说明数据说明的先后次序规范化:简单变量类型说明、数组说明、公用数据块说明、文件说明每个类型说明中可按如下顺序排列:整型量说明 、实型量说明、字符量说明、逻辑量说明1条说明语句中按字母顺序排列,例如:INTEGEREcost,length,price,width3)正确性与容错性要求程序首先是正确,其次是考虑优美和效率。对所有的用户输入,必须进行合法性和有效性检查。不要单独进行浮点数的比较。在计算机中用二进制表示十进制数时,有时二进制数不能准确地表达十进制数,这时浮点数的表示具有不准确性。用它们做比较,其结果常常发生异常情况。解决办法是在严格的容差级范围内检验两个值的差异,其形式为:|x0﹣x1|<ε其中ε是容差级,其大小取决于具体应用中的总体精度要求及所用数值的精度。3)正确性与容错性要求(续)所有变量在调用前必须被初始化。改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。单元测试也是编程的一部分,提交联调测试的程序必须通过单元测试。单元测试时,必须针对类里的每一个public方法进行测试,测试其正确的输入,是否得到正确的输出;错误的输入是否得到相应的容错处理(如异常捕捉处理,返回错误提示等)。4)可移植性要求应当尽量使用语言的标准部分,避免使用第三方提供的接口,以确保程序不受具体的运行环境影响,和平台无关。对数据库的操作,使用符合语言规范的标准接口类例如JDBC,除非程序是运行于特定的环境下,并且有很高的性能优化方面的要求。程序中涉及到的数据库定义和操纵语句,尽量使用标准SQL数据类型和SQL语句5)输入和输出要求任何程序都会有输入输出,输入输出的方式应当尽量方便用户的使用。系统能否为用户接受,很大程度上取决于输入输出的风格。在需求分析和设计阶段就应确定基本的输入输出风格,要避免因设计不当带来操作和理解的麻烦。5)输入和输出要求(续)对所有的输入数据进行检验,从而识别错误的输入,以保证每个数据的有效性。检查输入项各种重要组合的合理性,必要时报告输入状态信息。输入的步骤和操作尽可能简单,并

温馨提示

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

评论

0/150

提交评论