Delphi编码标准.docx

上传人:b****9 文档编号:26069714 上传时间:2023-06-17 格式:DOCX 页数:15 大小:21.80KB
下载 相关 举报
Delphi编码标准.docx_第1页
第1页 / 共15页
Delphi编码标准.docx_第2页
第2页 / 共15页
Delphi编码标准.docx_第3页
第3页 / 共15页
Delphi编码标准.docx_第4页
第4页 / 共15页
Delphi编码标准.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Delphi编码标准.docx

《Delphi编码标准.docx》由会员分享,可在线阅读,更多相关《Delphi编码标准.docx(15页珍藏版)》请在冰豆网上搜索。

Delphi编码标准.docx

Delphi编码标准

目录

一、文件命名2

1、项目文件2

2、窗体文件2

3、数据模块文件2

4、远程数据模块文件2

5、单元文件3

6、窗体单元3

7、数据模块单元3

8、通用的单元3

9、组件单元3

10、文件头4

二、窗体与数据模块命名4

1、窗体类型的命名标准4

2、窗体实例的命名标准4

3、自动创建的窗体4

4、模式窗体实例化函数4

5、数据模块的命名标准6

6、数据模块实例的命名标准6

三、组件命名6

1、组件类型的命名标准6

2、组件单元6

3、注册单元6

4、组件实例的命名规则7

四、过程和函数7

五、包命名7

1、运行期包与设计期包7

2、文件命名标准7

一、文件命名

1、项目文件

项目文件的名称应当具有描述意义。

例如:

“TheDelphi5Developer’sGuideBugManager”的项目名称为DDGBugs.dpr一个系统信息程序的名称为SysInfo.dpr。

2、窗体文件

窗体文件的名称应当表达出窗体的用途,且具Frm后缀。

例如:

Student窗体的文件名叫StudentFrm.dfm,

主窗体的文件名叫MainFrm.dfm。

3、数据模块文件

数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。

例如:

Student数据模块的文件名叫StudentDM.dfm。

4、远程数据模块文件

远程数据模块文件的名称应当表达出远程数据模块的用途。

名称后要RDM后缀。

例如:

远程数据模块的文件叫StudentRDM.dfm。

5、单元文件

(1)单元名:

单元的名称应当有描述性。

例如:

应用程序的主窗体单元叫MainFrm.pas。

(2)Uses句子:

Interface部分的Uses子句应当只包含该部分需要的单元。

不要包含可能由Delphi自动添加的单元名。

Implementation部分的Uses子句应当只包含该部分需要的单元,不要有多余的单元。

(3)Interface部分:

Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。

而且,这些声明应当在Implementation部分之前。

(4)Implementation部分:

Implementation部分包括本单元私有的类型、变量、过程与函数的实现。

(5)Initialization部分:

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

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

(6)Finalization部分:

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

6、窗体单元

窗体单元文件的名称与相应的窗体名称相同。

例如:

StudentFrm窗体的单元名称叫StudentFrm.pas。

7、数据模块单元

数据模块单元文件的名称与相应的数据模块名称相同。

例如:

数据模块单元的名称叫StudentDM.pas。

8、通用的单元

通用单元的名称应当表达出它的用途。

例如:

一个控制单元的名称叫Control.pas,包含全局变量的单元名称叫StudentGlobals.pas。

