当前位置:编程学习 > Delphi >>

delphi代码标准文档(2)

 

5). 类型
(1). 大小写规则
 类型标识符是保留字,应当全部小写。Win32 API 类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。对于其他变量名,第一个字母应大写,其他字母则大小写交错。下面是一些例子:

var
 MyString: string; // 保留字
 WindowsHandle: HWND; // Win32 API 类型
 I: Integer; //在System单元中引入的类型标识

(2). 浮点型
 不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下,对于浮点数应当使用Double。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写DLL),则应当使用Single。

(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语句代替。如果多于5级,不要使用if语句。请改用更清楚的方法。不要在if语句中使用多余的括号。

 如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:

if Condition1 and Condition2 and Condition3 then

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

if Condition3 and Condition1 and Condition2 then

(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语句中使用多个对象或记录。例如:

with Record1,Record2 do

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

(2) 格式
 with语句也遵循本章关于命名和缩进的规则。

7). 结构化异常处理
(1). 概述
 异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用try...finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。

(2). try...finally的用法
 在可能的情况下,每个资源分配应当与try...finally结构匹配,例如,下面代码可能导致错误:

SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
 { do some code }
finally
 SomeClass1.Free;
 SomeClass2.Free;
end;

 上述资源分配的一个安全方案是:

SomeClass1 := TSomeClass.Create;
try
 SomeClass2 := TSomeClass.Create;
 try
   { do some code }
 finally
   SomeClass2.Free;
 end;
finally
 SomeClass1.Free;
end;

(3). try...except的用法
 如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。

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

3.命名规范
3.1.过程(Procedure)与函数(Function)
1).命名
 过程与函数名应当有意义。进行一个动作的过程最好在名称前加上表示动作的动词为前缀。例如:

procedure FormatHardDrive;

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

procedure SetUserName;

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

function GetUserName:string;

2).形参
 所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母a 为前缀,例如:

procedure SomeProc(aUserName:string; aUserAge:integer);

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

3).命名冲突
 当两个单元中含有相同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程。为避免这种情况,可在方法名前加想要的单元名,例如:

SysUtils.FindClose(SR);

或Windows.FindClose(Handle);

3.2.变量(Variable)
 变量的名称应当能够表达出它的用途。循环控制变量常常为单个字母,诸如I 、J 或K 。也可以使用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True 和False 值的意义。

1). 局部变量
 局部变量遵循其他变量的命名规则。

2). 全局变量
 全局变量以大写字母“G”打头,并遵循其他变量的命名规则。

3.3.类型(Type)
3.3.1.一般类型
1). 枚举型
 枚举类型名必须代表枚举的用途。名称前要加T字符作为前缀,表示这是个数据类型。枚举类型的标识符列表的前缀应包含2 - 3 个小写字符,来彼此关联。例如:

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

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

3.3.2.构造类型
1). 数组类型
 数组类型名应表达出该数组的用途。类型名必须加字母“T”为前缀。如果要声明一个指向数组类型的指针,则必须加字母P 为前缀,且声明在类型声明之前。例如:

type
 PCycleArray = ^TCycleArray;
 TCycleArray=array[1..100] of integer;

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

2). 记录类型
 记录类型名应表达出记录的用途。类型名必须加字母T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如:

type
 PEmployee = ^TEmployee;
 TEmployee = record
   EmployeeName: string;
   EmployeeRate: Double;
 end;

补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,