? 2008 BUPT TSEG
软件工程模型与方法
Models & Methods of Software
Engineering
第十一章 软件实现修佳鹏 xiujiapeng@bupt.cn
2? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心本章内容
11.1 软件实现概述
11.2 程序设计语言与集成开发环境
11.3 程序设计方法
11.4 程序设计风格
11.5 程序效率
3? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.1软件实现概述
本节内容
11.1.1软件实现的目标
11.1.2软件实现的任务
4? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.1软件实现概述
从 宏观上 讲,软件实现包括详细设计、程序编码、单元测试和集成测试 。
从 微观上 来讲,软件实现指程序编码和单元测试 。
程序编码是详细设计的继续,程序编码过程的组织方式,编程语言特性和程序设计风格会对软件的质量即可靠性、可读性、
可测试性和可维护性等产生深远的影响。
5? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.1.1软件实现的目标
软件实现的 目标 就是选择某种程序设计语言,将详细设计结果进行编码实现,并形成可执行的软件系统的过程。
程序编码 作为软件工程过程的一个阶段,
是详细设计的继续,其输入是,详细设计说明书,,输出是源程序和可执行程序。
6? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.1.2软件实现的任务
( 1)程序设计语言的选择。根据软件系统的特点和设计方案,选择一种或多种程序设计语言作为编码实现的工具