(注意,一个项目中单元名称必须是唯一的。

通用单元名不能重名。

9、组件单元

组件单元应放在单独的路径中,以表明它们是定义组件的单元。

它们一般与项目不放在同一路径下。

单元文件名称应表达出其内容。

10、文件头

所有源文件和项目文件都应具有文件头。

一个正确的文件头应包含以下信息:

{

Copyright@YEARbyAUTHORS

}

二、窗体与数据模块命名

1、窗体类型的命名标准

窗体类型的名称应当表达出窗体的用途,且要加T前缀,后跟描述性名,最后是Form。

例如:

Student窗体类型名称为:

TStudentForm=class(TForm)

用户登录窗体的类型名称为:

TUserEntryForm=class(TForm)

2、窗体实例的命名标准

窗体实例的名称与相应的类型名称相同,但没有前缀T。

例如:

var

StudentForm:

TStudentForm

UserEntryForm:

TUserEntryForm

3、自动创建的窗体

除非特别原因,只有主窗体才自动生成。

其他所有窗体必须从ProjectOptions对话框的自动生成列表中删除。

4、模式窗体实例化函数

所有窗体单元都应当含有实例化函数,用于创建、设置、模式显示和释放窗体。

这个函数将返回由窗体返回的模式结果。

传递给这个函数的参数遵循参数传递的规则。

之所以要这样封装,是为了便于代码的重用和维护。

窗体的变量应当从单元中移走,改在窗体实例化函数中作为局部变量定义(注意,要求从ProjectOptions对话框的自动生成列表中移走该窗体。

请看前面的内容)。

例如,下面的单元文件演示了GetStudent的实例化函数。

UnitStudentFrm;

Interface

Uses

Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;

Type

TStudentForm=class(TForm)

editID:

TEdit;

editName:

TEdit;

private

{Privatedeclarations}

public

{Publicdeclarations}

end;

 

functionGetStudent(varaStudentName:

String;varaStudentID:

Integer):

Word;

 

implementation

 

{$R*.DFM}

 

functionGetStudent(varaStudentName:

String;varaStudentID:

Integer):

Word;

var

StudentForm:

TStudentForm;

begin

StudentForm:

=TStudentForm.Create(Application);

Try

StudentForm.Caption:

='GettingStudent’;

Result:

=StudentForm.ShowModal;

IfResult=mrOKthen

begin

aStudentName:

=StudentForm.editName.Text;

aStudentID:

=StrToInt(StudentForm.editID.Text);

end;

finally

StudentForm.Free;

end;

end;

 

end.

5、数据模块的命名标准

数据模块类型名称应表达出它的用途,且要加前缀T,后跟描述性名称,最后是DataModule。

例如:

Student数据模块的类型名称为TStudentDM=class(TDataModule)

6、数据模块实例的命名标准

数据模块实例的名称应当与相应的类型名称相同,但没有前缀T。

例如:

var

StudentDM:

TStudentDM;

三、组件命名

1、组件类型的命名标准

组件的命名与类的命名类似,只不过它有3个字符的前缀。

这些前缀用以标识公司、个人或其他实体。

(注意,作为前缀的3个字符要小写。

例如,一个时钟组件可以这样声明:

TlxSchool=class(TComponent)

2、组件单元

组件单元只能含有一个主要组件,这是指出现在组件选项板上的组件。

其他辅助性的组件或对象也可以包含在同一单元中。

3、注册单元

组件的注册过程应当从组件单元中移走,放在一个单独的单元中。

这个注册单元用于注册所有组件、属性编辑器、组件编辑器、向导等。

组件注册应当在设计期包中进行。

因此,注册单元应当包含在设计期包而不是运行期包中。

建议注册单元这样命名:

XxxReg.pas。

Xxx为3个字符前缀,以标识公司、个人或其他实体。

例如:

本书中的注册单元命名为LxReg.pas。

4、组件实例的命名规则

组件的名称应当具有描述性。

Delphi没有为组件指定默认的名称。

单元命名要使用一个变更了的匈牙利命名规范。

在这个标准中,组件名包括两个部分:

前缀和性质标识名。

(1)组件的前缀:

组件的前缀多是表现组件类型的字母缩写。

例如:

btn:

TButton

edt:

TEdit

spdbtn:

TSpeedButton

lstbx:

TIistBox

如上所示,组件类型前缀是组件类型名变化而成的。

下面的规则说明如何定义一个组件类型前缀:

1)从组件类型名中移去T前缀。

例如:

TButton变成Button。

2)除了第一个元音,删去所有元音字母。

例如:

Button变成Bttn,Edit变成Edt。

3)压缩双字母。

例如:

Bttn变成Btn。

4)如发生冲突,则在某一组件前缀中加入一个元音。

例如:

在TBatton组件的前缀中加入元音变为batn,以区别TButton的前缀。

(2)组件性质标识名:

组件性质标识名是组件意图的描述。

例如:

一个用于新建窗体的TButton组件可命名为BtnNewForm。

一个编辑学生的组件可命名为EdtStudent。

四、过程和函数

五、包命名

1、运行期包与设计期包

运行期包中应当只包含所需要的单元。

那些属性编辑器和组件编辑器的单元应当放在设计期包中。

注册单元也应当放在设计期包中。

2、文件命名标准

包的命名遵循iiiLibvv.pkg——设计期包和iiiStdvv.pkg——运行期包两种模式。

