Delphi编程代码规范Word下载.docx
- 文档编号:21671350
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:34
- 大小:38.85KB
Delphi编程代码规范Word下载.docx
《Delphi编程代码规范Word下载.docx》由会员分享,可在线阅读,更多相关《Delphi编程代码规范Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
缩进就是每级间有两个空格。
不要在源代码中保存制表符。
这是因为,制表符的宽度随着不同的用户设置和代码管理实用程序(打印、文档及版本控制等)而不同。
通过使用Tools|EditorOptions菜单,在EditorProperties对话框的General页上,不要选中UsetabCharacter和OptimalFill复选框,这样,制表符就不会被保存。
1.2空格
遇到如下情况,需要添加空格:
1)逗号的后面;
2)冒号的后面;
3)等号的前后;
4)赋值号的前后
5)运算符(+、-、*、/)的前后。
1.3边距
边距设置为80个字符。
源代码一般不会因写一个单词而超过边距,但本规则比较灵活。
只要可能,长度超过一行的语句应当用逗号或运算符换行。
换行后,应缩进两个字符。
1.4颜色及文字属性
通过使用Tools|EditorOptions菜单,在EditorProperties对话框的Color页上,设置相应元素的颜色及文字属性。
其中:
注释(Comment):
斜体深绿色
保留字(Reservedword):
粗体天蓝色
字符串(String):
普通洋红色
数值(Number):
普通红色
其他元素取DelphiIDE缺省设置。
end
begin语句必须单独占一行,例如,下面第一行是错误的,而第二行正确:
fori:
=0tol0dobegin//错,begin与for在同一行
=0to10do//对,begin在另外一行中
begin
end;
本规则的一个特殊情况是,当begin为else语句的一部分时,例如:
ifsomestatement=then
...
elsebegin
SomeOtherStatement;
end语句总是单独一行。
当begin不为else语句的一部分时,相应的end语句与begin语句的缩进量相同。
2.OBJECTPASCAL
2.1括号
在左括号与下一个字符之间没有空格。
同样,右括号与前一字符间也没有空格。
下面的例于演示了正确与不正确的空格。
CallProc(AParameter);
//错!
CallProc(AParameter);
//正确!
不要在语句中包含多余的括号。
在源代码中,括号只有在确实需要时才使用。
下面的例子演示了正确与不正确用法:
if(i=42)then//错,括号是多余的
if(i=42)or(j=42)then//正确,必须使用括号
2.2保留字和关键字
ObjectPascal语言的保留字和关键字总是全部小写。
2.3过程和函数(例程)
2.3.1命名与格式
■例程名应当以大写字母开始,且大小写交错以增加可读性。
下面是一个不正确的写法:
procedurethisisapoorlyformattedroutinename;
改成这样写就对了:
procedureThisIsMuchMoreReadableRoutineName;
■例程名应当有意义。
进行一个动作的例程最好在名称前加上表示动作的动词为前缀。
例如:
procedureFormatHardDrive;
■设置输入参数值的例程名应当以Set为其前缀,例如:
procedureSetUserName;
■获取数值的例程名应当以Get为其前缀,例如:
functionGetUserName:
string;
2.3.2形参
■格式
只要可能,同一类型的形参应当归并在一起:
procedureFoo(Param1,Param2,Param3:
Integer;
Param4:
string);
■命名
所有形参的名称都应当表达出它的用途。
如果合适的话,形参的名称最好以字母A为前缀,例如:
procedureSomeProc(AuserName:
AuserAge:
integer);
当参数名与类的特性或字段同名时,前缀A就有必要了。
■参数顺序
形参的顺序主要要考虑寄存器调用规则。
最常用的参数应当作为第一个参数,按使用频率依次从左到右排。
输入参数位于输出参数之前。
范围大的参数应当放在范围小的参数之前。
SomeProc(AP1anet,AContinent,ACountry,AState,ACity);
有些则例外。
例如,在事件处理句柄中,TObject类型的Sender参数往往是第一个要传递的参数。
■常量参数
要使记录、数组、短字符串或接口类型的参数不能被例程修改,就应当把形参标以const。
这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。
如果其他类型的参数希望不被例程所修改,也可以标上const。
尽管这对效率没有影响,但这给例程的调用者带来了更多的信息。
■命名冲突
当两个单元中含有相同名称的例程时,如果调用该例程,实际被调用的是uses子句中最后出现的那个单元中的例程。
为避免这种情况,可在方法名前加想要的单元名,例如:
SysUtils.FindClose(SR);
或
Windows.FindClose(Handle)
2.4变量
2.4.1变量的命名与格式
变量的名称应当能够表达出它的用途。
循环控制变量常常为单个字母,诸如I、J或K。
也可以使用更有意义的名称,例如UserIndex。
布尔变量名必须能清楚表示出True和False值的意义。
2.4.2局部变量
局部变量用于例程内部,遵循其他变量的命名规则。
局部变量加前缀l_(循环控制变量除外),如l_UserName。
如果需要的话,应当在例程的入口处立即初始化变量。
局部的AnsiString类型的变量自动被初始化为空字符串,局部的接口和调度接口类型的变量自动被初始化为nil,局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。
2.4.3全局变量
一般不鼓励使用全局变量。
不过,有时候需要用到。
即使如此,也应当把全局变量限制在需要的环境中。
例如,一个全局变量可能只在单元的Implementation部分是全局的。
全局数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用。
全局数据可在声明时直接初始化为一个值。
注意,所有全局变量自动进行零初始化,因此,不要将全局变量初始化为诸如0、nil、’’或Unassigned等空值。
零初始化的全局变量在.EXE文件中不占空间。
零初始化的数据保存在虚拟的数据段中,而虚拟数据段只在应用程序启动时才分配内存。
非零初始化的全局数据则在.EXE文件中占空间。
2.5常量(const)
常量的命名应当能够表达出它的用途。
如果有类别,该类别的所有常量加前缀,前缀为类别缩写的小写字母;
对于文件打开方式(FileOpenModes),定义常量:
fmOpenRead=$0000;
fmOpenWrite=$0001;
如果无类别,常量的前缀为con。
conProductName=‘GBG2000’;
2.6资源串(resourcestring)
如果在模块中有提示信息类的字符串,把该字符串定义为资源串。
资源串的命名应当能够表达出它的用途。
如果有类别,该类别的所有资源串加前缀,前缀为类别缩写的小写字母,同常量定义。
如果无类别,资源串的前缀为rs。
rsFileOpenError=‘文件打开失败!
’;
2.7类型
2.7.1大小写规则
类型标识符是保留字,应当全部小写。
Win32API类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。
对于其他变量名,第一个字母应大写,其他字母则大小写交错。
下面是一些例子:
var
Mytring:
//保留字
WindowsHandle:
HWND;
//Win32API类型
i:
//在System单元中介绍的类型标识
2.7.2浮点型
不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。
通常情况下对于浮点数应当使用Double。
Double可被处理器优化,是IEEE定义的标准的数据格式。
当需要比Double提供的范围更大时,可以使用Extend。
Extend是Intel专用的类型,Java不支持。
当浮点变量的物理字节数很重要时(可能使用其他语言编写的DLL),则应当使用Single。
2.7.3枚举型
枚举类型名必须代表枚举的用途。
名称前要加T字符作为前缀,表示这是个数据类型。
枚举类型的标识符列表的前缀应包含2~3个小写字符,来彼此关联。
TSongType=(stRock,stClassical,stCountry,stAlternative,stHeavyMeta1,stRB);
枚举类型的变量实例的名称与类型相同,但没有前缀T,除非为了给变量一个更加特殊的名称,诸如FavoriteSongType1、FavoriteSongType2等。
2.7.4Variant和OleVariant
一般不建议使用Variant和OleVariant。
但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用程序中),这两个类型对编程就有必要。
当进行诸如Automation、ActiveX控件的COM编程时,应当使用0leVariant;
而对于非COM编程,则应当使用Variant。
这是因为,Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。
2.8构造类型
2.8.1数组类型
数组类型名应表达出该数组的用途。
类型名必须加字母T为前缀。
如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且声明在类型声明之前。
type
PCycleArray=^TCycleArray;
TCycleArray=array[1..100]ofinteger;
实际上,数组类型的变量实例与类型名称相同,但没有T前缀。
2.8.2记录类型
记录类型名应表达出记录的用途。
如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。
PEmployee=^TEmployee;
TEmployee=record
EmployeeName:
EmployeeRate:
Double;
2.9语句
2.9.1if语句
在if/then/else语句中,最有可能执行的情况应放在then子句中,不太可能的情况放在else子句中。
为了避免出现许多if语句,可以使用case语句代替。
如果多于5级,不要使用if语句。
请改用更清楚的方法。
不要在if语句中使用多余的括号。
如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。
这样,可以使代码充分利用编译器的短路估算逻辑。
例如,如果Conditionl比Condition2快,Condition2比Condition3快,则if语句应这样构造:
ifCondition1andCondition2andCondition3then
如果无else子句且执行语句只有一句,该执行语句写在then后,例如:
ifConditionthendosomething;
2.9.2case语句
■概述
case语句中每种情况常量应当按数字或字母的顺序排列。
每种情况的动作语句应当简短且通常不超过4~5行代码。
如果动作太复杂,应将代码单独放在一个过程或函数中。
case语句的else子句只用于默认情况或错误检测。
case语句遵循其他一般的缩进和命名规则。
2.9.3while语句
建议不要使用Exit过程来退出whi1e循环。
如果需要的话,应当使用循环条件退出循环。
所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。
2.9.4for语句
如果循环次数是确定的,应当用for语句代替while语句。
2.9.5repeat语句
repeat语句类似于while循环,且遵循同样的规则。
2.9.6with语句
with语句应小心使用。
要避免过度使with语句,尤其是在with语句中使用多个对象或记录。
withRecord1,Record2do
这些情况很容易迷惑编程人员,且导致检测bug困难。
with语句也遵循本章关于命名和缩进的规则。
2.10结构化异常处理
2.10.1概述
异常处理主要用于纠正错误和保护资源。
这意味着,凡是分配资源的地方,都必须使用:
try…finally来保证资源得到释放。
不过,如果是在单元的initialization/finalization部分或者对象的构造/析构中来分配/释放资源则例外。
2.10.2try…final1y的用法
可能的情况,每个资源分配应当与:
try…finally结构匹配。
例如,下面代码可能导致错误:
SomeClassl:
=TSomeClass.Create;
SomeClass2:
try
{dosomecode}
finally
SomeClass1.Free;
SomeClass2.Free;
上述资源分配的一个安全途径是:
SomeClass1:
2.10.3try…except的用法
如果您希望在发生异常时执行一些任务,可以使用try…except。
通常,没有必要为了简单地显示一个错误信息而使用try…except,因为Application对象能够自动根据上下文做到这一点。
如果要在except子句中激活默认的异常处理,可以再次触发异常。
2.10.4try…except…else的用法
不鼓励使用带else子句的try…except,因为这将阻塞所有的异常,包括您没有准备的异常。
2.11类
2.11.1命名与格式
类的名称应当表达出类的用途。
类名前要加字母T,表示它是一个类型。
TCustomer=class(TObject);
类的实例名称与类名相同,只不过没有前缀T。
Customer:
TCustomer;
注意:
关于元件的命名,请参阅“元件类型命名标准”部分。
2.11.2字段
■命名与格式
字段的命名遵循与变量相同的规则,只不过要加前缀F,表示这是字段。
■可见性
所有字段必须为私有。
如果要在类的作用域之外访问字段,可借助于类的特性来实现。
2.11.3方法
方法的命名遵循与过程和函数相同的规则。
■静态方法
当您不希望一个方法被派生类重载时,应当使用静态方法。
■虚拟方法与动态方法
当您希望一个方法能被派生类重载,应当使用虚拟方法。
如果类的方法要被多个派生类直接或间接地使用,则应当用动态方法。
例如,某一个类含有一个被频繁重载的方法,并有100个派生类,则应将方法定义为动态的,这样,可以减少内存的开销。
■抽象方法
如果一个类要创建实例,则不要使用抽象方法。
抽象方法只能在那些从不创建实例的基类中使用。
■特性访问方法
所有特性访问方法应当定义在类的私有或保护部分。
特性访问方法遵循与过程和函数相同的规则。
用于读的方法应当加Get前缀,用于写的方法应当加Set前缀,并且有一个叫Value的参数,其类型与特性的类型相同。
TSomeClass=class(TObject);
private
FSomeField:
protected
functionGetSomeField:
procedureSetSomeField(Value:
Integer);
public
propertySomeField:
IntegerreadGetSomeFieldwriteSetSomeField;
end;
2.11.4特性
特性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。
特性名应为名词,而不是动词。
特性是数据,而方法是动作。
数组特性名应当是复数,而一般的特性应当是单数。
2.11.5访问方法的使用
尽管不是必须,但还是建议您使用写访问方法来访问代表私有字段的特性。
3.文件
3.1项目文件
项目文件的名称应当具有描述意义。
例如,“TheDelphi4Developer’sGuideBugManager”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。
3.2Form文件
Form文件的名称应当表达出Form的用途,且具有Frm后缀。
例如,About的文件名叫AboutFrm,主Form的文件名叫MainFrm。
3.3数据模块文件
数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。
例如,Customers数据模块的文件名叫CustomersDM.dfm。
3.4远程数据模块文件
远程数据模块文件的名称应当表达出远程数据模块的用途。
名称后要加RDM后缀。
例如,Customers远程数据模块的文件叫CustomersRDM.dfm。
3.5单元文件
3.5.1普通单元的结构
■单元名
单元的名称应当有描述性。
例如,应用程序的主Form单元叫MainFrm.pas。
■Uses子句
Interface部分的Uses子句应当只包含该部分需要的单元。
不要包含可能由Delphi自动添加的单元名。
Implementation部分的Uses子句应当只包含在该部分需要的单元,不要有多余的单元。
■Interface部分
Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。
而且,这些声明应当在Implementation部分之前。
■Implementation部分
Implementation部分包括本单元私有的类型、变量、过程与函数的声明。
■Initialization部分
不要在单元的Initialization部分放置花费时间很多的代码。
否则,将导致应用程序启动时显得很慢。
■Finalization部分
确保释放所有在Initialization部分中分配的资源。
3.5.2Form单元
Form单元文件的名称与相应的Form名称相同。
About的单元名称叫AboutFrm.pas。
主From的单元文件名称叫为MainFrm.pas。
3.5.3数据模块单元
数据模块单元文件的名称与相应的数据模块名称相同。
例如,Customers数据模单元的名称叫CustomersDM.pas。
3.5.4通用的单元
通用单元的名称应当表达出它的用途。
例如,一个实用工具单元的名称叫ugUtilities.pas,包含全局变量的单元名称叫CustomerGlobals.pas。
注意,一个项目中单元名称必须是唯一的。
3.5.5元件单元
元件单元应放在单独的路径中,以区别于定义元件的单元。
它们一般与项目不放在同一路径下。
单元文件名称应表达出其内容。
注意,有关元件命名标准的更多信息,请参阅“自定义元件”部分。
3.6文件头
所有源文件和项目文件都应具有文件头。
一个正确的文件头应包含以下信息:
//////////////////////////////////////////////////////////////////////(80chars)//创建:
Tujh010618(创建信息:
创建者、创建日期)
//版权:
迈特安(版权)
//功能:
(本文件的主要功能)
//函数:
(主要函数和过程;
可省)
//////////////////////////////////////////////////////////////////////
3.7函数或过程头格式如下
//创建:
……(本函数或过程的主要功能)
//参数:
Param1-……
//Param2-(out)……(out表示输出参数)
//返回:
……(类型、值)
//说明:
……(备注信息、调用方法、初始化数值等)
4.Form与数据模块
4.1Form
4.1.1Form类型的命名标准
Form类型的名称应当表达出Form的用途,且要加T为前缀,后跟描述性名,最后是Form。
例如,About的类型名称为:
TAboutForm=class(TForm)
主frm的类型名称为:
TMainForm=class(TForm)
客户登录Form的类型名称为:
TCustomerEntryForm=class(TForm)
4.1.2Form实例的命名标准
Form实例的名称与相应的类型名称相同,但没有前缀T。
例如,前面提到的Form类与Form实例的名称为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 编程 代码 规范