Delphi开发代码规范修改.docx

上传人:b****6 文档编号:4279490 上传时间:2022-11-28 格式:DOCX 页数:21 大小:251.68KB
下载 相关 举报
Delphi开发代码规范修改.docx_第1页
第1页 / 共21页
Delphi开发代码规范修改.docx_第2页
第2页 / 共21页
Delphi开发代码规范修改.docx_第3页
第3页 / 共21页
Delphi开发代码规范修改.docx_第4页
第4页 / 共21页
Delphi开发代码规范修改.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Delphi开发代码规范修改.docx

《Delphi开发代码规范修改.docx》由会员分享,可在线阅读,更多相关《Delphi开发代码规范修改.docx(21页珍藏版)》请在冰豆网上搜索。

Delphi开发代码规范修改.docx

Delphi开发代码规范修改

一、源程序书写规范

1.1.通用源代码格式规则

1).缩进

缩进就是每级间有两个空格。

不要在源代码中放置制表符。

通过使用Tools|Environment菜单,在EnvironmentOptions对话框的General页上,不要选中UseTabCharacter和OptionalFill复选框,这样,制表符就不会被保存。

2).边距

边距设置为80个字符。

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

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

代码行上字符串的长度不要超过255个字符,如果超过换行缩短,否则出现编译错误。

3).begin...end语句

begin语句必须单独占一行。

例如:

fori:

=0to10dobegin//错,begin与for在同一行

fori:

=0to10do//对,begin在另外一行中

begin

本规则的一个特殊情况是,当begin为else语句的一部分时,例如:

ifsomestatement=then

begin

 ...

end

elsebegin

 SomeOtherStatement;

end;

注意:

end语句总单独一行。

当begin不为else语句的一部分时,相应的end语句与begin语句的缩进量相同。

1.2.ObjectPascal语句格式语句书写规范与用法

1).括号

在左括号与下一字符之间没有空格。

同样,右括号与前一字符也没有空格。

下面的例子演示了正确与不正确的空格。

CallProc(Aparameter);//错!

CallProc(Aparameter);//正确!

 不要在语句中包含多余的括号。

在源代码中,括号只有在确实需要时才使用。

下面的例子演示了正确与不正确用法:

if(I=42)then//错,括号是多余的

if(I=42)or(J=42)then//正确,必须使用括号

2).保留字和关键字

 ObjectPascal语言的保留字和关键字总是完全的小写。

3).过程和函数

(1).格式

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

例如

procedureThisIsMuchMoreReadableRoutineName;

(2).形参

1、格式

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

procedureFoo(Param1,Param2,Param3:

Imteger;Param4:

string);

2、参数顺序

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

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

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

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

例如:

SomeProc(aPlanet,aContinent,aCountry,aState,aCity).

 有些则例外。

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

(3).常量参数

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

4).变量

(1).局部变量

局部变量用于过程内部,如果需要的话,应当在过程的入口处立即初始化变量。

局部的AnsiString类型的变量自动被初始化为空字符串,局部的接口和dispinterface类型的变量自动被初始化为nil,局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。

(2).全局变量

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

应当把全局变量限制在需要的环境中。

例如,一个全局变量可能只在单元的实现部分是全局的。

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

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

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

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

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

5).类型

(1).大小写规则

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

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

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

下面是一些例子:

var

 MyString:

string;//保留字

 WindowsHandle:

HWND;//Win32API类型

 I:

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

(2).浮点型

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

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

(3).Variant和OleVariant

 一般不建议使用Variant和OleVariant。

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

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

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

6).语句

(1).If语句

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

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

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

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

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

ifCondition1andCondition2andCondition3then

 如果Condition3为False的机会很大,利用短路估算逻辑,我们也可以将Condition3放在最前面:

ifCondition3andCondition1andCondition2then

(2).case语句

(1)概述

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

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

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

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

(2)格式

 case语句遵循一般的缩进和命名规则。

(3).while语句

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

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

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

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

(4).for语句

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

(5).repeat语句

 repeat语句类似于while循环,且遵循同样的规则。

(6).with语句

(1)概述

 with语句应小心使用。

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

例如:

withRecord1,Record2do

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

(2)格式

 with语句也遵循本章关于命名和缩进的规则。

7).结构化异常处理

(1).概述

 凡是分配资源的地方,都必须使用try...finally来保证资源得到释放。

不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。

