Delphi源程序格式书写规范Word文档下载推荐.docx
《Delphi源程序格式书写规范Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Delphi源程序格式书写规范Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
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;
正确的用法
=0to10do
begin
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:
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规则:
记录类型名应表达出记录的用途。
如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。
PEmployee=^TEmployee;
TEmployee=record
EmployeeName:
EmployeeRate:
Double;
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:
2.19过程和函数的参数命名
2.19.1建议:
只要可能,同一类型的形参应当归并在一起
procedureFoo(Param1,Param2,Param3:
Param4:
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:
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:
protected
functionGetSomeField:
procedureSetSomeField(Value:
Integer);
public
propertySomeField:
IntegerreadGetSomeFieldwriteSetSomeField;
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’为前缀。
如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。
TFormOverdraftReturn=class(TForm)
Private
FUserName:
FUserCount:
procedureSetUserName(Value:
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建议:
控件实例命名应明确体现其含义和功能,通常增加一些前缀。
控件
范例