Delphi源程序格式书写规范.docx

上传人:b****5 文档编号:6217389 上传时间:2023-01-04 格式:DOCX 页数:14 大小:25.07KB
下载 相关 举报
Delphi源程序格式书写规范.docx_第1页
第1页 / 共14页
Delphi源程序格式书写规范.docx_第2页
第2页 / 共14页
Delphi源程序格式书写规范.docx_第3页
第3页 / 共14页
Delphi源程序格式书写规范.docx_第4页
第4页 / 共14页
Delphi源程序格式书写规范.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Delphi源程序格式书写规范.docx

《Delphi源程序格式书写规范.docx》由会员分享,可在线阅读,更多相关《Delphi源程序格式书写规范.docx(14页珍藏版)》请在冰豆网上搜索。

Delphi源程序格式书写规范.docx

Delphi源程序格式书写规范

Delphi语言编码规范

1总则

1.1目标

为了使软件开发人员在项目开发中统一编码行为和风格,从而有利于软件项目的健康发展,特制订本规范。

本规范的最终目的是统一软件信息表达方式,使他们在编程时有一致格式可遵循,便于软件开发中准确地交流信息以及日后的软件测试、维护和升级。

1.2适用范围

本规范规定了以标准Delphi7语言为开发工具的程序员和系统分析员所应遵循的标准和定义.

1.3阅读对象

本文档适用于了解Delphi7语言基本编程规则的程序员或软件工程师。

1.4相关文档

1.5文档变更

版本编号

V0.1

创建时间

2008.4.7

编写人员

顾红卫

文档编码

文档说明

首次创建,由顾红卫负责解释

1.6一致性

凡所有使用Delphi7开发的软件都必须遵循本文档的要求,第三方软件可以有例外。

其中,规则必须遵守,而建议则希望被遵守,如不能遵守,其原因必须作书面记载。

所有对规则的违背都必须有书面记载,并将结果记录到文档讨论区。

2规则和建议

2.1文件目录

2.1.1规则:

项目目录结构

--00Component(所需要控件)

--01Build(编译的文件)

--02Release(可发布的执行文件)

--03Source(源码路径)

--04Test(测试源码)

--ReadMe.TXT(关于本文件夹说明)

2.1.2建议:

每个源码文件夹中建立ReadMe.TXT文件,描述本文件夹中的文件和说明。

2.2项目命名

2.2.1规则:

项目文件必须使用一个有意义的名字。

范例:

Delphi中系统信息的项目文件被命名为SysInfo.dpr。

2.3窗体文件命名

2.3.1规则:

窗体文件名称同窗体的名称相一致,并且使用‘frm’作为前缀。

范例:

Form的名称为frmMain,则Form文件的名称就为frmMain.frm。

2.4数据窗体模块文件命名

2.4.1规则:

数据窗体模块文件的命名应该有意义,并且使用‘dm’作为前缀。

范例:

用户datamodule被命名为‘dmCustomer.dfm’。

2.5远程数据窗体模块文件命名

2.5.1规则:

远程数据模块文件的命名应该有意义,并且使用‘rdm’作为前缀。

范例:

用户remotedatamodule被命名为‘rdmCustomer.dfm’。

2.6单元文件命名

2.6.1规则:

单元文件的命名应该有意义,并且使用‘unt’作为前缀。

范例:

通用unit被命名为‘untGeneral’。

2.7带有窗体单元文件命名

2.7.1规则:

窗体单元文件的名字必须和窗体的名称保持一致。

范例:

主窗体叫frmMain则对应单元文件的名字为untMain。

2.8带有数据窗体模块的单元文件命名

2.8.1规则:

带有数据窗体模块单元文件的名字必须和数据窗体模块文件的名称保持一致。

范例:

主DataModule叫dmMain.pas,则DataModuleUnit文件的名字为untMain。

2.9带有远程数据窗体模块的单元文件命名

2.9.1规则:

带有远程数据窗体模块单元文件的名字必须和远程窗体模块文件的名称保持一致。

范例:

主RemoteDataModule叫rdmMain.pas,则RemoteDataModuleUnit文件的名字为untMain.pas。

2.10注释

2.10.1规则:

在每个文件的开始应加入文件说明,其格式如下:

{******************************************************************************}

{}