(注意包名称中的lib或std分别表示这是设计期包还是运行期包。

iii代表一个3字符的前缀,用于标识公司、个人或其他需要标识的事情。

vv代表包的版本号,其中也包含了Delphi的版本号。

例如:

本书中的包是这样命名的:

lxLib70.pkg——设计期包

lxStd70.pkg——运行期包

过程和函数

1.命名与格式

(1)过程名应当以大写字母开始,且大小写交错以增加可读性。

下面是一个不正确的写法:

procedurethisisapoorlyformattedroutinename;

改成这样写就对了:

procedureThisIsMuchMoreReadableRoutineName;

(2)过程名应当有意义。

进行一个动作的例程最好在名称前加上表示动作的动词为前缀。

例如:

procedureFormatHardDrive;

设置输入参数值的例程名应当以Set为其前缀,

例如:

procedureSetUserName;

获取数值的例程名应当以Get为其前缀,

例如:

functionGetUserName:

string;

2.形参

(1)格式:

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

例如:

procedureProcedureName(Param1,Param2,Param3:

Integer;Param4:

string);

(2)命名:

所有形参的名称都应当表达出它的用途。

如果合适的话,形参的名称最好以字母A为前缀。

例如:

procedureProcedureName(AUserName:

string;AUserAge:

integer);

当参数名与类的特性或字段同名时,前缀A就有必要了。

(3)参数顺序:

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

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

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

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

例如:

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

有些则例外。

例如:

在事件处理过程中,TObject类型的Sender参数往往是第一个要传递的参数。

(4)常量参数:

要使记录、数组、短字符串或接口类型的参数不能被例程修改,就应当把形参标以Const。

这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。

如果其他类型的参数希望不被例程所修改,也可以标上Const。

尽管这对效率没有影响,但这给例程的调用者带来了更多的信息。

(5)命名冲突:

当两个单元中含有相同名称的例程时,如果调用该例程,实际被调用的是Uses子句中较后出现的那个单元中的例程。

为避免这种情况,可在方法名前加想要的单元名,

例如:

SysUtils.FindClose(SR);

Windows.FindClose(Handle);

3.变量

(1)变量的命名与格式:

变量的名称应当能够表达出它的用途。

循环控制变量常常为单个字母,诸如I、J或K。

也可以使用更有意义的名称,例如UserIndex;

布尔变量名必须能清楚表示出True和False值的意义。

(2)局部变量:

局部变量用于例程内部,遵循其他变量的命名规则。

如果需要的话,应当在例程的入口处立即初始化变量。

局部的AnsiString类型的变量自动被初始化为空字符串;

局部的接口和dispinterface类型的变量自动被初始化为nil;

局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。

(3)全局变量:

一般不鼓励使用全局变量。

不过,有时候需要用到。

即使如此,也应当把全局变量限制在需要的环境中。

全局变量可能只在单元的实现部分是全局的;

全局数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用;

全局数据可在声明时直接初始化为一个值。

(注意,所有全局变量自动进行零初始化,因此,不要将全局变量初始化为诸如0、nil、或Unassigned等空值。

零初始化的全局变量在.EXE文件中不占空间。

零初始化的数据保存在虚拟的数据段中,而虚拟数据段只在应用程序启动时才分配内存。

非零初始化的全局数据则在.EXE文件中占空间。

4.类型

(1)大小写规则:

类型标识符是保留字,应当全部小写。

Win32API类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。

对于其他变量名,第一个字母应大写,其他字母则大小写交错。

例如:

var

MyString:

string;//保留字

WindowsHandle:

HWND;//Win32API类型

I:

Integer;//在System单元中引入的类型标识

(2)浮点型:

不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。

通常情况下,对于浮点数应当使用Double。

Double可被处理器优化,是IEEE定义的标准的数据格式。

当需要比Double提供的范围更大时,可以使用Extend。

Extend是Intel专用的类型,Java不支持。

当浮点变量的物理字节数很重要时(可能使用其他语言编写DLL),则应当使用Single。

(3)枚举型:

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

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

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

例如:

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

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

FavoriteSongTpe1、FavoriteSongTpe2等等。

(4)Variant和OleVariant:

一般不建议使用Variant和OleVariant。

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

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

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

5.构造类型

(1)数组类型:

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

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

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

例如:

type

PCycleArray=^TCycleArray;

TCycleArray=array[1..100]ofinteger;

实际上,数组类型的变量实例与类型名称相同,但没有T前缀。

(2)记录类型:

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

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

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

例如:

type

PStudent=^TStudent;

TStudent=record

StudentName:

string;

StudentAge:

Double;

6.类

(1)命名与格式

类的名称应当表达出类的用途。

类名前要加字母T,表示它是一个类型。

例如:

type

TStudent=class(TObject);

类的实例名称与类名相同,只不过没有前缀T。

var

Student:

TStudent;

注意关于组件的命名,请参阅6.6节“组件”。

(2)字段

命名与格式:

字段的命名遵循与变量相同的规则,只不过要加前缀F,表示这是字段。

可见性:

所有字段必须为私有。

如果要在类的作用域之外访问字段,可借助于类的属性来实现。

(3)方法

命名与格式:

方法的命名遵循与过程和函数相同的规则。

静态方法:

当你不希望一个方法被派生类覆盖时,应当使用静态方法。

虚拟方法与动态方法:

当你希望一个方法能被派生类覆盖,应当使用虚拟方法。

如果类的方法要被多个派生类直接或间接地使用,则应当用动态方法。

例如:

某一个类含有一个被频繁覆盖的方法,并有100个派生类,则应将方法定义为动态的,这样可以减少内存的开销。

抽象方法:

如果一个类要创建实例,则不要使用抽象方法。

抽象方法只能在那些从不创建实例的基类中使用。

属性访问方法:

所有属性访问方法应当定义在类的私有或保护部分。

属性访问方法遵循与过程和函数相同的规则。

用于读的方法应当加Get前缀,用于写的方法应当加Set前缀,并且有一个叫Value的参数,其类型与属性的类型相同。

例如:

TStudent=class(TObject)

private

FName:

string;

protected

functionGetName:

string;

procedureSetName(Value:

string);

public

propertyName:

stringreadGetNamewriteSetName;

end;

(4)属性

属性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。

属性名应为名词,而不是动词。

属性是数据,而方法是动作。

数组属性名应当是复数,而一般的属性应当是单数。

(5)访问方法的使用

尽管不是必须,但还是建议你使用写访问方法来访问代表私有字段属性。

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

当前位置:首页 > 党团工作 > 党团建设

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

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