(2).try...finally的用法

 在可能的情况下,每个资源分配应当与try...finally结构匹配,但有时如果有许多类都需要同时创建,建议使用下述的一个安全方案:

SomeClass1:

=nil;

SomeClass2:

=nil;

try

SomeClass1:

=TSomeClass.Create;

SomeClass2:

=TSomeClass.Create;

 {dosomecode}

finally

 FreeAndNil(SomeClass1);

 FreeAndNil(SomeClass2);

end;

(3).try...except的用法

 如果你希望在发生异常时执行一些任务,可以使用try...except。

通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。

如果要在子句中激活默认的异常处理,可以再次触发异常。

(4).try...except...else的用法

 不鼓励使用带else子句的try...except,因为这将阻塞所有的异常,包括你没有准备处理的异常。

二、命名规范

首先,命名要有一定的意义,表示一定的用途。

2.1.过程(Procedure)与函数(Function)

1).命名

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

函数或过程体由与函数或过程含义相同或相近的英文单词或其缩写组成,但只允许使用其中一种方式(英文/拼音),每个单词的首字符要大写,缩写的要全部大写。

例如:

procedureFormatHardDrive;

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

procedureSetUserName;

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

functionGetUserName:

string;

2).形参

如果合适的话,形参的名称最好以字母A为前缀,输入变量名(参数)的定义使用与此变量相同或相近的英文单词或英文缩写,如果没有可用的英文可使用汉语拼音,当使用单词时单词的首字符要大写,使用缩写或汉语拼音时要全部大写。

例如:

procedureSomeProc(AUserName:

string;AUserAge:

integer);

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

3).命名冲突

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

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

SysUtils.FindClose(SR);

或Windows.FindClose(Handle);

4).注释说明

在函数或过程定义时要简单说明函数或过程的作用;在实现部分前面要以以下格式加注释:

{--------------------------------------------------

名称:

(写此函数名)

作者:

(写程序员名字)

时间:

(写函数建立时间)

功能:

(较详细地描述此函数的功能)

输入:

(列出每一变量的名称、类型及其含义或作用如果一个变量有多个固定的值代表不同作用要分别列出每个值的意义)

输出:

(要说明输出变量的类型、含义,如果输出是一系列固定的值时要说明每个输出值的含义)

日志:

(此为修改日志,在开发时无需书写任何内容,在开发结束后进行修改时要以以下格式书写:

序号、修改人;修改时间;修改内容;修改原因)

--------------------------------------------------}

2.2.变量(Variable)

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

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

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

1).局部变量

 局部变量遵循其他变量的命名规则,除i,j,k外,建议以L开头。

2).全局变量

 建议以G开头。

全局变量使用前应做好初使化工作。

2.3.类型(Type)

1).一般类型

1).枚举型

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

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

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

例如:

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

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

FavoriteSongTypel、FavoriteSongType2等等。

2).构造类型

1).数组类型

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

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

例如:

type

 PCycleArray=^TCycleArray;

 TCycleArray=array[1..100]ofinteger;

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

2).记录类型

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

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

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

例如:

type

 PEmployee=^TEmployee;

 TEmployee=record

   EmployeeName:

string;

   EmployeeRate:

Double;

 end;

3).类类型(Class)

1).命名与格式

 一般的类名前要加字母“T”,如果是接口类那么类名前要加“I”,错误异常类的类名前要加“E”,而类引用类型(Class-referencetype)则要在类名后加“Class”,抽象类一般是在类名前还要加“Custom”。

例如:

type

 TCustomCipher=class(TObject);

 TCipher=class(TCustomCipher);

 ICipher=interface;

 TCipherClass=classofTCustomer

 ECipherException=class(Exception);

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

var

 Customer:

TCustomer;

2).字段

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

 所有字段必须为私有。

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

3).方法

(1)命名与格式

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

(2)静态方法

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

(3)虚拟方法(virtual)与动态方法(dynamic)

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

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

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

(4)抽象方法(abstract)

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

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

(5)属性访问方法

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

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

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

例如:

TSomeClass=class(TObject)

private

FSomeField:

Integer;

protected

functionGetSomeField:

Integer;

procedureSetSomeField(Value:

Integer);

public

propertySomeField:

IntegerreadGetSomeFieldwriteSetSomeField;

end;

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

4).属性

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

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

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

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

4).元件类型