{中国金属集团系统GroupMis}

{}

{版权所有(C)2008-中国金属集团}

{}

{******************************************************************************}

2.10.2规则:

在每个类的开始应加入类说明,其格式如下:

{*******************************************************************************

〖项目〗GroupMis

〖模块〗

〖描述〗

〖更新〗

〖TODO〗

*******************************************************************************}

2.10.3规则:

在每一个函数定义的前一行应对此函数的功能、处理过程、输入输出参数作适当的说明,其格式如下:

{*******************************************************************************

〖函数〗

〖功能〗

〖参数〗

〖输出〗

〖更新〗

*******************************************************************************}

2.11缩进

2.11.1规则:

缩进的规则为每一级缩进两个空格,不准许使用Tab。

当遇到begin或进入判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯增加一级;

当遇到end或退出判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯减少一级。

范例:

ifTmpInt<>100then

 TmpInt:

=100;

2.11.2规则:

begin语句和end语句在源程序中要独占一行。

范例:

不正确的用法

forI:

=0to10dobegin

end;

范例:

正确的用法

forI:

=0to10do

begin

end;

2.11.3建议:

不要选中UseTabCharacter和OptimalFill复选框,制表符就不会被保存。

2.12边距

2.12.1建议:

边距设置为80个字符。

只要可能,长度超过一行的语句应当用逗号或运算符换行。

换行后,应缩进两个字符。

2.13空格

2.13.1规则:

在操作符及逻辑判断符号的两端添加空格,添加括号时不需要空格。

范例:

I:

=I+1;

aandb

范例:

错误的用法

if(a>b)then 

范例:

正确的用法

if(a>b)then

范例:

procedureTest(Param1:

Integer;Param3:

string);

2.14保留字

2.14.1规则:

ObjectPascal语言的保留字或关键词应全部使用小写字母。

2.15数据类型

2.15.1规则:

保留字的类型名称必须全部小写,Win32API的类型通常全部大写,对于其它类型则首字母大写,其余字母小写。

范例:

MyString:

string;  

范例:

WindowHandle:

HWND;

范例:

I:

Integer;

2.15.2规则:

避免使用Real类型,尽量使用Double类型。

Real类型只是为了和旧的Pascal代码兼容,Double类型是对处理器和数据总线做过最优化的并且是IEEE定义的标准数据结构。

当数值超出Double的范围时,使用Extended。

Extended不被Jave支持,但使用其它语言编写的DLL时可能会使用Single类型。

2.15.3规则:

枚举类型名必须代表枚举的用途。

名称前要加T字符作为前缀,表示这是个数据类型。

名称要加‘Type’后缀表示这是个枚举类型。

枚举类型的标识符列表的前缀应包含2~3个小写字符,来彼此关联。

范例:

TSongType=(stRock,stClassical,stCountry,stAlternative,stHeavyMetal,stRB);

枚举类型的变量实例的名称与类型相同,但没有前缀T,也可以给变量一个更加特殊名称。

2.15.4建议:

不使用Variant和OleVariant。

当数据类型只有在运行期才知道时(常常是在COM和数据库应用的程序中),这两个类型对编程就有必要。

当进行诸如自动化ActiveX控件的COM编程时,应当使用OleVariant;而对于非COM编程,则应当使用Variant。

这是因为Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。

2.15.5规则:

数组类型名应表达出该数组的用途。

类型名必须加字母T为前缀。

如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且声明在类型声明之前。

范例:

type

PCycleArray=^TCycleArray;

TCycleArray=array[1..100]ofInteger;

2.15.6规则:

记录类型名应表达出记录的用途。

类型名必须加字母T为前缀。

如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。

范例:

type

PEmployee=^TEmployee;

TEmployee=record

EmployeeName:

string;

EmployeeRate:

Double;

end;

2.16类命名及格式

2.16.1规则:

类的命名应该明确体现这个类的本质。

严禁使用不能体现类的本质的命名,诸如MyDialog、MyButton等。

2.16.2规则:

类的名字必须有意义并且类型的名字之前要加前缀‘T’。

范例:

TCustomer=class(TObject)

2.16.3建议:

类实例的名字通常是去掉‘T’的类的名字。

范例:

Customer:

TCustomer;

2.16.4规则:

类名中每一个具有实际意义的单词的首字母应大写。

