软件实现

通常把编码和测试统称为实现

所谓编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。作为软件工程过程的一个阶段,编码是对设计的进一步具体化,因此,程序的质量主要取决于软件设计的质量。但是,所选用的程序设计语言的特点及编码风格也将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。

无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分。在开发大型软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺,因此,在软件生命周期的每个阶段都不可避免地会产生差错,人们力求在每个阶段结東之前通过严格的技术审查,尽可能早地发现并纠正差错;但是,经验表明审查并不能发现所有差错,此外在编码过程中还不可避免地会引入新的错误。如果在软件投入生产性运行之前,没有发现并纠正软件中的大部分差错,则这些差错迟早会在生产过程中暴露出来,那时不仅改正这些错误的代价更高,而且往往会造成很恶劣的后果。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。

软件测试在软件生命周期中横跨两个阶段。通常在编写出每个模块之后就对它做必要的测述(称为单元测试),模块的编写者和测试者是同个人,编码和单元测试属于软件生命周期的同一个阶段。在这个阶段结束之后,对软件系统还应该进行各种综合测试,这是软件生命周期中的另一个独立的阶段,通常由专门的测试人员承担这项工作。

大量统计资料表明,软件测试的工作量往往占软件开发总工作量的40%以上,在极端情况,测试那种关系人的生命安全的软件所花费的成本可能相当于软件工程其他开发步骤总成本的3-5倍,因此,必须高度重视软件测试工作,绝不要以为写出程序之后软件开发工作就接近完成了,实际上,大约还有同样多的开发工作量需要完成。

仅就测试而言,它的目标是发现软件中的错误,但是,发现错误并不是最终目的。软件工程的根本目标是开发出高质量的完全符合用户需要的件,因此,通过测试发现错误之后还必须诊断并改正错误,这就是调试的目的,调试是测试阶段最困难的工作。

在对测试结果进行收集和评价的时候,软件所达到的可性也开始明朗了,软件可靠性模型使用故障率数据,估计软件将来出现故障的情况并预测软件的可靠性。

7.1 编码

7.1.1 选择程序设计语言

程序设计语言是人和计算机通信的最基本的工具,它的特点必然会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。

适宜的程序设计语言能使根据设计去完成编码时围难最少,可以减少需要的程序测试量,并且可以得出更容易阅读和更容易维护的程序,由于软件系统的绝大部分成本用在生命周期的测试和维护阶段,所以容易测试和容易维护是极端重要的。

使用汇编语言编码需要把软件设计翻译成机器操作的序列,由于这两种表示方法很不相同,因此汇编程序设计既困难又容易出差错,一般说来,高级语言的源程序语句和汇编代码指令之间有个句对多句的对应关系,统计资料表明,程序员在相同时间内可以写出的高级语言语句数和汇编语言指令数大体相同,因此用高级语言写程序比用汇编语言写程序生产率可以提高好几倍,高级语言一般都容许用户给程序变量和子程序赋于含义鲜明的名字,通过名字很容易把程序对象和它们所代表的实体联系起来;其外,高语言使用的符号更符合人的习惯。因此,用高级语言写的程序容易阅读,容易测试,容易维护。

总地来说,高级语言明显优于汇编语言,因此,除了在很特殊的应用领域(例如,对程序执行时间和使用的空间都有严格制的情况:需要产生任意的甚至非法的指令序列;体系结构特殊的微处理机,以致在这类机器上通常不能实现高级语言编译程序),或者大型系统中执行时间非常关键的(或直接依赖于硬件的)一小部分代码需要用汇编语言书写之外,其他程序应该一律用高级语言书写。

为了使程序容易测试和维护以减少软件的总成本,所选用的高级语言应该有理想的模块化机制,以及可读性好的控制结构和数据结构:为了便于调试和提高软件可靠性,语言特点应该使编译程序能够尽可能多地发现程序中的错误;为了降低件开发和维护的成本,选用的高级语言应该有良好的独立编译机制。

上述这些要求是选择程序设计语言的理想标准,但是,在实际选择语言时不能仅仅使用理论上的标准,还必须同时考虑实用方面的各种限制,下面是主要的实用标准。

(1)系统用户的要求,如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序。
(2)可以使用的编译程序,运行目标系统的环境中可以提供的编译程序往往限制了可以选用的语言的范围。
(3)可以得到的软件工具。如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易。
(4)工程规模,如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种供这个工程项目专用的程序设计语言,可能是一个正确的选择(5)程序员的知识,虽然对于有经验的程序员来说,学习一种新语言并不困难,但是要完全掌握一种新语言却需要实践,如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟的语言。
(6)软件可移植性要求,如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。
(7)软件的应用领域。所谓的通用程序设计语言实际上并不是对所有应用领域都同样适用,例如, FORTRAN语言特别适合于工程和科学计算, COBOL语言适合于商业领域应用,C语言和Ada语言适用于系统和实时应用领域,LISP语言适用于组合问题领城, PROLOG语言适于表达知识和推理。因此,选择语言时应该充分考虑目标系统的应用范围