1).元件类型的命名标准

 元件的命名与类的命名类似,只不过当它与其它元件名称冲突时,你可以加上3个字符的前缀,用以标识公司、个人或其他实体。

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

TddgClock=class(TComponent)

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

2).元件实例的命名规则

元件实例名包括两个部分:

前缀和性质标识名。

(1).元件的前缀

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

参见下面表中的元件前缀:

元件类名

元件前缀

TActionList,TAction表示动作的列表项

act

TButton,TSpeedButton,TBitBtn等所有的按钮类

btn

TCheckBox,TDBCheckBox等所有的检查框

chk

TRadioButton单选按钮类

rdo

TToolBar工具条

tb

TMainMenu所有的主菜单类

mm

TMainMenuItem所有的菜单项类

mi

TPopupMenu所有的弹出式菜单类

pm

TPopupMenuItem所有的弹出式菜单项类

pmi

TLabel,TStaticText等所有用来显示的标签类

lbl

TPanel等所有的面板类

pnl

TPageControl等所有的页式控件类

pgc

TEdit,TMaskEdit等所有的单行编辑框类

edt

TMemo,TRichEdit等所有的多行编辑框类

mmo

TDrawGrid,TStringGrid等所有的网格类

grd

TAnimate等所有的动画类

ani

TImageList等所有的图片列表类

il

TImage等图片类

img

TChart图表类

cht

TComboBox,TDBComboBox等所有的下拉式列表框类

cbo

TListBox,TDBList等所有的列表框类

lst

TTreeView

tv

TListView

lv

THotKey

hk

TSplitter等所有的分隔符类

spt

TOpenDialog等所有的对话框元件类

dlg

TTable等所有的数据表类

tbl

TQuery等所有的SQL查询类元件

qry

TClientDataSet所有的客户数据集元件

cds

TDataSource

ds

TDatabase

db

TSockConnection,TDCOMConnection等连接元件类

con

TQuickRep,TFastReport等所有的报表元件类

rpt

TDDEClientConv,TDDEClientItem等所有的DDE元件类

dde

TMonthCalendar等所有的日历类

cal

TGroupBox等控件类

grp

 如上所示,元件类型前缀是从分析描述元件的类型性质而来的。

通常情况下,下面的规则描述如何定义一个元件类型前缀:

从元件类型名中移去T前缀。

例如TButton变成Button。

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

例如,Button变成bttn,Edit变成edt。

压缩双字母。

例如,bttn变成btn。

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

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

不过,上述规则首先得保证前缀名称必须符合习惯,做到见名知意,如:

TDDEClientConv控件的前缀就是一个例外。

注意:

元件的前缀是为了表示出元件的类型,是按钮,还是标签等等,因此没有必要为每一个特别元件类建立一个元件前缀,如:

TMyButton的元件前缀仍为btn。

(2).元件性质标识名

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

例如,一个用于关闭窗体的TButton元件实例可命名为btnClose。

一个编辑姓名的元件实例可命名为edtName。

5).窗体与对话框类型

1).窗体类型的命名标准

 如果是窗体要加“Tfrm”前缀,如果是对话框要加“Tdlg”,后跟描述性名。

例如,About窗体类型名称为:

TfrmAbout=class(TForm)

主窗体的类型名称为:

TfrmMain=class(TForm)

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

TfrmCustomerEntry=class(TForm)

登陆对话框的类型名称为:

TdlgLogin=class(TForm)

2).窗体实例的命名标准

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

例如,前面提到的窗体类型与实例的名称为:

类型名

实例名

TfrmAbout

frmAbout

TfrmMain

frmMain

TfrmCustomerEntry

frmCustomerEntry

TdlgLogin

dlgLogin

3).自动创建的窗体

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

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

更进一步信息,请参阅后面几节。

4).模式窗体实例化函数

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

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

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

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

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

请看前面的内容。

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

UnituFrmUserData;

Interface

Uses

 Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,

 Dialogs,StdCtrls;

Type

 TfrmUserData=class(TForm)

   edtUserName:

TEdit;

   edtUserID:

TEdit;

 private

 {Privatedeclarations}

 public

 {Publicdeclarations}

 end;

functionGetUserData(varaUserName:

String;varaUserID:

Integer):

Word;

implementation

{$R*.DFM}

functionGetUserData(varaUserName:

String;varaUserID:

Integer):

Word;

var

 

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

当前位置:首页 > 考试认证 > 从业资格考试

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

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