范例:

classDatabase;

2.16.5规则:

类名中不要使用下划线‘_’。

2.16.6建议:

在类定义中先写方法后写属性;

构造函数、析构函数应放在方法定义的最前面;

其它顺序应根据方法或属性的可见性(private、protected、public)进行排序,即先写private再写protected最后写public。

2.17类中的变量命名及格式

2.17.1规则:

类中的变量的名字必须有意义并且类型的名字之前要加前缀‘F’。

所有的变量必须是私有的。

如果需要从外部访问此变量则需要声明一属性

2.18过程和函数命名及格式

2.18.1规则:

过程和函数的名称应全部使用有意义的单词组成,并且所有单词的第一个字母应该使用大写字母。

范例:

不正确的命名

procedureformatharddisk;

范例:

正确的命名

procedureFormatHardDisk;

2.18.2规则:

设置变量内容的过程和函数,应使用Set作为前缀。

范例:

procedureSetUserName;

2.18.3规则:

读取变量内容的过程和函数,应使用Get作为前缀。

范例:

functionGetUserName:

string;

2.19过程和函数的参数命名

2.19.1建议:

只要可能,同一类型的形参应当归并在一起

范例:

procedureFoo(Param1,Param2,Param3:

Integer;Param4:

string);

范例:

procedureFoo(Param1,Param2,Param3:

Imteger;Param4:

string);

2.19.2规则:

形参的顺序主要要考虑寄存器调用规则。

最常用的参数应当作为第一个参数,按使用频率依次从左到右排。

2.19.3规则:

输入参数位于输出参数之前。

2.19.4建议:

范围大的参数应当放在范围小的参数之前。

范例:

SomeProc(APlanet,AContinent,ACountry,AState,ACity).

2.19.5规则:

所有参数必须是有意义的,并且当参数名称和其它属性名称重了的时候,加一个前缀‘m’。

范例:

procedureSomeProc(mUserName:

string;mUserAge:

integer);

2.20命名冲突

2.20.1规则:

写完整函数或过程的出处

当使用的两个unit中包括一个重名的函数或过程时,那幺当你引用这一函数或过程时,将执行在use子句中后声明的那个unit中的函数或过程。

为了避免这种‘uses-clause-dependent’需要在引用函数或过程时,写完整函数或过程的出处。

范例:

SysUtils.FindClose(SR);

Windows.FindClose(Handle);

2.21属性访问方法

2.21.1规则:

所有的属性访问方法必须出现在private或protected中。

2.21.2规则:

属性访问方法的命名同函数和过程的命名另外读方法(readermethod)必须使用前缀‘Get’;写方法(writermethod)必须使用前缀‘Set’,写方法的参数必须命名为‘Value’,其类型同所要写的属性相一致。

范例:

TSomeClass=class(TObject)

private

FSomeField:

Integer;

protected

functionGetSomeField:

Integer;

procedureSetSomeField(Value:

Integer);

public

propertySomeField:

IntegerreadGetSomeFieldwriteSetSomeField;

end;

2.21.3建议:

方法和函数的命名应明确体现其含义和功能,通常增加一些前缀和后缀。

一些常用的前缀和后缀,如:

前缀

Is(表示是否)

Has(表示有无)

Get(表示得到一个值)

Set(表示设置一个值)

后缀

Max(某实体存在的最大值)

Min(某实体存在的最小值)

Count(一个可计数目的数值)

Key(一个关键值的值)

范例:

IsSystemBusy()

HasNetworkLink()

GetMemCount()

SetSoundMax()

2.22变量命名及格式

2.22.1规则:

所有变量必须起有意义的名字,使其它组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,但每一单词的首字母必须大写。

范例:

WriteFormat:

string;

同时对于一些特定类型可采用一定的简写如下:

类型

简写

指针类型

P

纪录类型

Rec

数组类型

Arr

Class

循环控制变量通常使用单一的字符如:

i,j,或k,另外使用一个有意义的名字也是准许的。

2.22.2规则:

前缀的使用应符合一定的规则。

缩写

类型

描述

举例

ch

Char

b

Boolean

p

Pointer

sn

Shortint

-128..127

mn

Smallint

-32768..32767

n

Longint

-2147483648..2147483647

m

Int64

-2^63..2^63-1