( 2)集成开发环境的选择。集成开发环境是来帮助程序设计者组织、编译、调试程序的开发工具软件。
( 3)程序实现算法的设计。针对要实现特定功能的程序模块,设计其实现所需的数据结构和算法。
( 4)程序编码实现。明确了上述任务之后,在集成开发环境中使用该程序设计语言,按照设计好的算法和数据结构,将程序实现,并通过集成环境进行调试,发现并改正错误,完成程序编码工作,输出正确的可执行程序。
7? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.2程序设计语言与集成开发环境
11.2.1程序设计语言简介
11.2.2程序设计语言的选择
11.2.3集成开发环境简介
11.2.4集成开发环境的选择
8? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.2.1程序设计语言简介
程序设计语言,通常简称为编程语言,是一组用来定义计算机程序的语法规则。
它是一种被标准化的交流技巧,用来向计算机发出指令。
一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
9? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心机器语言
机器语言是由机器指令代码组成的语言,
是计算机唯一能够直接识别的语言,由 0和
1构成,是最早期人与计算机交互的程序语言。
用机器语言编写程序,对程序员要求相当高
机器语言难于记忆和理解,编写的程序很不直观,虽然运行效率高,但是出错率也高
10? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心汇编语言
汇编语言比机器语言直观,用助记符代替操作码,用地址符号或标号代替地址码,
所以汇编语言亦称为符号语言。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快
,占内存空间少等优点。
汇编语言依赖于具体的机型,不能通用,
也不能在不同机型之间移植。
11? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心高级程序设计语言
高级程序设计语言从 20世纪 50年代末至 60
年代初开始兴起,它用更接近自然语言的方式表示要完成的操作,高级程序设计语言易理解、易使用、易维护,已经成为目前程序编码的主要工具,按照不同的角度可以分为,
编译语言与解释语言 ;
结构化语言与面相对象语言 ;
通用语言与专用语言,
12? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心第四代语言
第四代语言 (Fourth-Generation Language,以下简称 4GL)是一种面向问题的程序设计语言,实现了在更高一级层次上的抽象,可以极大地提高软件生产率,缩短软件开发周期。
按照 4GL的功能可以将其划分为查询语言和报表生成器、图形语言、应用生成器、形式规格说明语言等几类。
13? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.2.2程序设计语言的选择
程序设计语言的选择是程序编码的第一步,开发人员需要根据软件类型、质量要求、技术水平等多方面进行综合考虑,选择适当的程序设计语言
,一般从以下几个方面考虑,
软件的应用领域 ;
系统用户的要求 ;
现有的工具环境 ;
开发环境成本;
程序员的水平 ;
软件可移植性的要求 ;
14? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心常见的程序设计语言
15? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心程序语言的应用领域应用领域 主要语言商业 COBOL,C++,JAVA
科学 FORTRAN,C,C++,JAVA
系统 C,C++,JAVA
人工智能 LISP,Prolog
出版 TeX,Postscript
文本等的处理 UNIX shell,TCL,Perl
16? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.2.3集成开发环境简介
集成开发环境( IDE,Integrated
Development Environment),通常指运行在 Windows操作系统中的图形界面软件系统
,其将编辑源程序、调试程序、生成可执行文件等功能集成到一起,极大方便了程序员的编程工作。
IDE基本组成:
一个编辑器
一个编译器工具链
一个调试器
17? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
IDE的功能
项目和源代码的管理功能 ;
源代码编辑提示功能 ;
编辑功能。包括复制、粘贴、查找、替换等 ;
程序跟踪调试功能 ;
生成可执行文件功能 ;
与其他插件结合的功能 ;
屏幕管理功能。
18? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心常见集成开发环境
目前比较常用的 IDE包括:微软公司的 Visual
Studio,开源的 JAVA集成开发环境 Eclipse,
Borland公司的 Delphi,C++ Builder,JBuilder等
使用 IDE进行程序编码的优点有,
快速生成项目的文件结构 ;
快速生成源文件的框架代码 ;
具有提示功能,快速找到需要使用的数据结构和函数 ;
能够提示详细的调试信息,有利于快速发现错误 ;
方便完成复杂的部署工作。
19? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.2.4集成开发环境的选择
每种程序设计语言都有多种由不同厂家、不同机构提供的集成开发环境,这些集成开发环境在外观、易用性、能力等方面都存在着一些差异,在选择集成开发环境的时候,主要考虑以下因素:
程序员的熟悉程度 ;
开发环境的费用 ;
软件的易用性 ;
集成环境的成熟度 ;
与其他软件的配合 ;
软件规模。
20? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.3程序设计方法
本节内容
11.3.1结构化程序设计方法
11.3.2面向对象程序设计方法
21? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.3程序设计方法
所谓程序设计方法学就是讨论程序的性质
、程序设计理论和方法的科学,包含的内容非常丰富,包括:
结构化程序设计
面向对象程序设计
程序正确性证明
程序变换
程序的形式说明与推导
程序综合
自动程序设计
22? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.3.1结构化程序设计方法
结构化程序设计技术是在 20世纪 60年代末
,70年代初为了解决“软件危机”而提出来的,结构化程序设计策略确实提高了程序的执行效率,减少了程序出错的概率,极大减少了维护的费用。
其基本思想:
,自顶向下,逐步求精”,即将程序按照功能划分为若干个基本模块,每个模块内部均是由顺序、选择和循环三种基本结构组成。
23? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心结构化程序设计的基本原则
( 1)使用语言中的顺序、分支、循环等有限的基本控制结构表示程序逻辑 ;
( 2)选用的控制结构只准许有一个入口和一个出口 ;
( 3)程序语句组成容易识别的块,每块只有一个入口和一个出口 ;
( 4)复杂结构应该用基本控制结构进行组合嵌套来实现 ;
( 5)语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致 ;
( 6)严格控制 GOTO语句,
24? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
“自顶向下,逐步求精”方法
25? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
“自顶向下,逐步求精”方法
例如,要求用筛选法求 100以内的素数,
main ( ) {
建立 2到 100的数组 A[ ],其中 A[i]= i; - - - - - - - - 1
建立 2到 10的素数表 B[ ],其中存放 2到 10以内的素数;
- - - - 2
若 A[i]= i是 B[ ]中任一数的倍数,则剔除 A[i]; - - - - 3
输出 A[ ]中所有没有被剔除的数; - - - - - - - - - 4
}
上述框架中每一个加工语句都可进一步细化成一个循环语句。
26? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
“自顶向下,逐步求精”方法
main ( ) {
/*建立 2到 100的数组 A[ ],其中 A[i]= i*/ - - - - - - - - - - - - - - - - - 1
int A[101];
for ( i = 2; i <= 100; i++) A[i] = i;
/* 建立 2到 10的素数表 B[ ],其中存放 2到 10以内的素数 */ - - - - - 2
B[1] =2; B[2] = 3; B[3] = 5; B[4] = 7;
/*若 A[i]= i是 B[ ]中任一数的倍数,则剔除 A[i]*/ - - - - - -- - - - - 3
for ( j = 1; j <= 4; j++)
检查 A[ ]所有的数能否被 B[j]整除并将能被整除的数从 A[]中剔除; 3.1
/*输出 A[ ]中所有没有被剔除的数 */ - - - - - - - - - - - - - - - - - - -4
for ( i = 2; i <= 100; i++)
若 A[i]没有被剔除,则输出之; - - - - - - - - -- - - - - - - - - - - - -4.1
}
27? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
“自顶向下,逐步求精”方法
main ( ) {
for ( i = 2; i <= 100; i++) A[i] = i;
B[1] =2; B[2] = 3; B[3] = 5; B[4] = 7;
/*若 A[i]= i是 B[ ]中任一数的倍数,则剔除 A[i]*/
for ( j = 1; j <= 4; j++)
/*检查 A[ ]所有的数能否被 B[j]整除并将能被整除的数从 A[ ]中剔除 */
for ( i = 2; i <= 100; i++)
if ( A[i]/ B[j]*B[j] == A[i]) A[i] = 0;
/*输出 A [ ]中所有没有被剔除的数 */
for ( i = 2; i <= 100; i++)
/*若 A[i]没有被剔除,则输出之 */
if ( A[i] != 0)
printf(,A[%d]= %d\n”,i,A[i]);
}
28? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.3.2面向对象程序设计方法
面向对象的方法是一种分析方法、设计方法和思维方法 。
在面向对象程序设计过程中,类的实现是核心问题。所有的数据和操作都被封装在类的实例中,而整个应用则被封装在一个更高级的类中。
在应用软件的主类中,通过各个类的实例
,实现对象之间的通信和操作,从而建立所要实现的应用软件。
29? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心类的关系
一个类的实现常常在某些方面依赖于其它类的实例,所以实现类的时候就会涉及到处理类之间的关系。类的关系可以是应用级关系,也可以是类内属性的实现关系,下面介绍三种类继承实现方式,
( 1) 针对实现的继承 ;
( 2) 针对特殊化的继承 ;
( 3) is kind of (是一种 …) 继承,
30? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心类的实现
类的实现有多种方案,其中一种方案是先开发一个比较小的、简单的类,作为开发比较大的、复杂的类的基础,实现时需要考虑如下内容,
( 1) 软件库( Software Base) ;
( 2)复用( Reuse) ;
( 3) 断言( Assertions) ;
( 4) 调试( Debugging) ;
( 5) 错误处理( Error Handling) ;
( 6)内建错误处理( Built_In Error Handling ;
( 7)用户定义的错误处理( User_Defined Error
Handling) ;
( 8) 多重实现( Multiple Implementation)。
31? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心应用程序的实现
应用程序的实现是在所有的类都被实现之后的事情。 使用面向对象方法 实现应用程序比用过程化方法 更加 简单,快捷。
当我们把类开发出来后,就已经实现了应用程序的大部分工作。每个类提供了完成应用程序所需要的某种功能。
在实现应用时,根据业务需求,创建这些类的实例对象,并通过消息交互,共同完成系统功能。
32? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4程序设计风格
本节内容
11.4.1源程序文档化
11.4.2数据说明
11.4.3语句结构
11.4.4输入和输出 (I / O)
11.4.5错误处理
33? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4程序设计风格
好的程序设计风格可以极大提高程序的质量,在程序设计中要使程序结构合理、清晰
,加入清晰的注释信息,避免使用逻辑复杂的算法,使用有含义的变量命名方式等等 。
程序设计风格一般表现在 5个方面:源程序文档化、数据说明的方法、表达式和语句结构、输入 /输出方法、错误处理。
34? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.1源程序文档化
1.标识符的命名
标识符即符号名,包括模块名、变量名、常量名
、子程序名、数据区名、缓冲区名、类名、接口名、包名等 。
标识符名应能反映它所代表的实际东西,具有一定实际意义。
名字不是越长越好,过长的名字会使程序的逻辑流程变得模糊,给修改带来困难。
在一个程序中,一个变量只应用于一种用途。就是说,在同一个程序中一个变量不能身兼几种工作。
35? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.1源程序文档化
2.程序的注释
一些正规的程序文本中,注释行的数量占到整个源程序的 1/ 3到 1/ 2,甚至更多。注释一般分为以下两种:
( 1)序言性注释,
通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。
( 2)功能性注释,
嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,不要解释具体是怎么做的。
36? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.1源程序文档化
3.源程序布局
源程序布局指源程序的代码编排格式。在源程序中,可以利用空格、空行和移行,
提高程序的可视化程度。
这样可使程序的逻辑结构更加清晰,层次更加分明。
37? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.2数据说明
声明数据结构的过程叫做数据说明。在编写程序时,要尽量遵循数据说明的风格。
为了使程序中数据说明更易于理解和维护,必须注意以下几点。
数据说明的次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护;
当多个变量名用一个语句说明时,应当对这些变量按字母的顺序排列 ;
如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的用途和特点。
38? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.3语句结构
在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句复杂化。一般应从以下方面加以注意:
一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确;
程序编写首先应当考虑清晰性,不要刻意追求技巧性
,使程序编写得过于紧凑 ;
程序编写得要简单,写清楚,直截了当地说明程序员的用意 ;
除非对效率有特殊的要求,程序编写要做到清晰第一
,效率第二 ;
39? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.3语句结构
首先要保证程序正确,然后才要求提高速度 ;
让编译程序做简单的优化 ;
尽可能使用库函数 ;
避免使用临时变量而使可读性下降 ;
尽量用公共过程或子程序去代替重复的功能代码段 ;
用调用公共函数去代替重复使用的表达式 ;
使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序 ;
避免不必要的转移 ;
尽量只采用三种基本的控制结构来编写程序 ;
40? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.3语句结构
用逻辑表达式代替分支嵌套 ;
避免使用空的 ELSE语句和 IF…THEN IF… 的语句 ;
避免使用 ELSE GOTO和 ELSE RETURN结构 ;
使与判定相联系的动作尽可能地紧跟着判定 ;
避免采用过于复杂的条件测试 ;
尽量减少使用“否定”条件的条件语句 ;
避免过多的循环嵌套和条件嵌套 ;
不要使 GOTO语句相互交叉 ;
避免循环的多个出口 ;
使用数组,以避免重复的控制序列等。
41? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.4输入和输出 (I / O)
不论是批处理的输入/输出方式,还是交互式的输入/输出方式,在设计和程序编码时都应考虑下列原则:
对所有的输入数据都进行检验 ;
检查输入项的各种重要组合的合理性 ;
使得输入的步骤和操作尽可能简单 ;
输入数据时,应允许使用自由格式输入 ;
应允许缺省值 ;
输入一批数据时,最好使用输入结束标志 ;
屏幕上给出状态信息 ;
应保持输入格式与输入语句的要求一致 ;
给所有的输出加注解,并设计输出报表格式。
42? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.4.5错误处理
错误处理大致可包含两类技术:
避开错误技术,在开发过程中不让错误潜入软件;
容错技术:对某些无法避开的错误,使其影响减到最小 。
要考虑以下错误处理方法,
返回错误代码 ;
调用错误处理函数 ;
显示错误信息 ;
记录日志 ;
退出程序 。
43? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.5程序效率
11.5.1讨论效率的准则
11.5.2算法对效率的影响
11.5.3存储效率
11.5.4输入 /输出效率
44? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.5.1讨论效率的准则
程序的效率是指程序的 执行速度 及程序所需 占用的内存的存储空间 。程序效率的几条准则为:
效率是一个性能要求,应当在需求分析阶段确定效率方面的要求 ;
效率是靠好的设计来提高的 ;
程序的效率与程序的简单性相关,但是不要以牺牲程序的清晰性和可读性来提高软件的效率

45? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.5.2算法对效率的影响
指导原则,
尽可能化简有关的算术表达式和逻辑表达式
尽可能将某些语句或表达式移到循环外面 ;
尽量避免使用多维数组 ;
尽量避免使用指针和复杂的二维数组 ;
采用“快速”的算术运算 ;
避免在表达式中出现类型混杂 ;
尽量采用整数算术表达式和布尔表达式 ;
选用等效的高效率算法 。
46? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.5.3存储效率
采用结构化程序设计,将程序功能合理分块,使每个模块或一组密切相关模块的程序体积大小与每页的容量相匹配,可减少页面调度,减少内外存交换,提高存储效率。
建议使用尽可能小的数据类型以节约存储空间,例如用 short取代 int,用 float代替
double,但这会带来一定的精度损失。
47? 2008 BUPT TSEG 北京邮电大学 通信软件工程中心
11.5.4输入 /输出效率
指导原则,
输入/输出的请求应当最小化 ;
安排适当的缓冲区,以减少频繁的信息交换 ;
对辅助存储(例如磁盘),选择尽可能简单的、可接受的存取方法 ;
对辅助存储的输入/输出,应当成块传送 ;
尽可能改善输入/输出的质量和速度 ;
任何不易理解的、对改善输入/输出效果关系不大的措施都是不可取的 ;
任何不易理解的所谓“超高效”的输入/输出是毫无价值的 。