第 5章 程 序 设 计
5.1 开发工具的选择
5.2 程序设计风格
5.3 实 验 四
5.1 开发工具的选择
5.1.1 常用开发工具简介目前市场上可供选择的开发工具很多,不同的开发工具有各自的特点,适合开发不同的应用系统 。 下面简单介绍一些常见的软件开发工具 。
1,传统的程序设计语言比较传统的开发工具是一般的程序设计语言 。 常用的程序设计语言有汇编语言和高级语言 。
汇编语言面向特定的计算机,可移植性差;与机器指令一一对应,程序编写工作量很大,十分繁琐 。 但是汇编语言编写的程序一般效率较高,而且可以直接对计算机底层设备进行操作,在一些对效率要求较高或工业控制的开发项目中经常会用到 。 管理信息系统中一般较少使用 。
高级语言在 20世纪 60年代投入使用,是使用最广泛的程序设计语言,不同的高级语言适用的领域也不尽相同。例如,
早期的高级语言 FORTRAN,主要用于科学计算;有些高级语言为商业数据处理而设计,例如 COBOL语言。
高级语言与汇编语言不同,它不依赖于特定的计算机,
使用高级语言编写的程序可以在不同类型的计算机上使用,
只要这种类型的计算机有该语言的编译程序,因此高级语言具有较好的可移植性 。 使用高级语言编写的程序,一条语句往往对应多条机器指令,因此编程工作量大为减少 。 高级语言形式上更接近自然语言,与汇编语言相比,程序的可读性和可理解性也更好 。
高级语言又可以从应用特点进一步加以分类:
(1) 基础语言 。 其特点是历史悠久,使用广泛,有大量的软件库为人们所熟知 。 这类语言有 BASIC,FORTRAN、
COBOL,ALGOL等 。
(2) 结构化语言 。 其特点是提供结构化的控制结构,有很强的过程处理能力和丰富的数据结构类型,如常见的 PASCAL、
C语言等 。
(3) 专用语言 。 除了上面两类通用语言之外,还有一些专用的程序设计语言,其特点是为某种专门应用设计的具有独特语法形式的语言,应用范围比较狭窄 。 例如,APL语言是为数组和向量运算而设计的 。
高级语言按照其工作方式可分为编译型和解释型。
编译型语言由编译器将源程序翻译为二进制的机器指令,
开发出的软件独立执行,不再需要编译器。常见的高级语言如 C,PASCAL等都是编译型语言。
解释型语言由程序语言解释器读入源程序解释执行,开发出的软件不能脱离解释程序独立执行,软件发行时必须包含语言解释器 。 典型的解释型语言如 BASIC语言 。
下面介绍一下目前使用较多的几种高级语言的特点 。
BASIC语言:是一种解释型的程序设计语言,简单易学,
有很多版本,与编译型的程序设计语言相比,执行速度较慢,
可用于一般的数值计算与事务处理 。 它的早期版本不支持结构化程序设计,不区分数据类型,不适用于较大规模软件的开发 。 1985年,BASIC语言的创始人在美国国家 BASIC标准的基础上,研制了新版本 True Basic,保留了 BASIC语言简单易学的特点,完全支持结构化程序设计,增加或增强了绘图,窗口,矩阵运算等功能 。
COBOL:编译型语言。它是商务处理中应用较广的高级语言,广泛支持与事务处理有关的各种过程技术,使用接近于自然语言的语句,虽然程序不够紧凑,但易于理解。其主要不足是计算功能弱,编译速度也比较慢。
PASCAL语言:编译型语言。它是第一个系统体现结构化程序设计概念的高级语言,控制结构完备,有丰富的数据结构和数据类型,语言表达能力强,移植容易,在科学计算、
数据处理以及系统软件开发中都有较广泛的应用。
C语言:这是一种使用广泛,影响很大的编译型语言 。
它提供了丰富的控制结构以支持结构化程序设计,有丰富的运算符和数据类型 。 C语言最初是在 Unix操作系统下研制的,现已成功地移植到多种微型机与小型机上,因此 C语言程序可移植性极好 。 另外,C语言程序编译质量高,效率高于其它高级语言 。 C语言适用于各种领域,既适于编写系统软件,也可以编写出高效率的应用软件 。
传统的程序设计语言虽然功能强大,但其数据库操作能力很弱,直接使用高级语言实现数据库管理功能工作量很大。开发管理信息系统可以使用一些第三方数据库软件包。
2,第四代语言高级语言通常被称为第三代程序设计语言,是一种过程化的语言 。 编写程序时需要详细描述问题求解的过程,告诉计算机每一步应该,怎么做,。 为了把程序员从繁重的编码中解放出来,出现了第四代程序设计语言 4GL。
4GL一般是非过程化的,具有以下一些特征:
(1) 具有强大的数据管理能力,能对数据库进行有效的存取,
查询和其它相关操作 。
(2) 能提供一组高效的、非过程化的命令,组成语言的基本语句。编程时用户只需用这些命令说明,做什么,,不必描述实现的细节。
(3) 能满足多功能、一体化的要求。为此,语言中除了必须含有控制程序逻辑与实现数据库操作的语句外,还应包含生成与处理报表、图形,以及实现数据运算和分析统计功能的各种语句,共同构成一个一体化的语言,以适应多种应用开发的需要。
最早的第四代语言是关系数据库的结构化查询语言 SQL,
它是 ORACLE,DB2等数据库系统实现的基本语言,具有较强的数据操作能力 。 SQL语言在系统开发中一般不独立使用,而是嵌入在其它语言的程序中使用,帮助完成数据库的操作 。
目前常用的一些开发工具如 Visual FoxPro、
Power Builder等都具有第四代语言的很多特点。另一类与第四代语言相似的开发工具,如 Visual C++、
Visual Basic,Delphi等,虽然使用的传统的程序设计语言,但是它们提供了帮助用户生成各种程序框架的能力,可快速生成数据库应用程序。
3,面向对象的程序设计语言面向对象的程序设计语言可以分为两大类:一类是在传统的面向过程的高级语言基础上加入面向对象的语言成分而形成的,如 C++语言,Object Pascal( Inprise公司的
Delphi开发工具使用该语言 ) 等;另一类是完全的面向对象的程序设计语言,如 SmallTalk,Java等 。
面向对象的程序设计语言是一类很有潜力的开发工具,
支持面向对象的程序设计思想。
4,数据库软件工具管理信息系统开发常使用的另一类开发工具是数据库软件工具产品。目前常见的数据库软件产品有两类,
一类是以微机关系数据库为基础的 XBASE系统,另一类是大型数据库系统。
XBASE系统工具是指以微机为基础所形成的关系数据库机器开发语言,目前主要有 dBASE-Ⅱ,dBASE-Ⅲ,dBASE-Ⅳ
和 FoxBASE 2.0,FoxBASE 2.1以及 FoxPro各种版本。这种系统的特点是以微机和关系数据库系统为基础,并提供了一系列围绕数据库的各种操作、数据处理和程序设计的命令集,简单易学,方便实用。这一类开发工具在 DOS操作系统环境下使用较为广泛,大部分只支持 XBASE类数据库文件的操作,不支持异种数据库的操作,对网络环境的支持较差,不适宜开发客户 /
服务器模式的系统。 dBASE和 FoxPro的 Windows环境的版本在这些方面有一定程度的改进。
大型数据库系统工具是指规模较大、功能较齐全的大型数据系统。目前较典型的系统有 ORACLE,SYBASE、
INGRES,INFOMIX,DB2等。这类系统功能齐全,容量巨大,适合于大型综合类数据库系统的开发。一般配有专门的接口语言,可以允许各类常用的程序设计语言(称为宿主语言)如 C语言等访问数据库内的数据。
5,客户 /服务器与浏览器 /Web服务器应用开发工具根据开发工具所支持的应用程序运行模式的不同,可以将开发工具分为传统开发工具类,客户 /服务器工具类,浏览器
/Web服务器类等 。
当前大部分开发工具均支持客户 /服务器应用系统的开发,
例如微软 Visual Studio系列开发工具,Inprise公司的 Delphi,C++
Builder等,可以根据需要选择。这一类开发工具大部分不仅仅是程序设计语言的编译器,而且是一个完整的开发平台。特别是目前常用的 Windows环境下的开发工具,提供了良好的可视化开发环境,可以方便地构造图形用户界面、连接各种类型的数据库,减少应用系统开发的工作量。不过当前这一类开发工具大部分与操作系统关系密切,系统可移植性较差。
6,可视化开发技术可视化开发是 90年代软件界最大的两个热点之一。随着图形用户界面的兴起,用户界面在软件系统中所占的比例也越来越大,有的甚至高达 60%~ 70%。产生这一问题的原因是图形界面元素的生成很不方便。为此 Windows提供了应用程序设计接口 API( Application
Programming Interface),它包含了 600多个函数,极大地方便了图形用户界面的开发。但是在这批函数中,大量的函数参数和数量更多的有关常量,使基于 Windows API的开发变得相当困难。为此 Borland
C++推出了 Object Windows编程,采用面向对象技术将 Windows API的各部分用对象类进行封装,大大减少了应用程序开发的工作量。但要掌握它们,对非专业人员来说仍是一个沉重的负担。为此人们利用
Windows API或 Borland C++的 Object Windows开发了一批可视化开发工具。
可视化开发就是在可视化开发工具提供的图形用户界面上,通过操作界面元素,诸如菜单,按钮,对话框,编辑框,
单选框,复选框,列表框和滚动条等,由可视化开发工具自动生成应用软件 。
这类应用软件的工作方式是事件驱动。对每一事件,由系统产生相应的消息,再传递给相应的消息响应函数。这些消息响应函数是由可视化开发工具在生成软件时自动装入的。
可视化开发工具可以帮助程序员生成图形用户界面及相关的消息响应函数。通常的方法是先生成基本窗口,并在它的外面以图标形式列出所有其它的界面元素,让开发人员挑选后放入窗口指定位置。在逐一安排界面元素的同时,还可以用鼠标拖动,以使窗口的布局更趋合理。图
5.1是 Inprise公司的 Delphi的可视化开发界面。
由于要生成与各种应用相关的消息响应函数,因此,可视化开发只能用于相当成熟的应用领域,如目前流行的可视化开发工具基本上用于关系数据库的开发。对一般的应用,目前的可视化开发工具只能提供用户界面的可视化开发。至于消息响应函数(或称脚本),则仍需用通常的高级语言编写。只有在数据库领域才提供 4GL,使消息响应函数的开发大大简化。
可视化开发是软件开发方式上的一场革命,它使软件开发从专业人员的手中解放出来,对缓解 80年代中后期爆发的应用软件危机有重大作用。目前 Windows操作系统下常见的开发工具如 Visual Basic,Visual FoxPro,Visual
C++,Delphi,C++Builder等都提供可视化的开发环境,
另外,Inprise公司已开始将 Delphi开发环境移植到 Linux操作系统下。
图形界面元素界面设计窗口界面元素属性设置窗口图 5.1 可视化开发工具
5.1.2 选择开发工具的原则选择合适的开发工具首先应该考虑所选择的开发工具所适用的领域,除此之外一般还应该遵守下面的基本原则:
(1) 最少工作量原则 。 使用最小代价让系统工作 。
(2) 最少技巧性原则 。 最好无需培训或很少培训就能编制程序 。
(3) 最少错误原则 。 对常用的高级语言来说,要提供结构化控制结构,类型检查,数据结构描述,易于检验测试等机制 。
(4) 最少维护原则 。 对一般的高级语言来说,提供软件包结构和独立编译能力 。 独立编译意味着可分别编译各个程序单元,无需因为修改了一个程序单元而重新编译所有的程序 。
(5) 减少记忆原则 。
在系统开发时选择开发工具应具体考虑下面的几个因素:
(1) 项目的应用领域 。 大部分信息系统需要进行大量的数据库操作,所以选择的开发工具应该具有强大的数据库操作能力 。
传统的高级语言如 C,PASCAL等这方面能力较差,一般不宜选择 。 通常可选择一些数据库系统开发工具,如 FoxBASE或一些大型的数据库系统工具如 ORACLE,SYBASE等 。
目前 Windows操作系统下一些可视化开发工具虽然使用的是一些传统的程序设计语言,但也提供了强大的数据库操作能力,
如微软公司 Visual Studio系列的 Visual Basic和 Visual C++以及
Borland公司的 Delphi和 C++ Builder等,也是开发数据库应用程序的较好选择 。
另外,开发客户 /服务器模式或浏览器 /Web服务器模式的应用程序应该注意所选择的开发工具是否支持该模式系统的开发 。
(2) 用户的要求。有时用户要求使用它们熟悉的语言。
(3) 可以使用的编译程序或开发环境 。
很多开发工具只能运行于特定的软硬件环境,例如 Windows环境下一些可视化的开发工具只能在 Windows环境下使用 。 如果选择一般的高级语言,则必须有运行于目标系统运行环境的编译程序 。
(4) 程序员的经验和知识 。 如果条件允许,应尽量选择程序员熟悉的开发工具 。
(5) 软件可移植性要求 。 如果目标系统需要运行于不同的环境,
应选择可移植性较好的程序设计语言 。
5.2 程序设计风格
5.2.1 程序设计风格程序设计风格又叫编码风格或编程风格 。 随着软件规模和复杂性的加大,程序不仅仅要被计算机编译执行,还要经常被人阅读 。 例如,在设计测试用例,查找错误,改正错误时程序都要由程序作者或其他人员阅读 。 因此,程序的可读性变得非常重要 。 程序设计风格指的是在编程时应该遵守的一些原则 。
遵守这些原则可以使程序更容易被阅读和修改 。 一个具有良好风格的程序应具有如下特点:
① 易于测试和维护;
② 易于修改;
③ 设计简单 。 为了使程序易于理解,测试和维护,最好的办法是使程序设计简单 。 坚决摒弃炫耀编程技巧以及把程序设计复杂化的任何想法和做法;
④ 高效 。 对程序中效率要求较高的模块通过改进算法,
数据结构和程序的逻辑结构来提高程序的效率 。
一个逻辑正确但杂乱无章的程序是没有什么价值的,因为它无法供人阅读,难于测试和维护 。 因此,我们应该养成良好的编程风格 。
5.2.2 程序的内部文档一个程序模块不仅要有外部文档 ( 如模块开发卷宗 ),而且程序内部也应该有完整的文档 。 完整一致的内部文档是帮助读者理解程序的重要手段 。 程序的内部文档包括程序的注解和程序的书写格式两个方面 。
1,程序的注解几乎所有的程序设计语言都提供了注解语句,允许程序员对程序进行说明。程序注解主要有两种类型:序言性注解和功能性注解。
序言性注解出现在模块的开始位置,一般包括:
① 模块的全名;
② 模块的功能和性能;
③ 调用格式;
④ 界面描述,包括上级调用模块、本模块调用的下级模块、
输入 /输出参数的含义和类型以及该模块所引用的全局变量等;
⑤ 开发历史,如作者、审查者、日期、修改的日期和修改的描述等内容。
如果一个模块规模较大,其中包含多个函数或子程序,
可以在模块的开始增加目录性注解,说明模块中的函数或子程序的位置和功能 。
功能性注解是指在程序中每个具有独立功能的程序段之前说明该程序段功能的注解。书写功能性注解应该注意以下几个方面:
① 应描述独立功能的程序块,而不是对每个语句加以说明;
② 注解不应是程序语句的重复,而应起补充说明作用;
③ 应使用注解符和空行以便与程序段区分;
④ 注解应与代码一致 。 修改程序时应相应修改程序中对应程序段的注解,因为与程序功能不一致的注解在其它人阅读程序时会引起误解 。
2,程序的书写格式程序代码的书写格式对于程序的可读性也有很多的影响 。
不同的程序设计语言对程序的书写格式要求不一,一些程序设计语言对程序书写格式要求较严格,而有一些程序设计语言书写格式比较随意 。 例如 C语言程序语句的书写格式比 FORTRAN
语言随意得多 。 格式凌乱的程序的可读性将大大降低 。 通常在项目开发过程中应该对程序的书写格式进行规范,以便程序员之间相互协作交流 。
程序书写格式应有助于读者理解程序,一般要注意以下几点:
(1) 不要一行书写多条语句,这样会掩盖程序的逻辑结构 。
虽然现代大部分的程序设计语言都允许在一行中书写多条语句,但这样使程序的结构变得不清楚 。
(2) 用缩排格式限定语句群的边界。缩排格式要显示程序的逻辑结构。常见的一些控制结构都应该使用缩排格式,例如循环语句、条件语句等控制结构的内层语句,应退格书写。下面是 C
语言中的 for语句的例子:
for(i=0; i<100; i++){
sum+=i;
}
条件语句 if可按照下面的格式书写:
if(条件表达式 ){
语句序列 1
}
else{
语句序列 2
}
(3) 在程序段之间,程序段与注解之间用空行和注解符来分割 。
有时也可以借助于一些自动工具来实现一致的程序格式 。
常见的一些格式化工具通常可以对程序中的注解以及控制语句的缩排形式进行规范 。
下面是 Borland C++中提供的一个演示程序的片断,读者可以仔细观察一下它的书写格式 。
/*
GRAPHICS DEMO FOR Borland C++
Copyright (c) 1987,88,91 Borland International,All rights reserved.
From the command line,use:
bcc bgidemo graphics.lib
*/
#ifdef __TINY__
#error BGIDEMO will not run in the tiny model.
#endif
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <graphics.h>
#define ESC 0x1b /* Define the escape key */
#define TRUE 1 /* Define some handy constants */
#define FALSE 0 /* Define some handy constants*/
#define PI 3.14159 /* Define a value for PI */
#define ON 1 /* Define some handy constants*/
#define OFF 0 /* Define some handy constants*/
#define NFONTS11
....../*此处省略了部分结构体类型定义 */
struct PTS {
int x,y;
}; /* Structure to hold vertex points */
int GraphDriver; /* The Graphics device driver */
int GraphMode; /* The Graphics mode value */
doubleAspectRatio; /*Aspect ratio of a pixel on the screen*/
int MaxX,MaxY; /* The maximum resolution of the screen */
int MaxColors; /* The maximum # of colors available */
int ErrorCode; /* Reports any graphics errors */
struct palettetype palette; /* Used to read palette info */
/* */
/* Function prototypes */
/* */
void Initialize(void);
void ReportStatus(void);
void TextDump(void);
void Bar3DDemo(void);
void RandomBars(void);
....../*此处省略了部分内容 */
/* */
/* INITIALIZE,Initializes the graphics systemand reports */
/* any errors which occured,*/
/* */
void Initialize(void)
{
int xasp,yasp; /* Used to read the aspect ratio*/
GraphDriver = DETECT; /* Request auto-detection */
initgraph(&GraphDriver,&GraphMode,"" );
ErrorCode = graphresult(); /* Read result of initialization*/
if( ErrorCode != grOk ){ /* Error occured during init */
printf(" Graphics System Error,%s\n",grapherrormsg( ErrorCode ) );
exit( 1 );
}
getpalette( &palette ); /* Read the palette from board */
MaxColors = getmaxcolor()+ 1; /* Read maximum number of colors*/
MaxX = getmaxx();
MaxY = getmaxy(); /* Read size of screen */
getaspectratio( &xasp,&yasp ); /* read the hardware aspect */
AspectRatio = (double)xasp / (double)yasp; /* Get correction factor */
}
5.2.3 标识符命名的风格标识符的命名是程序风格的重要内容,标识符包括变量名,函数名,子程序名,文件名等 。 标识符的选择不应该仅仅是满足程序设计语言的语法限制,好的标识符对程序的可读性有很大的影响 。
变量是程序设计中用得最多的标识符之一,下面我们主要讨论变量命名的风格 。
1,变量命名的一般原则初学程序设计语言的人往往习惯使用一些比较随意的变量名,
如 x,y,x1等,当程序规模较大时,这一类变量看起来很混乱,从变量名上难以判断变量的类型和作用,而且往往会出现很多相似的变量名,使程序的可读性降低 。 软件开发规范要求变量命名应该做到以下几点:
(1) 使用有意义的变量名 。 变量命名应能反映变量的意义和含义,以使它能正确地提示该程序对象所代表的实体,并能帮助读者理解和记忆 。 例如:
d=s*t;
就不如
distance=speed*time;
(2) 使用不易混淆的变量名 。 过于相似的变量名,容易引起输入错误和误解 。
(3) 同一变量名不要具有多种含义 。 这种情况使读者在阅读程序时易于误解,也不便于修改 。
(4) 显式说明一切变量 。 为了易于理解和避免出错,所有变量都应该显式说明然后再使用 。 有些程序设计语言允许对变量名不进行说明就直接使用 。 例如 FORTRAN语言,BASIC语言等,在使用这些语言编程时应特别注意,由于变量可以不定义直接使用,在输入源程序时如果变量名输入错误,编译器也不能检测 。 其它一些高级语言如 C,PASCAL等程序设计语言不允许使用未定义的变量,在编程时可避免这一类错误 。
(5) 对变量名作出注解,说明其含义。
2,匈牙利命名规则近年来影响较大的标识符命名规则是匈牙利命名规则,它是由匈牙利人 Charles Simonyi于 1972年发明的一种给变量取名字的方式。最初这种命名规则并没有得到足够的重视,自从微软公司在 Windows中使用了该命名规则之后,才得到广泛的应用。下面是 Windows API中函数 CreateWindow的原型说明:
HWND CreateWindow( LPCTSTR lpClassName,LPCTSTR
lpWindowName,
DWORD dwStyle,int x,int y,int nWidth,int nHeight,
HWND hWndParent,HMENU hMenu,HANDLE hInstance,
LPVOID lpParam );
这里函数的形式参数的名称使用了匈牙利命名规则,例如第一个参数 lpClassName由两部分构成,lp表示该参数的数据类型,
ClassName表示该参数的含义 。
一般来讲,匈牙利命名规则中变量名的构成如下:
变量名 = <类型 ><限定词 >
其中,类型,为变量的数据类型,,类型,使用小写的英文字母表示,如上面的 lp( Large Pointer) 。,限定词,表示变量的含义,
区分同一类型的不同变量 。 限定词的命名应符合上面所讲软件开发规范的要求 。 限定词的第一个字母必须是大写英文字母 。
类型和限定词之间没有任何分割符,就用限定词的第一个大写字母来标定边界 。 例如,上面函数中形式参数 hMenu,h是类型 ( 表示句柄 handle),Menu是限定词 ( 表示菜单 ) 。
匈牙利命名规则中的,类型,类似于传统程序设计语言中的数据类型 ( 如 C语言的 int,float),但其概念更广,一般可分为图 5.2中所示的三种 。
基类型构成的类型加类型前缀构成的类型加后缀构成新类型 子类型——
图 5.2 类型构成
(1) 基类型:最基本的类型称为基类型 。 基类型的名称定义为其描述的缩写,通常为 1~ 2个字符 。 有些常用的基类型有约定的用法,如:
n:整形数据,如 C语言中的 int;
sz:以零结束的字符串 ( C语言中以?'\0'?结束的字符串 ) ;
f,标志 ( flag) 。
(2) 加类型前缀构成的类型:在基类型前加上类型前缀就构成一个新的类型 。 常用的类型前缀有:
p:指针,例如 pc表示指向字符型数据的指针类型;
c:计数 ( count) ;
i:数组下标;
d:偏移量。
(3) 加后缀构成新类型 —— 子类型:在基类型后面加上一个或两个小写英文字母作为对基类型的进一步规定 。 例如,x表示坐标类型,xi表示以英寸计的坐标类型 。
如果通过加上类型前缀或后缀的方法所构成的类型表达式变得很长,则应该定义一个新的基类型 。
匈牙利命名规则中的限定词可以使用完整的英文单词。必要时也可以使用英文单词的缩写或者将多个英文单词连起来使用
(每个单词的第一个字母采用大写)。例如上面例子中的
hWndParent,其中 Wnd为英文 Window的缩写。常用的一些缩写限定词如:
Temp( 或 Tmp,T) 表示临时变量
Prev( 或 Prv) 前一个 ( Previous)
Next 下一个
Dest 目标
Src 源限定词也可以使用数字,有时也可以是空白 。
选择限定词应该遵循以下几条原则:
(1) 对于布尔变量,限定词应描述其值为,真,时的情形,以便于阅读程序 。 例如,fOpen表示文件打开是否成功,则下面的程序片断在阅读时更易于理解:
if(fOpen){
… /*文件打开成功执行的操作 */
}
else{
… /*文件打开失败执行的操作 */
}
换一个相反的限定词 Fail,读者可以体会一下其中的区别 。
(2) 对于枚举集合中的值,逐一描述其元素。例如,一个表示颜色的枚举类型,用 co表示类型,该类型的常量元素可以命名为 coRed、
coGreen等。微软公司在 Windows中,常量一般采用大写英文字母表示。例如 Windows消息常量,均以 WM_开始( Windows Message的缩写),后面跟表示该常量含义的限定词,如 WM_ACTIVATE表示窗口被激活的消息,WM_CHAR表示键盘输入消息。
(3) 在与其它类型有关的情况下,也可以用该,其它类型,作为限定词,此时要将其第一个字母大写 。
在使用匈牙利命名规则时应注意,有些程序设计语言允许的标识符长度较短,此时限定词应注意采用缩写 。 另外,特别要注意的是,有些程序设计语言,如 FoxBASE等,当变量名长度超出规定的长度时,将超出部分截断而不给出任何警告信息,往往会将不同的变量名当作同一个变量 。
子程序或函数的命名方法可以参照变量命名方法 。 函数名可由三个部分构成:
函数名 =<类型 ><作用 ><参数 >
以上三个部分每一部分均可为空;每一部分的每一个单词均以大写字母开头 。 完整列出三个部分往往会使函数名或子程序名变得很长,造成使用上的不便 。 如果参数个数很多,可列出主要的一个或多个参数 。 微软公司的 Windows API函数名称通常只有 <
作用 >部分,例如上面例子中的 CreateWindow。 目前常用的高级语言如 C++,PASCAL对函数的调用形式的检查一般比较严格,参数或类型使用错误大部分可由编译器检查出来,特别是目前一些开发工具,如 Delphi,Visual C++等还可以在源程序输入时实时给出函数原型的提示,因此在函数名中包含类型或参数信息意义不大 。
5.2.4 语句构造模块设计阶段确定了模块内部的逻辑结构,编码阶段则根据程序的逻辑结构构造语句。构造语句应该遵守以下原则:
(1) 语句应该简单而直接,不要为了提高效率而使程序变得复杂或难以理解 。
早期的计算机存储空间和机时往往十分昂贵,程序员往往为了减少程序运行时所占用的存储空间和运行时间而使用一些编程技巧,使程序变得难以理解 。 请看下面的 C程序片断:
a=a-b;
b=a+b;
a=b-a;
上面三行 C语言程序实现了变量 a,b值的交换,省去了使用中间变量,程序的功能变得很不直观,难以理解 。 通常交换变量可采用中间变量实现:
c=a;
a=b;
b=c;
随着计算机硬件价格的下降,效率的重要性在很多时候不再是第一位,而随着软件规模的扩大,程序的可读性成为衡量软件质量的一个极其重要的因素。对程序效率的追求,主要依靠好的设计和优秀的算法来达到,而不能希望从语句的改进方面获得很大的提高。
(2) 不要为了节省空间而将多条语句写成一行 。
将多条语句放在一行并不能使软件的可执行代码减小,反而会降低程序的可读性。
(3) 尽量避免复杂的条件测试 。
复杂的条件表达式不仅影响程序的可读性,而且不易测试,
难以保证其正确性 。
(4) 尽量减少,非,条件的测试 。
“非”条件的测试往往会引起阅读上的困难。在使用“非”
条件测试时应注意条件表达式中变量或函数名限定词的选择应遵守 5.2.3节中布尔变量限定词的命名原则。下面是 C语言中的一个条件语句的例子:
if(!strcmp(s1,s2))
这种写法在 C语言中代码效率较高,因而在一定的范围内流行很广,可是它的风格很差 。 如果两个字符串相等,那么返回真 。 但是,!” 的使用则表明不相等的时候才执行 if 后面的语句 。 这个问题可以通过宏定义来解决:
#define Streq(s1,s2) (strcmp((s1),(s2)) == 0)
现在上面的条件语句可改写为:
if(Streq(s1,s2))
虽然程序代码的效率较低,但程序变得易于阅读理解。
(5) 避免大量使用循环嵌套和条件嵌套 。
大量的嵌套使程序的逻辑变得很复杂,不易理解 。 另外要注意在使用嵌套时应使用 begin… end( PASCAL语言 ),花括号 ( C语言 ) 等将同一层次的语句标识出来,防止二义性 。 例如,下面的 C语言程序结构片断:
if(条件表达式 1){
if(条件表达式 2)
语句 1
}
else
语句 2
(6) 利用括号使逻辑表达式和算术表达式的运算次序直观清晰 。
一些程序设计语言运算符的结合性和优先性很复杂,
难以记忆,即使你能够保证它的正确性,也应该使用括号使运算顺序更直观清晰。这样做不仅可以使程序更易于他人阅读,而且可以杜绝错误。
(7) 不要为追求效率而使用中间变量 。
有时可以使用中间变量来暂存某些运算结果,减少程序运算的次数,提高程序运行的效率,但中间变量的含义不明确,
在阅读时不易理解 。 例如,下面的程序运算 a=(b-c2)2:
a1=(b-c*c);
a=a1*a1;
这里引进了中间变量 a1暂存 b-c2的值,减少了运算的次数,
但破坏了原来直接了当的表达式,而且分成了两条语句,使程序的易理解性受到了影响 。
(8) 不要用浮点数进行相等比较 。
浮点数在计算机内部表示方法与整形数据不同,它是不精确的 。 使用浮点数进行相等比较往往不能得到预期的结果 。
请看下面的 C语言程序:
main()
{
float i=567,k;
k=i/1000;
printf("%f",k*1000);
}
使用 Turbo C 2.0编译运行上面的程序,输出结果并不是 567.000000,而是 566.999972。
因此在使用有些程序设计语言中的多分支语句时,
应注意不能使用浮点型的表达式。例如 C语言中的
switch语句,虽然 C语言语法允许其后的表达式为浮点类型,但往往不能得到预期的结果。
5.3 实 验 四
5.3.1 实验目的本章主要介绍了常见的应用软件开发工具和编程风格,
安排本次实验的主要目的是要培养良好的编程风格,主要包括以下几个方面的要求:
① 养成在程序中书写注解的习惯;
② 程序的书写格式要规范,熟练使用缩排格式;
③ 使用匈牙利命名规则;
④ 构造简明易懂的程序语句 。
5.3.2 实验内容选择一种熟悉的程序设计语言或开发工具,
编制实验三中各模块的程序代码,也可以另外选择其它的一些程序设计题进行练习。在编写程序时应注意程序设计的风格,然后分别调试各个模块的程序。
5.3.3 实验步骤本次实验分为以下三步:
① 根据实验三所选择的项目,根据小组内其他成员所设计的模块的逻辑结构,编写程序;
② 编译调试程序;
③ 书写实验报告,谈谈按照开发规范编写程序代码的优点。