bt

Byte

0..255

w

Word

0..65535

l

Longword

0..4294967295

r

Real48

2.9x10^-39..1.7x10^38

f

Single

1.5x10^-45..3.4x10^38

d

Double

5.0x10^-324..1.7x10^308

ex

Extended

3.6x10^-4951..1.1x10^4932

cm

Comp

-2^63+1..2^63-1

cr

Currency

-922337203685477.5808..922337203685477.5807

ss

ShortString

255characters

s

AnsiString

~2^31

ws

WideString

~2^30

v

Variant

ov

OleVariant

类型缩写可以联合使用。

2.23全局变量

2.23.1规则:

必须使用全局变量则必须加前缀‘g’,同时应在变量名称中体现变量的类型。

尽量不使用全局变量,

范例:

gprecUserCount:

point;名称为UserCount的全局变量,其类型为指向一结构的指针,但是在模块内部可以使用全局变量。

所有模块内全局变量必须用‘F’为前缀。

如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。

范例:

type

 TFormOverdraftReturn=class(TForm)

 Private

FUserName:

string;

FUserCount:

Integer;

procedureSetUserName(Value:

string);

functionGetUserName:

string;

public

propertyUserName:

stringreadGetUserNamewriteSetUserName;

propertyUserCount:

IntegerreadFuserCountwriteFuserCount;

 end;

2.23.2规则:

全局常量必须加前缀‘G’,同时应在变量名称中体现变量的类型。

2.24属性命名及格式

2.24.1规则:

除去前缀‘F’的类的变量的名称相一致。

2.25类操作

2.25.1建议:

为多个构造函数设计一个统一的InitEditControl()函数

为多个构造函数设计一个统一的InitEditControl()函数来初始化所有的类属性。

2.25.2规则:

在类的构造函数中一定要初始化所有的类属性。

2.25.3规则:

在类的构造函数中不要有复杂的操作,一定要保证构造函数中的操作不会出错。

构造函数本身不能返回错误。

2.25.4建议:

一个操作,即成员函数的代码最好不超过一页。

成员函数的操作不能过于复杂

2.26if语句

2.26.1建议:

在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。

为了避免出现许多if语句,可以使用case语句代替。

2.26.2建议:

如果多于5级,不要使用if语句。

2.26.3建议:

不要在if语句中使用多余的括号。

2.26.4建议:

如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。

这样,可以使代码充分利用编译器的短路估算逻辑。

范例:

如果Condition1比Condition2快,Condition2比Condition3快,则if语句应这样构造:

ifConditior1andCondition2andCondition3then

2.26.5建议:

在写if语句的条件时,如果是变量和常量的比较关系,最好常量放在前面。

范例:

if(FILE_NOT_FOUND=errorNum)then

2.27case语句

2.27.1建议:

每种情况的动作语句应当简短且通常不超过4~5行代码。

如果动作太复杂,应将代码单独放在一个过程或函数中。

case语句中每种情况的常量应当按数字或字母的顺序排列。

Case语句的else子句只用于默认情况或错误检测。

2.28while语句

2.28.1建议:

不要使用Exit过程来退出while循环。

如果需要的话,应当使用循环条件退出循环。

所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。

任何业务的辅助工作都应在循环后立即进行。

2.29for语句

2.29.1建议:

如果循环次数是确定的,应当用for语句代替while语句。

2.29.2repeat语句

2.29.3建议:

不要使用Exit过程来退出repeat循环。

如果需要的话,应当使用循环条件退出循环。

所有对repeat循环进行初始化的代码应当位于repeat入口前,且不要被无关的语句隔开。

任何业务的辅助工作都应在循环后立即进行。

2.30with语句

2.30.1建议:

with语句应小心使用。

要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。

范例:

withRecord1,Record2do

这些情况很容易迷惑编程人员,且导致调试困难。

2.31结构化异常处理

2.32单元文件

2.32.1建议:

不要在Initialization部分放置花费时间很多的代码。

否则,将导致应用程序启动时显得很慢。

2.32.2建议:

确保释放所有在Initialization部分中分配的资源。

2.33包

2.34组件

2.35控件实例的命名

2.35.1建议:

控件实例命名应明确体现其含义和功能,通常增加一些前缀。

前缀

控件

范例

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1