7.1.2 编码风格
源程序代码的逻辑简明清晰,易读易懂是好程序的一个重要标准,为了做到这一点应该遵循下述规则

1.程序内部的文档
    所谓程序内部的文档包括恰当的标示符、适当的注释和程序的视觉组织等。
    选取含义鲜明的名字,使它能正确地提示程序对象所代表的实体,这对于帮助阅读者理解程序是很重要的。如果使用缩写,那么缩写规则应该一致,并且应该给每个名字加注解。
    注解是程序员和程序读者通信的重要手段,正确的注解非常有助于对程序的理解通常在每个模块开始处有一段序言性的注解,简要描述模块的功能,主要算法,接口特点重要数据以及开发简史。插在程序中间与一段程序代码有关的注解,主要解释包含这段代码的必要性,对于用高级语言书写的源程序,不需要用注解的形式把每个语句译成自然语言,应该利用注解提供一些额外的信息。应该用空格或空行清楚地区分注解和程序,注解的内容一定要正确,错误的注解不仅对理解程序毫无帮助,反而会妨碍对程序的理解。
    程序清单的布局对于程序的可读性也有很大影响,应该利用适当的阶梯形式使程序的层次结构清断明显。

2.数据说明
    虽然在设计期间已经确定了数据结构的组织和复杂程度,然而数据说明的风格却是在写程序时确定的,为了使数据更容易理解和护,有一些比较简单的原则应该遵循。
    数据说明的次序应该标准化(例如,按照数据结构或数据类型确定说明的次序)。有次序就容易查阅,因此能够加速测试,调试和维护的过程。
    当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。
    如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。

3.语句构造
    设计期间确定了软件的逻辑结构,然而个别语句的构造却是编写程序的一个主要任务。构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复余。下述规则有助于使语句简单明了。

不要为了节省空间而把多个语句写在同一行。
尽量避免复杂的条件测试
尽量减少对“非”条件的测试。
避免大量使用循环嵌套和条件嵌套。
利用括号使逻辑表达式或算术表达式的运算次序清晰直观。

4,输入输出

在设计和编写程序时应该考虑下述有关输人输出风格的规则。
对所有输人数据都进行检验
检查输人项重要组合的合法性。
保持输入格式简单
使用数据结束标记,不要要求用户指定数据的数目
明确提示交互式输入的请求,详细说明可用的选择或边界数值。
当程序设计语言对格式有严格要求时,应保持输入格式一致。
设计良好的输出报表。
给所有输出数据加标志

5.效率
效率主要指处理机时间和存储器容量两个方面。虽然值得提出提高效率的要求,但是在进一步讨论这个问题之前应该记住3条原则,首先,效率是性能要求,因此应该在需求分析阶段确定效率方面的要求,软件应该像对它要求的那样有效,而不应该如同人类可能做到的那样有效。其次,效率是靠好设计来提高的,第三,程序的效率和程序的简单程度是一致的,不要鞋程序的清晰性和可读性来不必要地提高效率,下面从3个方面进一步讨论效率问题。

(1)程序运行时间
程序的效率直接由设计阶段确定的算法的效率决定,但是,写程序的风格也能对程序的执行速度和存储器要求产生影响,在把详细设计结果译成程序时,总可以应用下述规则。

写程序之前先简化算术的和逻辑的表达式。
仔细研究嵌套的循环,以确定是否有语句可以从内层往外移。
尽量避免使用多维数组。
尽量避免使用指针和复杂的表。
使用执行时间短的算术运算。
不要混合使用不同的数据类型。
尽量使用整数运算和布尔表达式。

在效率是决定性因素的应用领城,尽量使用有良好优化特性的编译程序,以自动生成高效目标代码

(2)存储器效率
在大型计算机中必须考虑操作系统页式调度的特点,一般来说,使用能保持功能的结构化控制结构,是提高效率的好方法。

在微处理机中如果要求使用最少的存储单元,则应选用有紧缩存储器特性的编译程序,在非常必要时可以使用汇编语言。

提高执行效率的技术通常也能提高存储器效率,提高存储器效率的关键同样就“简单”

(3)输入输出的效率

如果用户为了给计算机提供输入信息或为了理解计算机输出的信息,所需花费的脑力劳动是经济的,那么人和计算机之间通信的效率就高。因此,简单清晰同样是提高人机通信效率的关键

硬件之间的通信效率是很复杂的间题,但是,从写程序的角度看,却有些简单的原则可以提高输入输出的效率。例如:
所有输人输出都应该有缓冲,以减少用于通信的额外开销。
对二级存储器(如磁盘)应选用最简单的访问方法。
二级存储器的输人输出应该以信息组为单位进行。
如果“超高效的”输人输出很难被人理解,则不应采用这种方法。
这些简单原则对于软件工程的设计和编码两个阶段都适用

发布了39 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/FRESHET/article/details/100669267