码充分利用编译器的短路估算逻辑。例如,如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:
if Condition1 and Condition2 and Condition3 then
如果Condition3为False的机会很大,利用短路估算逻辑,我们也可以将Condition3放在最前面:if Condition3 and Condition1 and Condition2 then
□ Case语句
case语句中每种情况的常量应当按数字或字母的顺序排列。每种情况的动作语句应当简短且通常不超过4 - 5 行代码。如果动作太复杂,应将代码单独放在一
个过程或函数中。Case语句的else子句只用于默认情况或错误检测。
case语句遵循一般的缩进和命名规则。
□ While语句
建议不要使用Exit过程来退出while循环。如果需要的话,应当使用循环条件退出循环。所有对while循环进行初始化的代码应当位于while入口前,且不要被无关的语句隔开。任何业务的辅助
工作都应在循环后立即进行。
□ For语句
如果循环次数是确定的,应当用for语句代替while语句。
□ Repeat语句
repeat语句类似于while循环,且遵循同样的规则。
□ With语句
with语句应小心使用。要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。例如:with Record1,Record2 do这些情况很容易迷惑编程人员,且导致调试困难。
with语句也遵循本章关于命名和缩进的规则。
2.2.7结构化异常处理
□ 概述
异常处理主要用于纠正错误和保护资源。这意味着,凡是分配资源的地方,都必须使用try...finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。
□ 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;
□ try...except的用法
如果你希望在发生异常时执行一些任务,可以使用try...except。通常,没有必要为了简单地显示一个错误信息而使用try...except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。
□ try...except...else的用法
不鼓励使用带else子句的try...except,因为这将阻塞所有的异常,包括你没有准备处理的异常。
3命名规范
3.1过程(Procedure)与函数(Function)
3.1.1命名
过程与函数名应当有意义。进行一个动作的过程最好在名称前加上表示动作的动词为前缀。例如:
procedure FormatHardDrive;
设置输入参数值的过程名应当以Set 为其前缀,例如:
procedure SetUserName;
获取数值的过程名应当以Get 为其前缀,例如:
function GetUserName:string;
3.1.2形参
所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母a 为前缀,例如:
procedure SomeProc(aUserName:string; aUserAge:integer);
当参数名与类的特性或字段同名时,前缀a 就有必要了。
3.1.3命名冲突
当两个单元中含有相
同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程。为避免这种情况,可在方法名前加想要的单元名,例如:
SysUtils.FindClose(SR);或Windows.FindClose(Handle);
3.2变量(Variable)<